单片机通电,3.3V正常,晶振也起振了,拿万用表戳了几个关键点都没问题,但代码就是不跑,LED怎么也不亮。烧录器显示烧录成功,重烧了一遍还是一样。这类问题在嵌入式调试里太常见了,电源和晶振只是必要条件,不是充分条件。
烧录成功不等于能跑很多人看到烧录器提示"Programming successful"就默认程序已经正常加载了,其实不一定。烧录成功只说明Flash写入没报错,不代表程序能正确执行。以下几个地方出问题,烧录看起来正常但芯片实际在空转。
BOOT引脚电平不对。大多数STM32默认从Flash启动,但如果BOOT0被拉高,芯片上电后会从系统存储器或内置SRAM启动,Flash里的代码根本不会被执行。常见于新手调参考设计时BOOT引脚悬空,或者上拉电阻焊错位置。拿万用表量一下BOOT0引脚电平就能确认。

复位脚卡死在低电平。单片机普遍用低电平复位,如果复位引脚被外部电路一直拉低,芯片始终处于复位状态,所有外设和内核都不工作,代码自然跑不起来。复位电路里的电容虚焊或焊反了最常导致这个问题。量一下NRST引脚电压,正常应该是3.3V高电平。
晶振起了但起错了地方晶振有波形不代表芯片在用这个晶振。芯片内部默认通常用内部HSI RC振荡器启动,等代码里手动切换到外部晶振才换过去。如果你的板子外部晶振焊反了或者焊工差到起振失败,芯片只是在用内部晶振勉强跑MHz级的速度——代码里的延时和配置基于外部晶振频率写的,实际跑快了或者跑慢了,外设时序全乱。
还有一种情况:芯片确实跑了,但程序指针卡死在初始化阶段。比如GPIO初始化之前程序就跑飞了,或者外设时钟没开导致访问挂死。这种情况拿示波器看晶振脚——如果有周期性活动说明代码在循环,卡死则晶振脚基本是静态的。
【注意】复位引脚电平和BOOT引脚电平是最容易漏掉但又最容易查的两个点。很多人花几个小时调代码,最后发现是NRST引脚被电容拉低或者BOOT0悬空。这类低级失误在review别人板子时也经常遇到。
三步定位法遇到点灯不亮、代码不跑,按这个顺序查:
第一步,量NRST和BOOT0电平。确保复位脚高电平,BOOT0在正确启动位置(STM32通常是低电平从Flash启动)。这是零成本排查,别跳过去。
第二步,用示波器观察晶振脚和芯片关键输出脚。如果晶振有波形但芯片某个IO脚完全没有翻转,说明程序没有跑到IO操作那段代码。往回追溯,看程序卡在哪一步。
第三步,用SWD调试接口单步跟踪。接上ST-Link或J-Link,在IDE里单步执行,看程序卡在哪一行报错。常见卡点:外设时钟没开、GPIO复用配置冲突、数组越界把栈砸穿等。
实战经验:一个学员调STM32F103,晶振波形正常,BOOT0确认拉低,NRST电压3.3V,但代码就是没反应。最后用调试器单步发现,程序死在SystemInit()里——外部晶振起振失败,HSI切换到HSE的代码里while循环超时直接卡死。晶振起振和晶振被芯片成功使用是两回事。
单片机调试靠的是排除法,不是直觉。电源和晶振正常只是排除了最基础的两个变量,剩下的BOOT配置、复位电路、外设时钟每一条都得单独验证。养成系统排查的习惯,比每次靠运气强。

扫码关注









































