ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Zephyr应用: 09-Overlay

2026/9/29 3:31:33 拓冰建站 浏览量
Zephyr应用: 09-Overlay 摘要:Overlay 是 Zephyr 中不修改板级 DTS 即可定制硬件描述的核心机制。本文讲解 Overlay 的作用、放置位置、常见用法(新增节点、修改属性、添加别名、配置 GPIO/SPI/UART),并厘清 Overlay 与 Kconfig 的分工:Kconfig 决定编译哪些驱动,Overlay 决定驱动对应哪些硬件实例。最后通过两个 STM32 Nucleo-F303RE 实验(修改 USART2 波特率、添加自定义 Alias)演示 Overlay 的调试方法——查看build/zephyr/zephyr.dts与devicetree_generated.h确认生效。09-Overlay(DeviceTree Overlay)这是Zephyr DeviceTree系列中最重要的一课。1. 什么是 Overlay?前一课我们修改的是 Board 自带的 DTS。例如boards/st/nucleo_f303re/nucleo_f303re.dts但是:千万不要去改 SDK 里的 DTS!原因:升级 Zephyr 后全部丢失。所以 Zephyr 提供了app.overlay或者lt;boardgt;.overlay编译时自动叠加进去。例如nucleo_f303re.overlay编译时实际上就是Board DTS + Overlay ↓ 最终 DeviceTree所以 Overlay 可以理解成DeviceTree 的补丁(Patch)2. Overlay 的位置例如:hello_world/ │ ├── src/ ├── CMakeLists.txt ├── prj.conf └── nucleo_f303re.overlay如果编译west build-b nucleo_f303reZephyr 会自动找到nucleo_f303re.overlay无需任何配置。3. Overlay 可以做什么?几乎所有 DeviceTree 修改都可以放进去。例如:增加 LED/{aliases{myled=led0;};};增加 Button/{aliases{mybutton=button0;};};增加 SPI Devicespi1{status="okay";my_sensor@0{compatible="mycompany,my-sensor";reg=lt;0gt;;};};增加 UARTusart2{status="okay";};全部不用修改 Board DTS。4. Overlay 修改已有节点例如:Board DTSusart2{current-speed=lt;115200gt;;};Overlayusart2{current-speed=lt;9600gt;;};最终结果9600Overlay 覆盖原来的属性。5. 新增节点例如:/{mynode{compatible="demo";};};编译后DT_NODELABEL(mynode)即可获得。6. 修改 GPIO例如:gpioa{status="okay";};或者gpioa{myled{gpios=lt;...gt;;};};7. Overlay 最常见用途——添加自己的设备例如:spi1{imu@0{compatible="bosch,bmi270";reg=lt;0gt;;};};驱动里DT_INST_FOREACH_STATUS_OKAY(...)即可找到。所以:Overlay 是 Driver 与 Hardware 的桥梁。8. Overlay 与 Kconfig 的关系很多初学者容易混淆:Kconfig决定编译什么代码例如CONFIG_UART=yCONFIG_SPI=yCONFIG_SENSOR=yOverlay决定硬件长什么样例如SPI1 ↓ 挂了 BMI270因此:Kconfig ↓ Driver 编译Overlay ↓ Driver 实例化两者缺一不可。9. 查看 Overlay 是否生效编译:west build-bnucleo_f303re查看生成文件:build/zephyr/zephyr.dts这里就是:Board DTS + Overlay最终结果。例如搜索:my_sensorgrepmy_sensor build/zephyr/zephyr.dts或者grepcurrent-speed build/zephyr/zephyr.dts下面是 Overlay 从编写到生效的完整流程: