3. 配置开发板与构建目标
任务目标
为STM32F4开发板在Zephyr项目中建立board目录,通过menuconfig交互式界面和defconfig文件两种方式定制内核配置,并验证配置生效。
环境准备
需要Zephyr SDK(≥0.16)和已安装的west工具。本案例以stm32f4_disco开发板为蓝本,但使用自定义board名称my_stm32f4,避免与官方board冲突。
实现步骤
1. 创建自定义board目录结构
在Zephyr项目根目录下执行:
mkdir -p boards/arm/my_stm32f4/support
cd boards/arm/my_stm32f4
2. 编写board定义文件
创建my_stm32f4.yaml,声明board基本信息:
identifier: my_stm32f4
name: My STM32F4 Custom Board
type: mcu
arch: arm
toolchain:
- zephyr
ram: 128
flash: 1024
supported:
- gpio
- uart
- spi
- i2c
3. 编写board核心配置与CMake文件
创建my_stm32f4_defconfig,设置基础内核配置:
CONFIG_SOC_STM32F407XX=y
CONFIG_BOARD_MY_STM32F4=y
CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=168000000
CONFIG_SERIAL=y
CONFIG_UART_CONSOLE=y
CONFIG_PRINTK=y
CONFIG_SHELL=n
创建my_stm32f4.dts(最小设备树,仅声明CPU与内存):
/dts-v1/;
#include <st/f4/stm32f407.dtsi>
/ {
model = "My STM32F4 Board";
compatible = "my,stm32f4";
chosen {
zephyr,console = &usart2;
zephyr,sram = &sram0;
zephyr,flash = &flash0;
};
};
&usart2 {
status = "okay";
current-speed = <115200>;
};
创建CMakeLists.txt,指定SOC系列:
set(SOC_SERIES_STM32F4x 1)
include(${ZEPHYR_BASE}/boards/common/arm64.cmake)
include(${ZEPHYR_BASE}/soc/st/stm32/stm32f4x/CMakeLists.txt)
创建Kconfig.board与Kconfig.defconfig:
# Kconfig.board
config BOARD_MY_STM32F4
bool "My STM32F4 Custom Board"
depends on SOC_STM32F407XX
# Kconfig.defconfig
if BOARD_MY_STM32F4
config BOARD
default "my_stm32f4"
endif
4. 使用menuconfig定制配置
在应用目录下(需先有最小prj.conf和CMakeLists.txt),运行:
west build -b my_stm32f4 -t menuconfig
在交互界面中导航至Device Drivers → Serial Drivers,确认UART Console已勾选;进入Kernel → Memory Management,将Main stack size改为2048。保存退出后,运行:
west build -b my_stm32f4
Zephyr会将menuconfig的修改合并到build/zephyr/.config,但不会回写源文件中的defconfig。
5. 通过defconfig固化配置
若希望将menuconfig中的修改永久固化到board的defconfig中,编辑boards/arm/my_stm32f4/my_stm32f4_defconfig,追加:
CONFIG_MAIN_STACK_SIZE=2048
然后删除build目录并重新构建,验证配置是否生效:
rm -rf build
west build -b my_stm32f4
grep MAIN_STACK_SIZE build/zephyr/.config
验证方法
构建成功后,检查以下条件确认配置生效:
west build无报错,生成build/zephyr/zephyr.elf。- 执行
grep CONFIG_MAIN_STACK_SIZE build/zephyr/.config,输出为CONFIG_MAIN_STACK_SIZE=2048。 - 执行
grep CONFIG_UART_CONSOLE build/zephyr/.config,输出为CONFIG_UART_CONSOLE=y。 - 若连接开发板并烧录(
west flash),串口115200波特率下应能看到Zephyr启动日志,说明console配置正确。
常见问题
- menuconfig无法启动:需要先执行一次不带
-t menuconfig的构建,生成初始配置后再运行menuconfig。 - board未找到:确认
boards/arm/my_stm32f4目录位于Zephyr项目根目录(而非应用目录内),且west build -b my_stm32f4在项目根目录下执行。 - defconfig修改不生效:删除build目录后重新构建,Zephyr才会重新读取board的defconfig。
上图展示了两种配置方式的流向:defconfig提供持久化的默认配置,menuconfig提供交互式临时调整,两者最终合并生成.config文件,由构建系统读取并编译。若需将menuconfig中的修改永久保存,需手动回写到defconfig中。