做嵌入式硬件开发,板子焊好了,程序也烧进去了,可就是跑不起来,这种情况太常见了。很多人一上来就怀疑代码写错了,其实问题往往出在硬件或者底层配置上。
电源不稳定是最容易被忽视的问题
曾经有个项目,单片机时不时重启,查了半天以为是看门狗没关,结果用示波器一测,发现3.3V供电有明显抖动。原来是电源模块的滤波电容没焊牢,虚焊导致电压波动。建议每次通电前先用万用表量一下各路电压,尤其是核心芯片的供电引脚。
晶振不起振?别急着换芯片
STM32、ESP32这类主控依赖外部晶振启动,如果程序根本不跑,先检查晶振是否起振。可以用示波器探头点在晶振两端,正常应该看到正弦波。有时候是因为匹配电容选得不对,比如该用12pF却用了22pF,导致起振困难。典型电路如下:
<!-- 典型的4MHz晶振电路 -->\nXTAL1 ----|\|---- MCU\n \|/ |\n 12pF |\n | |\n GND |\n |\n 12pF\n |\n GND\nMCU ---- XTAL2
复位电路设计不当会带来诡异问题
有人为了省事直接把复位引脚接VCC,觉得反正不上电就不会复位。但实际使用中,电压缓慢上升时,MCU可能卡在半激活状态。推荐使用专用复位芯片,比如IMP809,或者至少加一个RC延时电路配合手动复位按键。
PCB布局布线埋下的坑
模拟部分和数字部分的地没有分开,结果ADC采样数据跳得像跳舞。还有人把高速信号线绕得很长,又没做阻抗匹配,通信经常出错。记得有一次I2C总线上拉电阻放在离主控很远的位置,导致SCL上升沿太缓,从设备根本识别不了。后来把4.7kΩ上拉电阻挪到靠近主控的地方,问题立马解决。
烧录失败别只盯着SWD接口
JTAG或SWD连不上,第一反应是IO口坏了?其实更可能是目标芯片没供电,或者复位引脚被拉低了。还有种情况是BOOT引脚配置错误,芯片进不了下载模式。比如STM32的BOOT0=1才能通过串口或SWD烧程序,要是不小心接到地了,怎么下都下不进去。
外设调试要有耐心
UART输出乱码,先别改波特率,拿逻辑分析仪抓一下波形,看看是不是因为参考时钟错了。比如系统主频配成72MHz,但实际晶振只有8MHz,那算出来的波特率自然就不准。SPI通信失败,重点看片选信号有没有正确释放,很多驱动库里CS脚操作容易漏掉。
嵌入式硬件开发不像纯软件那样能快速迭代,每一步都要稳。遇到问题别慌,从电源、时钟、复位这三个基本点开始查,大多数“灵异事件”都能找到源头。