4. 编写设备树覆盖文件
任务说明
本案例面向基于Zephyr RTOS的IoT开发场景:你有一块自定义开发板,SoC为Nordic nRF52840(或任意Zephyr支持的SoC),板上有一颗LED连接在P0.13引脚,并通过UART0连接调试串口。默认的Zephyr板级设备树中,该GPIO引脚和UART节点可能未启用或引脚分配不匹配。你需要编写一个设备树覆盖文件(overlay),在不修改Zephyr原生板级定义的前提下,启用GPIO和UART0节点,并完成编译验证。
环境准备
需要已安装Zephyr SDK和west工具,并已创建Zephyr工程(含west update完成)。本案例以nrf52840dk_nrf52840作为基础板型,通过overlay覆盖其默认配置。若使用其他板型,只需将板名替换为对应目标即可。
实现步骤
在Zephyr应用工程目录下创建app.overlay文件,内容如下。该文件会被构建系统自动拾取并叠加到板级设备树上。
/* app.overlay */
/ {
chosen {
zephyr,console = &uart0;
zephyr,shell-uart = &uart0;
};
};
&uart0 {
status = "okay";
compatible = "nordic,nrf-uarte";
current-speed = <115200>;
pinctrl-0 = <&uart0_default>;
pinctrl-names = "default";
};
&gpio0 {
status = "okay";
};
/ {
leds {
compatible = "gpio-leds";
led0: led_0 {
gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>;
label = "LED 0";
};
};
};
若你的SoC引脚复用需要额外配置(例如nRF52840的UART RX/TX引脚),需在板级pinmux文件中确认uart0_default引脚的pinctrl节点已存在。上述代码中引用的uart0_default是Zephyr板级定义中已有的pinctrl状态,若你的板型未定义,需在overlay中补充pinctrl节点,但大多数官方板型已包含。
验证编译
在应用目录下执行以下命令进行编译(以nrf52840dk_nrf52840为例):
west build -b nrf52840dk_nrf52840 -d build .
编译通过后,检查生成的设备树二进制是否包含你的覆盖内容:
west build -t menuconfig # 可选,查看配置
# 直接检查编译产物中的设备树
grep -r "led_0\|uart0" build/zephyr/zephyr.dts
预期输出中应能看到led_0节点和uart0的status = "okay"。若编译报错提示节点不存在或引脚冲突,请检查overlay中的外设名称(如uart0、gpio0)是否与你的SoC设备树标签一致。
验证方法
将编译生成的固件烧录到开发板(west flash),连接UART0的TX/RX引脚至USB转串口工具,波特率115200。上电后串口终端应输出Zephyr启动日志(因zephyr,console已指向uart0)。同时,用万用表或示波器测量P0.13引脚,若在应用中调用gpio_pin_set将该引脚拉高,应能测量到高电平。若串口无输出且引脚电平无变化,检查overlay中的引脚号(13)是否与硬件实际连接一致,以及UART的TX/RX引脚是否与板载USB调试器冲突(nRF52840 DK的虚拟串口通常使用特定引脚,需确认你的硬件设计)。
通过条件:编译无错误,生成的zephyr.dts中包含overlay定义的节点,且烧录后串口输出正常、GPIO引脚可控。