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,不要随意修改。