嵌入式系统设计的那些坑,我都替你踩过了
我回忆起几年前刚开始搞嵌入式的时候,简直噩梦。板子上的灯就是不亮,示波器一打,时序全是乱的。那时候我以为,照着课本接好线,烧个例程就能跑。结果呢?——现实狠狠给了我一巴掌。说实话,很多教科书上的东西,在真实项目里根本不够看。
STM32时钟树配置示意图
低功耗蓝牙心率手环动态功耗示意图
不过话说回来,低功耗设计往往和实时性打架。有一次为了省电,把看门狗定时器设得太长,结果程序跑飞了没及时复位,机器就死在那了。用户反馈:怎么屏幕不动了?我心想:完了,又得发补丁。这就是软硬件协同的坑,不真正下手,光看论文,根本体会不到那种纠结。
四层PCB电源层和地层分割示意图
时钟配置?差点把我逼疯
有一次做一个基于STM32的数据采集器,需要多个外设协同。我按照教程,把系统时钟设置成72MHz,心想够快了。结果一跑起来,ADC采样总是丢数据。查了整整两天,最后发现是APB总线时钟分频没搞对。那个中断响应延迟——啧啧,简直致命。后来学乖了,每个项目的时钟树都自己手动画一遍,再也不敢偷懒。这里有个典型的时钟配置流程图,当时就是靠它理清的:
STM32时钟树配置示意图
低功耗?那是真刀真枪的优化
后来做穿戴设备,对功耗敏感得一塌糊涂。一开始照着数据手册,把MCU设置成睡眠模式,电流确实下来了。但一唤醒,蓝牙连接就断,重连又耗电更多。那个曲线,跟过山车似的。后来我干脆把外设供电单独控制,不需要的全关掉,用动态电源管理。有些传感器,比如心率监测,不用的时候直接拉低使能引脚。代码上也得配合,用非阻塞模式,能休眠就休眠。结果一块电池从撑半天变成了用三天,那种爽感,哈哈,真的会上瘾。
低功耗蓝牙心率手环动态功耗示意图
不过话说回来,低功耗设计往往和实时性打架。有一次为了省电,把看门狗定时器设得太长,结果程序跑飞了没及时复位,机器就死在那了。用户反馈:怎么屏幕不动了?我心想:完了,又得发补丁。这就是软硬件协同的坑,不真正下手,光看论文,根本体会不到那种纠结。
Layout?可不是连连看
你以为画板子就是把线连上?天真。我第一块四层板,没做阻抗匹配,USB信号质量差到传输失败。还有一次,电源去耦电容放得不够近,MCU工作时电压波动,导致随机复位。测波形的时候,那个毛刺,比心电图还刺激。后来学乖了,电源完整性和信号完整性必须考虑。地平面分割、过孔位置,全是学问。没有实际搞过,光看教科书那几张图,根本get不到点。
四层PCB电源层和地层分割示意图