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

验证方法

构建成功后,检查以下条件确认配置生效:

  1. west build无报错,生成build/zephyr/zephyr.elf。
  2. 执行grep CONFIG_MAIN_STACK_SIZE build/zephyr/.config,输出为CONFIG_MAIN_STACK_SIZE=2048。
  3. 执行grep CONFIG_UART_CONSOLE build/zephyr/.config,输出为CONFIG_UART_CONSOLE=y。
  4. 若连接开发板并烧录(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。
Zephyr Board配置双路径 my_stm32f4_defconfig 静态配置文件 menuconfig 交互式界面 合并 build/zephyr/.config 实际生效配置 west build 编译生成固件 手动固化 defconfig(持久化) menuconfig(临时修改) .config(最终生效) 构建产物

上图展示了两种配置方式的流向:defconfig提供持久化的默认配置,menuconfig提供交互式临时调整,两者最终合并生成.config文件,由构建系统读取并编译。若需将menuconfig中的修改永久保存,需手动回写到defconfig中。