“烧录显示成功但板子一点反应都没有”——这是嵌入式入门阶段最常见、也最让人怀疑人生的故障。它有个特点报错反而好办因为报错会告诉你去哪查。真正难的是一切显示正常、芯片就是不动。下面按命中率从高到低排序建议从上往下逐条排除不要跳着查。第 0 步先确认你看到的是哪种情况情况特征大概率原因烧录失败Keil 输出窗口报 Error连接、芯片型号、供电烧录成功但不运行有 Verify OK板子不动复位、启动模式、时钟、程序逻辑关键动作打开 Keil 的 Build Output 窗口确认看到的是Verify OK还是Application running...之后就没下文了。这一步决定了后面查什么。一、Reset and Run 没勾选第一条命中率最高这是假故障里最常见的一个。Keil 下载程序后默认行为是把芯片停在复位状态需要你手动按复位键或者重新上电程序才开始跑。很多人以为烧录失败其实只是没运行。解决Options for Target→Debug→ 右侧Settings→Flash Download标签页 → 勾选Reset and Run。勾上之后再烧录程序会自动复位并开始执行。先检查这一条能省掉后面所有排查。二、BOOT0 / BOOT1 启动模式错了第二条以 STM32F103 为例启动模式由 BOOT0、BOOT1 两个引脚在上电瞬间的电平决定BOOT0BOOT1启动区域0x主 Flash正常运行程序10系统存储器出厂 Bootloader用于串口下载11内置 SRAM问题来了如果 BOOT0 接了高电平芯片上电后进了出厂 Bootloader它当然不会运行你的程序。而很多开发板为了支持串口下载BOOT0 是通过跳线帽选择的——跳线帽插错位置是超高频事故。排查上电瞬间用万用表量 BOOT0 引脚电压必须是低电平0V。三、供电不足或不稳现象偶尔能跑、跑一会儿就挂、一按复位就正常一会儿。要查的点电压3.3V 是否真的在 3.2–3.4V 之间。低于 3.0V 时 Flash 编程可能失败或写入不可靠电流下载器如 ST-Link自带的 3.3V 输出通常只有 100mA 左右带不动带 WiFi/4G 模块的板子。这类板子必须用独立电源纹波用示波器看 3.3V 上的纹波超过 100mV 就可能引发随机复位建议调试期直接接稳定的外部电源不要依赖下载器供电。四、复位电路有问题STM32 的 NRST 引脚是低电平复位典型电路是10kΩ 上拉到 3.3V 100nF 电容到地。常见错误NRST 悬空没有上拉受干扰时会随机复位电容值过大比如用了 1μF导致上电复位时间过长看起来像死机NRST 被其他外设或引脚复用占用了排查量 NRST 引脚电压正常应该稳定在 3.3V高电平。如果它在 0V 附近抖动就是复位电路的问题。五、系统时钟配置失败HSE 晶振没起振这个坑很隐蔽程序烧进去了但卡在时钟初始化里出不来。原理大多数工程用外部晶振HSE作为时钟源。如果晶振没起振SystemInit()里等待 HSE 稳定的循环就会一直等下去或者超时后切到内部 HSI但后续外设波特率全不对。排查方法用示波器测晶振引脚应该有正弦波比如 8MHz临时把时钟源改成内部 HSI重新编译烧录。如果改成 HSI 就能跑了问题 100% 在晶振检查晶振的负载电容是否匹配常见是 20pF但要看晶振规格书。电容不匹配会导致起振慢或不起振新手常见事故焊晶振时温度过高把它烫坏了或者晶振虚焊。六、下载算法 / 芯片型号选错Options for Target→Device里选的型号必须和实际芯片完全一致包括 Flash 容量。典型问题选了 STM32F103C864KB实际是 STM32F103CB128KB或者反过来Flash Download 里的Programming Algorithm没添加或选错症状烧录时报Flash Download failed或烧录成功但校验失败。七、芯片被读保护锁了如果这块芯片之前被设过读保护RDP Level 1Keil 无法正常烧录或运行。排查工具用 STM32CubeProgrammer 或 ST-Link Utility 连接看能否读出芯片信息。解决解除读保护——注意这会擦除整颗芯片的全部数据操作前确认没有不可恢复的内容。八、程序自己卡住了如果前面 7 条都排除完那就是程序逻辑的问题。常见三种1. 卡在等待某个标志位while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)RESET);// 没有超时就会死等外设没初始化成功或者硬件有问题时这个循环永远不会退出。建议所有等待循环都加超时计数超时后打印错误或进入安全状态。2. 中断向量表偏移没设置如果程序是通过 Bootloader 跳转执行的必须设置向量表偏移NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x8000);// 偏移量按实际 Bootloader 大小不设置的话中断一触发就跳飞——表现为能跑几秒然后死机。3. 看门狗没喂独立看门狗IWDG一旦启动就无法关闭如果主循环里没有定期喂狗或者某个任务耗时超过看门狗周期就会被强制复位。表现为周期性重启。九、用这三招快速定位第一招点灯不管什么原因先写一个最简单的程序——只初始化时钟和 GPIO让 LED 以 500ms 闪烁。能闪烁说明工具链、启动模式、时钟全是好的剩下的就是你的业务代码问题。这是最有效的隔离手段能把排查范围直接砍一半。第二招串口打印在main()的第一行就打印一句Boot OK然后在各个初始化函数之间插打印。看串口停在哪一句就知道卡在哪一步。第三招单步调试如果烧录后不运行但在线调试Debug模式下能正常单步——这说明 Flash 里的程序没问题是上电启动环节的问题重点回到第一步Reset and Run和第二步BOOT0。十、排查清单速查表按顺序打勾不要跳Keil 是否勾选了Reset and Run烧录后是否手动按过复位键BOOT0 引脚上电时是否为低电平3.3V 电压是否正常、电流是否足够是否依赖下载器供电NRST 引脚电压是否稳定在高电平用 HSI 替代 HSE 能否运行判断晶振芯片型号和 Flash 算法是否选对芯片是否被读保护锁定最简点灯程序能否运行串口打印停在哪一句一句话总结烧录成功但不运行里前四条能解决绝大多数问题Reset and Run 没勾、BOOT0 跳线错、供电带不动、复位电路异常。排查的原则是从外到内——先确认电源和启动模式这些外部条件再去怀疑程序。反过来查一上来就翻代码往往会绕很久。