最近在搞低功耗项目,手头正好用到 STM32L073RZ 这颗料。结果板子一上电,手一摸,直接给我烫了个激灵。Nucleo 板发热这事,说大不大,但真遇上了还是挺慌的——毕竟 L0 系列主打的就是低功耗,正常工作时芯片本身应该只是温热,甚至摸起来是凉的。一颗低功耗芯片热到烫手,说明板上肯定有地方在偷偷吃大电流。
这类问题我前前后后排查过好几轮,从最初只会摸芯片温度,到后来学会用万用表、热成像一步步定位,踩了不少坑,也总结出一些套路。这篇文章就把我排查 STM32L073RZ Nucleo 板异常发热的完整过程写出来。如果你是刚开始玩 STM32 的新手,或者手头正好也有一块发热的 Nucleo 板,这篇应该能帮你少走很多弯路。
1. 发热第一现场:别急着拆芯片,先判断"热"从哪来
拿到一块发热的板子,第一反应不要是"芯片烧了"。发热本身只是现象,电流异常才是根源。STM32L073RZ 作为 Cortex-M0+ 内核的低功耗 MCU,正常运行时核心电流也就几毫安到十几毫安,整板功耗如果跑到几百毫安甚至安培级别,才会出现明显发热。所以第一步,先搞清楚到底是哪里在热。
1.1 用手摸还是用设备测?判断温度的不同方式
有经验的工程师靠手感就能估计个大概,但新手容易误判。手背贴芯片,如果感觉"烫但还能忍",大概在 50°C 到 60°C 左右;如果手指放上去不到两秒就得弹开,那基本已经超过 70°C 了。这个温度对应的电流消耗,粗略估算一下:
以 STM32L073 的热阻(TJA 约 80°C/W 左右)来算,芯片表面比环境温度高 40°C,对应的热耗散功率大概就在 0.5W。如果 3.3V 供电,电流就是 0.5W / 3.3V ≈ 150mA。这还没考虑板载 LDO 自身的发热。所以一块热到烫手的板子,整板电流至少百毫安往上跑,这绝对不是正常状态。
当然,更靠谱的做法是用红外测温枪或者热成像仪。热成像仪在定位发热源时特别好用,能一眼看出到底是芯片、LDO、电阻还是某个电容在发热。没有热成像仪也没关系,可以用酒精棉球逐个点碰可疑元件——酒精挥发快的那个,就是温度高的。这个方法虽然土,但在没有专业工具的时候非常实用。
1.2 主芯片热还是 LDO 热?决定排查方向完全不同
这是第一个关键分叉点。用手一摸,如果烫的是板子左上角那个 SOT-23 封装的 3.3V LDO(Nucleo 板用的是 LD39050 或类似型号),那问题大概率不在 MCU,而在于 LDO 后端挂载的负载太大。如果烫的是 STM32L073RZ 芯片本体,那就要重点检查芯片供电、IO 口和内部模块配置。
有个常见误区:很多新手看到芯片热就认为是芯片坏了,急着换芯片。实际上,芯片本身发烫很多时候是外部电路导致的。比如某个 GPIO 被配置成推挽输出高电平,然后外部直接接地——这个引脚就会变成一个小型发热器。STM32 的单个 IO 最大能灌 25mA 左右,几个 IO 同时短路,芯片就会明显发热。
反过来,如果是 LDO 发热,那就先量一下 3.3V 网络的对地阻抗,排除后级短路。注意,Nucleo 板的 3.3V 和 5V 是有跳线(SB)控制的,排查前先确认跳线帽的状态。
2. 整板电流测量:最快速定位问题区间的方法
判断发热位置之后,第二步就是用万用表测电流。这是所有排查手段里信息量最大的一步,一条电流数据就能把问题范围缩小一大半。
2.1 用万用表电流档还是串电阻?测量技巧与注意事项
Nucleo 板有多个供电路径。最直接的方法:把板子上的 E5V(外部 5V)跳线断开,用万用表串在 USB 5V 输入端和板子之间测总电流。但注意,Nucleo 板上有 ST-Link 部分和 Target 部分,ST-Link 本身也会消耗电流,如果只想测 Target 部分的电流,需要断开 SB12(如果这个型号有这个跳线的话)或对应的目标板供电跳线。
具体步骤:
- 万用表拨到电流档(先选最大量程,比如 10A 档,避免烧保险丝)
- 断开待测回路的跳线帽或短路电阻
- 红表笔插入电流测量孔,黑表笔接 COM
- 表笔串联接入断开点,上电读取电流值
如果测出来整板电流 300mA 以上,那问题很明确——有短路或大负载。如果只有几十毫安,那发热源可能不是电流而是电压,比如某个引脚被外部电压反灌。
这里有个实操细节:不要直接用万用表电流档去量 USB 的 VBUS 和 GND 之间,那样等于把万用表当导线,瞬间大电流会烧保险丝。电流测量必须串联在回路里,不是并联在电源两端。
2.2 正常电流应该是多少?L0 芯片功耗参考基线
搞清楚"正常"才能判断"异常"。STM32L073RZ 在 32MHz 主频、全速运行且外设全开的情况下,芯片核心电流大概 5-15mA。Nucleo 板上还有 ST-Link 调试器、LED 指示灯、电平转换芯片等,整板电流通常在 50-80mA 左右(取决于工作状态)。
如果只是上电、不烧录程序,整板电流应该在 30-60mA 之间。加上调试器供电的静态消耗。如果你的板子通电后电流直接飙到 200mA 以上,那肯定是哪里不对。
值得留意的是,有的板子刚上电时电流会短暂冲高(因为去耦电容充电、LDO 上电过程),几秒后回落。这是正常现象。持续稳定在异常高位,才是故障信号。
3. 排查外部连接:很多时候问题根本不在板子上
发热问题里,外部连接错误占了相当大比例。ST 的 Nucleo 板为了兼容 Arduino 引脚布局,把很多 GPIO 引到了排针上,这就埋下了隐患。
3.1 检查排针上是否有意外短路或接反
拿到发热板子,先把所有外接的杜邦线、扩展板拆掉,恢复到板子裸奔状态,再上电。这个操作能直接排除掉八成的外部连接问题。我遇到过不止一次:用户说板子发热,结果发现是扩展板上某个引脚短路,和 Nucleo 板本身一点关系都没有。
如果裸板不发热了,那就是外部电路的问题。这时不要急着重新插回去,先用万用表导通档量一下扩展板上 VDD 和 GND 之间的阻抗。如果是 0 欧姆或者接近 0 欧姆,那说明扩展板内部短路。很多廉价扩展板在焊接工艺上存在瑕疵,焊锡珠残留会导致相邻引脚桥接,这种情况最坑人。
如果裸板依然发热,那就继续往下查。注意检查排针座本身有没有焊锡桥接,特别是比较密集的排针区域。我见过一块板子因为助焊剂残留导致相邻排针之间存在微弱漏电流通路,虽然阻抗不是 0,但足以让芯片温度异常升高。
3.2 杜邦线接法最常见的几种坑
杜邦线的坑主要体现在三个方面:
第一,线序搞反。很多传感器模块的引脚顺序并不统一,VCC 和 GND 的位置可能和你预期的不一样。插之前一定要看丝印,不要凭感觉。我就插反过一块 OLED 屏,5V 直接灌到了 GND 上,板子和屏幕一起发热,差点烧掉。
第二,夹错引脚。Nucleo 排针上的丝印有时候容易被遮挡,特别是叠了扩展板之后。建议用万用表导通档验证一下排针对应关系,再上电。
第三,杜邦线本身破损短路。劣质杜邦线内部的铜丝可能从塑料外壳里露出来,插在面包板上时碰到相邻引脚。排查方法:用万用表量一下所有杜邦线两端的导通关系,排除这一可能。
3.3 外接传感器或模块时,注意电源与 IO 电平
STM32L073RZ 是 3.3V 逻辑器件,IO 口不能直接承受 5V。如果外接的传感器模块是 5V 供电,它的 IO 输出可能直接是 5V 电平,这些 5V 电平灌入 3.3V 的 GPIO,会通过芯片内部的保护二极管形成漏电通路。
这个漏电通路有多严重?单个引脚漏电可能只有几毫安,但如果外接的模块有多个 IO 连到 MCU,累加起来就是几十毫安的电流。这些电流从外部流入芯片的 VDD(通过保护二极管),会明显造成芯片发热,却不一定立即烧毁芯片。
所以外接模块时,尽量选择 3.3V 供电的型号,或者加电平转换芯片(比如 TXS0108E)。如果模块自带板载稳压(很多 5V 供电的模块上有 AMS1117-3.3),那它的逻辑电平就取决于内部稳压之后的电压,这个要查模块的规格书确认,不能想当然。
4. 芯片局部发热的深层原因:从电源域到内部模块
排除了外部因素,如果还是发热,那就是板子本身的问题了。这时候要把注意力收回到 STM32L073RZ 芯片本身,重点检查几个容易被忽略的元凶。
4.1 VDD 与 VDDA 等电源引脚的供电异常
STM32L073 是 LQFP64 封装(如果你用的是 LQFP64 封装的话),引脚不少。PCB 上如果电源引脚滤波不良,或者 VDDA 引脚悬空,会导致内部模拟电路工作异常,产生额外的功耗。Nucleo 板是官方设计,理论上不会犯这种低级错误,但如果板子是二手或者被改装过,就要留意。
用万用表量一下芯片每个 VDD 引脚和 VDDA 引脚的电压是否都是 3.3V,VSS 引脚是否都是 0V。有些板子在某个角落的 VDD 引脚上有虚焊,看起来是连着的,实际上接触不良。这种情况在显微镜下才能看清,不过多数时候用万用表量也能发现——电压值会偏低或者跳动。
此外,VBAT 引脚也很关键。如果板上没有接备份电池,VBAT 应该直接接到 VDD 或 GND(具体看数据手册的推荐电路)。如果 VBAT 悬空,芯片内部 RTC 和备份寄存器区域的供电状态不确定,也可能引起漏电。Nucleo 板默认把 VBAT 接到了 VDD,如果你飞线改过这个引脚,注意检查。
4.2 芯片内部模块未关断导致功耗异常
这个问题在低功耗项目中尤其常见。STM32L073RZ 低功耗出名,但前提是代码里正确配置了低功耗模式。如果代码一直让芯片跑在 Run 模式,所有外设时钟全开,那么即便没有外部短路,电流也会比正常情况高不少。
举一个典型例子:ADC 的时钟没有关闭。ADC 模块在 STM32L0 系列上有一个独立时钟使能位,如果代码里初始化了 ADC 但没有在停止模式下关闭它,ADC 的模拟部分会持续消耗电流,可能拉到毫安级别。这虽然不足以让芯片热到烫手,但会显著拉高整板功耗。
要全面摸清功耗底数,可以用 ST 的功耗计算工具(STM32CubeMonPwr)配合板子上的 IDD 测量引脚(Nucleo 板的 CN7 排针上有 IDD 引脚,断开跳线可以串电流表测量 MCU 电流)。如果你把 MCU 电流单独测出来,确认只有几毫安,那发热就另有来源。
4.3 芯片本身损坏的情况:什么时候才需要怀疑
如果以上所有检查都做了,芯片依然发热,那才需要怀疑芯片本身损坏。芯片损坏的常见原因包括:IO 口长期过流烧毁内部驱动管、ESD 静电击穿、电源过压击穿。L0 系列虽然是低功耗芯片,但它的 IO 驱动能力和普通 STM32 一样,短路时间长了同样会烧。
怎么判断芯片是否损坏?可以用 ST-Link 尝试连接芯片,如果能读到 IDCODE,说明芯片的内核还活着,Flash 也能读取,那芯片就还没完全报废。如果连接不上或者读 ID 报错,那基本上是硬件损坏了。注意,ST-Link 连接不上也有可能是引脚配置导致 SWD 引脚被禁用,不一定是芯片坏。可以先按住复位引脚再点连接,或者把 BOOT0 拉高再连,排除代码干扰。
芯片损坏这种概率实际上不高。多数"芯片发热"最后查出来都是外围电路的问题。所以排查时不用过度恐慌,按顺序来就行。
5. 板载调试器与电源电路:Nucleo 特有的发热源
Nucleo 板和其他最小系统板不太一样的地方,是它自带 ST-Link 调试器和完整的电源管理电路。这些额外的东西有时候就是发热的元凶。
5.1 ST-Link 部分的电流消耗:正常阈值与异常判断
Nucleo 板上的 ST-Link 调试器(通常是 STM32F103 系列芯片)负责 USB 通信和 SWD 调试。它的电流消耗大概 20-50mA。如果你用的是板载 ST-Link 给目标 MCU 供电(默认跳线连接),那 ST-Link 的电流和 MCU 的电流是叠在一起的。
判断 ST-Link 是否异常发热,可以对比一下:拔掉目标板的供电跳线(断开目标 MCU 的 VDD 供电),只保留 ST-Link 工作,然后摸 ST-Link 芯片的温度。如果 ST-Link 芯片单独工作依然烫手,说明问题在调试器部分——可能是 USB 接口的 ESD 保护器件损坏,或者 ST-Link 的固件跑飞。
顺带说一句,ST-Link 固件是可以通过 STM32CubeProgrammer 升级的。如果 ST-Link 工作异常,先试试升级固件到最新版。我遇到过 ST-Link 识别不稳定导致整板电流偏高的情况,升级固件后恢复正常。
5.2 板载 5V 转 3.3V 电路上电瞬间的浪涌电流
Nucleo 板的电源拓扑是:USB 5V → 跳线 → 5V 网络 → LDO → 3.3V 网络。上电瞬间,3.3V 网络上的去耦电容(Nucleo 板上至少有 4-5 个 100nF 电容和几个 10µF 钽电容)需要充电,这个瞬间电流可能达到几百毫安甚至几安培。
这个浪涌电流持续时间很短(微秒到毫秒级),不会造成持续性发热,但如果你的电源适配器本身功率不足,或者 USB 线太细(电阻太大),就可能在 LDO 上产生较大的压降和功耗。比如 USB 线内阻 0.5 欧姆,板子持续 200mA 电流,线上就掉 0.1V,这个损耗以热量形式散发在 USB 线上——你会感觉线是温的。如果线内部短路,那就更麻烦了。
如果你用的是台式机前置 USB 口供电,注意前置口的供电能力通常比后置口差。我遇到过一块板子在台式机后置 USB 口上正常工作,换到前置口就发热重启,最后发现是前置口的 USB 供电电流不够,导致电压跌落,板载 LDO 为了维持输出电压而工作在极限状态,发热剧增。
5.3 跳线帽状态与供电选择:一个被忽略的排查项
Nucleo 板的供电跳线(通常标记为 E5V、5V 等)有多种接法:
- E5V 短接:使用外部 5V 电源供电
- 5V 短接:使用 USB 的 5V 供电
- 3.3V 短接:使用外部 3.3V 直接供电
如果跳线帽插错了位置,比如把外部 5V 接到了 3.3V 网络上,那 3.3V 网络上的芯片全都会过压,发热是必然的。
排查方法很简单:目视检查跳线帽位置是否和丝印标注一致,再用万用表量一下 3.3V 引脚和 GND 之间的电压,确认是 3.3V 而不是 5V。如果量出来是 5V,第一时间断电,把跳线恢复正确。
还有一个常见情况:跳线帽的金属弹片老化,接触电阻变大。虽然接触电阻通常只有零点几欧姆,但如果在高电流回路里(比如 ST-Link 的 5V 供电),也会产生明显热量。这时候用手摸跳线帽,你会发现跳线帽本身是热的。这种情况换个跳线帽或者直接用飞线短接就行。
6. 实操排查链路:从“烫手”到“定位”的完整流程
综合以上所有分析,我把这次 STM32L073RZ Nucleo 板发热的排查过程梳理成一套可复用的排查流程。按这个顺序走一遍,绝大多数发热问题都能定位到具体元件。
6.1 第一部:静态检查排除低级问题
拿到发热板子,先别急着上电。肉眼检查 PCB 表面是否有异物(焊锡珠、螺丝、铜丝),是否有元件位置异常,是否有烧焦痕迹。用万用表电阻档量 3.3V 网络对 GND 的阻抗,再量 5V 网络对 GND 的阻抗。注意:如果阻抗为 0 或者接近 0,不要反复通电测试,先把短路找到了再说。
这个阶段的目标是用最少的操作排除最常见的低级错误,为后续动态测试提供安全条件。
6.2 第二部:最小系统法剥离干扰
把所有外设、扩展板、杜邦线全部移除,让板子处于最小系统状态。断开板载 ST-Link 供电跳线(如果不需要调试),只用外部可调电源给 3.3V 网络供电,预设电流限制在 100mA,然后缓慢上调电压到 3.3V。
这个方法特别适合定位电流问题。外部电源通常会显示实时电流,如果电流仍然很大,问题锁定在板子本身。如果电流恢复正常(几毫安到几十毫安),说明问题是外围电路,可以逐步加回外设,每加一个测一次电流,找到拉高电流的那一个。
我强烈建议手头常备一个带电流显示的可调电源(或者 DC 电源分析仪),这对嵌入式调试的帮助比任何调试器都大。没有的话,用 USB 电流测试仪也可以,精度略差但够用。
6.3 第三部:热成像或酒精法缩小范围
如果电流异常的方向锁定在板子上,下一步就是确定具体发热元件。有热成像仪最好,一目了然。没有的话,用酒精棉球逐个点可疑元件。酒精在发热元件上会迅速蒸发,而且会发出呲呲声,这个反馈非常直观。
这个阶段重点关注:LDO、MCU、电平转换芯片、LED 限流电阻、以及你怀疑的短路位置附近的元件。
6.4 第四部:针对性测试定位到具体引脚或元件
热成像确认了发热元件之后,针对性地做测试。比如发热的是 MCU,就量它的每一个 VDD 引脚的电流(如果可能)或者用强制电流法(给某个引脚加限流电压,看是否有异常漏电)。
如果发热的是某个电容,最可能是电容本身击穿短路或漏液。用万用表电容档量一下实际容量,和丝印标称值对比,偏差太大就换掉。电容漏电的典型特征是通电一段时间后会自己变热,然后电流缓慢上升。
如果发热的是某个电阻,那多半是流过它的电流太大。检查这条回路上挂载了什么,是否出现了不应该存在的负载。用欧姆定律估算一下:已知电阻阻值和电压,就能算出预期电流,如果实际电流远超预期,那就顺着回路查。
6.5 第五部:代码侧检查(确认硬件无误后)
如果硬件检查做了一圈,发热没有明显改善,那就需要考虑代码的影响。有些配置会让芯片无谓地消耗更多电流:
- 全速运行且所有外设时钟开启(SystemClock 配置里把所有 RCC 时钟都使能了)
- 没有进入任何睡眠模式
- GPIO 被配置为高驱动模式但不需要
- 内部 LDO 调节器电压设置为高范围,但实际工作频率不需要这么高
你可以写一个最简 LED 闪烁程序(只初始化必要的时钟和 GPIO),烧录后测量电流。如果这个最简程序的电流明显比之前低,那问题就在代码的功耗管理上。如果最简程序的电流依然高,那就是硬件问题,继续排查硬件。
有一个小技巧:STM32CubeMX 生成的代码默认会把所有外设时钟都打开,这在开发阶段问题不大,但如果你在这个基础上叠加了低功耗逻辑,可能因为某个外设没关导致低功耗模式失效。检查一下所有外设的 __HAL_RCC_xxx_CLK_ENABLE 和对应的 DISABLE 是否成对。
7. 修复经验与后续建议:这块板子后来怎么样了
我那块发热的 STM32L073RZ Nucleo 板,最后的结局有一点戏剧化。排查了一圈,外部连接没问题,最小系统电流正常,但只要接上某个型号的温湿度传感器,电流就会跳到 150mA。最后发现是传感器模块本身的焊盘设计有问题,它的 SCL 和 GND 之间有微短路,导致模块上电后 SCL 被拉低,MCU 的 I2C 引脚通过内部上拉电阻持续输出电流。
把传感器模块换了一个批次之后,问题彻底解决。整个排查过程花了大概两个晚上,用的工具就是万用表、可调电源和一个放大镜。
基于这次经历,给正在用 Nucleo 板做开发的朋友几条建议:
第一,拿到一块新板子,先测一下空板电流,记录基线数据。这样以后再遇到发热问题,就有对比参照。不同批次的板子可能有细微差异,但数量级不会差太多。
第二,焊东西之前,养成用万用表导通档检查的习惯。特别是焊排针、插扩展板这种操作,提前发现短路比事后排查节省几小时时间。
第三,遇到发热问题不要慌,按"先外后内、先静后动、先粗后细"的顺序来。先拆外设,再测静态阻抗,再动态上电。每一步都做好记录,避免反复横跳。
第四,有条件的话备一个热成像仪(哪怕是手机外接的那种)。它对定位发热源的效率提升是数倍级别的。尤其是板子面积小、元件密集的时候,没有热成像只能靠猜,有了热成像直接精准定位。
最后再分享一个经验:STM32L0 系列的低功耗特性真的很好用,但前提是正确配置。如果你的项目不需要特别低的功耗,或者开发阶段还在调试功能,暂时不用太纠结功耗问题。先把功能跑通,再回头优化功耗也不迟——但前提是板子不能热到烫手,正常功能调试时的温度不会超过 50°C。如果你感觉温度明显超出这个范围,一定是哪里出了问题,值得花时间查清楚再继续往下开发。