Zephyr RTOS设备树实战:GPIO配置
上周帮客户调试一块基于nRF52840的工业传感器板,现象很诡异——GPIO1.13控制的LED死活不亮。用逻辑分析仪抓引脚电平,发现初始化后引脚状态是浮空,而不是预期的推挽输出。查了三天,最后发现是设备树里一个gpio-flags写成了0。这种坑,我猜你迟早也会踩到。
设备树不是玄学,是硬件描述语言
很多刚接触Zephyr的朋友把设备树当成“配置文件”来改,这是最危险的误解。设备树(Devicetree)本质上是硬件拓扑的声明式描述,它告诉Zephyr内核:“这块芯片有哪些外设,它们挂在哪条总线上,引脚怎么连的”。
拿GPIO来说,设备树里定义的不是“我要用哪个引脚”,而是“这个引脚在硬件上是什么角色”。比如LED接在GPIO1.13上,设备树里应该写:
leds { compatible = "gpio-leds"; status = "okay"; sensor_led: led_0 { gpios = <&gpio1 13 GPIO_ACTIVE_HIGH>; label = "Sensor LED"; }; };注意gpios属性里的三个要素:控制器引用(&gpio1)、引脚号(13)、标志位(GPI