昨天帮邻居老张修他那台总在煮粥时自动断电的智能电饭煲,拆开后发现是主控板上一个GPIO引脚接触不良——这事儿跟调试嵌入式系统真没两样:不靠玄学,靠的是灯、串口、逻辑分析仪和一点耐心。
先亮个灯,确认它还活着
很多新手一上来就抓log、跑JTAG,结果连MCU都没跑起来。我习惯先接个LED,写最简程序:初始化IO,拉低/拉高,看灯闪不闪。就像检查灶台有没有火苗,火不着,后面炒菜全是空谈。
比如用STM32F103写个裸机点灯:
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // 开启PA时钟
GPIOA->CRH &= ~GPIO_CRH_CNF8; // PA8推挽输出
GPIOA->CRH |= GPIO_CRH_MODE8_1; // 50MHz
while(1) {
GPIOA->BSRR = GPIO_BSRR_BS8; // 置位PA8(灯灭)
for(volatile int i=0; i<500000; i++);
GPIOA->BSRR = GPIO_BSRR_BR8; // 复位PA8(灯亮)
for(volatile int i=0; i<500000; i++);
}串口不是摆设,是你的嘴和耳朵
电饭煲报错代码E03?烤箱屏显“Err-7”?这些背后往往就是UART打印的一句printf("ADC read timeout!")。别嫌麻烦,把printf重定向到USART1,哪怕只打个"OK ",也能帮你卡死在哪个函数里。
我修过一台老式豆浆机,按键无响应,串口一接,发现定时器中断根本没进——原来晶振负载电容焊反了,时钟源跑飞,整个系统卡在SystemInit()里打转。
逻辑分析仪:看清信号怎么打架
当I2C从设备死活不回ACK,SPI MOSI有波形但MISO全为高,这时候光看代码没用。我常把LA探头夹在SCL/SDA线上,调好触发条件,一眼看出是地址发错、还是从机没上电、抑或线路干扰太大。就像用听诊器贴在冰箱压缩机外壳上,听它是不是在喘气。
别迷信仿真器,断电重启有时最灵
J-Link连不上?OpenOCD报“target not halted”?先拔电源,等3秒,再插上。有些芯片的SWDIO引脚被误配成普通IO并拉低,JTAG口就被锁死了。这时冷复位+短接BOOT0到VCC再烧一次bootloader,比翻十页手册还快。
说白了,嵌入式调试不是拼智商,是拼动手顺序:灯亮→串口通→信号对→寄存器准。跟炖一锅红烧肉差不多——火候、时间、调料缺一不可,急不得,也跳不过哪一步。