4. 添加板级设备树文件
任务说明
为自定义板卡创建 board.dts 设备树源文件,描述 SoC 型号、内存布局、时钟源以及 UART 外设节点,并确保该文件能被 Zephyr 构建系统正确编译。本案例以 Nordic nRF52840 SoC 为例,但方法适用于任意 Zephyr 支持的 SoC。
前置条件
- 已安装 Zephyr SDK 和 west 工具,版本 ≥ 3.6
- 已创建自定义板卡目录:
zephyr/boards/arm/myboard/ - 已存在最小化的
Kconfig.board和board.cmake(本案例不展开,仅需保证构建系统可识别板卡)
实现步骤
在 zephyr/boards/arm/myboard/ 下创建 myboard.dts 文件。核心思路:通过 #include 引入 SoC 厂商提供的 .dtsi 文件,然后仅覆盖或补充板级特有内容(如内存大小、使能的外设)。这样避免重复定义 SoC 内部结构,同时保持文件精简。
关键完整代码
// myboard.dts - 自定义板卡设备树
/dts-v1/;
#include <nordic/nrf52840_qiaa.dtsi>
/ {
model = "MyBoard NRF52840";
compatible = "mycompany,myboard";
chosen {
zephyr,console = &uart0;
zephyr,shell-uart = &uart0;
zephyr,sram = &sram0;
zephyr,flash = <&flash0>;
};
// 板载 32MHz 外部晶振(若 SoC .dtsi 已定义可省略)
&clk_xtal {
status = "okay";
};
// 板载 32.768kHz 低速晶振
&clk_lfclk {
status = "okay";
xtal = <32768>;
};
};
// 内存节点:覆盖 SoC .dtsi 中的默认大小
&sram0 {
reg = <0x20000000 0x40000>; // 256 KB SRAM
};
&flash0 {
reg = <0x00000000 0x100000>; // 1 MB Flash
};
// UART0:使能并配置为板载 USB 串口(通过 nRF52840 的 CDC ACM)
&uart0 {
compatible = "nordic,nrf-uarte";
status = "okay";
current-speed = <115200>;
pinctrl-0 = <&uart0_default>;
pinctrl-names = "default";
};
// 引脚控制:UART0 使用 P0.06 (TX) 和 P0.08 (RX)
&pinctrl {
uart0_default: uart0_default_alt {
group1 {
psels = <NRF_PSEL(UART_TX, 0, 6)>,
<NRF_PSEL(UART_RX, 0, 8)>;
};
};
};
编译验证
# 在 Zephyr 根目录下执行
west build -b myboard zephyr/samples/hello_world
# 若构建成功,会生成 build/zephyr/zephyr.dts(展开后的完整设备树)
# 检查关键节点是否生效:
grep -A2 "uart0" build/zephyr/zephyr.dts | head -20
通过条件:构建无错误,生成的 zephyr.dts 中包含 uart0 节点且 status = "okay",sram0 大小为 0x40000,flash0 大小为 0x100000。
常见问题
- 找不到 SoC .dtsi:确认
#include路径与dts/arm/nordic/下的文件名一致,且Kconfig.board中config BOARD_MYBOARD已正确 select 对应 SoC 型号。 - 引脚冲突:若 UART 引脚被其他外设占用,编译时 pinctrl 会报错,需调整
psels或禁用冲突外设。 - 内存地址错误:nRF52840 的 SRAM 起始地址固定为
0x20000000,Flash 为0x00000000,不要随意修改。