Zephyr RTOS设备树实战:时钟配置
从一次诡异的串口乱码说起
去年做一款工业数据采集器,STM32F407主控,外挂一个4G模组。板子打样回来,烧了Zephyr固件,串口打印出来全是乱码——不是那种常见的波特率不对的乱码,而是前几个字节正常,后面突然跳成0xFF,偶尔还夹杂几个正确字符。当时第一反应是硬件问题,拿示波器量TX脚,波形正常。换了个USB转串口模块,问题依旧。
折腾了两天,最后发现是HSE时钟配置错了。设备树里写的是25MHz外部晶振,实际板子上焊的是8MHz。Zephyr的时钟子系统不像裸机开发那样直接改个宏定义就行,它在设备树里层层嵌套,一个参数错了,整个时钟树都歪掉。从那以后,我养成了一个习惯:拿到新板子,第一件事就是拿逻辑分析仪抓系统时钟输出脚,确认实际频率。
设备树里的时钟迷宫
Zephyr的时钟配置藏在设备树里,路径大概长这样:/soc/clocks或者/clocks。不同芯片厂家的写法差异很大,但核心逻辑是一样的——定义时钟源、PLL配置、分频系数。
拿STM32系列举例,设备树里你会看到这样的结构:
clocks { clk_hse: clk-hse { compatible = "st,stm32-hse"; clock-frequency = <8000000>; // 这里写你的外部晶振频率,单位Hz st