MCU进了睡眠模式,电流还在毫安级
MCU进了睡眠模式,电流还在毫安级
代码已经调用低功耗指令,程序也不再执行主要任务,电流表却仍然显示几毫安。低功耗不是只让CPU停下来,还涉及外设时钟、GPIO状态、调试连接和整板其他负载。先分清测的是芯片,还是整块板。
CPU睡了,外围未必睡了
做电池供电产品时,低功耗调试常常会碰到一个尴尬数字:查Datasheet时待机电流看起来只有几微安,自己写好睡眠程序,实测却还是1mA、2mA,有时甚至更多。
最容易犯的错误,是把执行了WFI、WFE,或者进入某个Sleep模式,当成整个系统已经进入最省电的状态。不同MCU的Sleep、Stop、Standby差别很大,哪些时钟还在跑、SRAM是否保留、外设能否继续工作,都要按当前芯片确认。
同一颗MCU在不同模式下,唤醒速度、保存的数据和电流差距可能很大。有些项目为了随时响应外部中断,只能选保留更多资源的模式。不能为了追一个漂亮的微安数字,把产品必须具备的唤醒功能一并关掉。
普通Sleep可能只停CPU内核,部分外设仍在运行。一个定时器持续计数、串口等待接收,或者ADC参考电路没有关闭,都可能让电流远高于预期。程序停了,并不意味着芯片内部所有模块都停了。

那几毫安是谁用掉的
第二个容易漏掉的是GPIO。比如某个引脚在休眠前仍然输出高电平,外部接着LED或下拉电阻;又或者板上芯片已经断电,MCU的IO却还向它输出高电平,都可能形成不必要的电流通路。
对没有使用的IO,很多STM32器件建议按相应手册配置为模拟输入、关闭不需要的上下拉;但正在使用的引脚不能照抄一套模式,必须同时考虑外部负载和唤醒要求。
如果外设通过I²C、SPI或UART与MCU相连,休眠前的引脚状态尤其值得看。比如传感器电源被关掉,通信脚却还被上拉到3.3V,可能出现经接口保护结构倒灌的电流。关外设电源和管住IO状态应该成套检查。
调试器也是一个特殊变量。某些低功耗模式需要关闭调试保持功能,或者在断开调试器后才体现正常功耗。板子连着ST-LINK测出来的数字,未必等于量产固件脱离调试器后的结果。

还有板子上的LDO、指示灯、传感器、USB转串口和电平转换器。它们的静态电流不会因为MCU执行了睡眠指令就自动消失。若电流表串在整板电源入口,测到的就是这些器件加在一起的结果。
测量位置换一下,结论就变了
判断低功耗好不好,最好先明确测量边界:是测MCU的VDD电流,还是测整机电池电流?如果两者之间还有稳压器和外围芯片,数值就不该直接拿来与Datasheet的单芯片指标比较。
可以先让系统进入一个可重复的空闲状态,把LED、无线发送等明显负载暂时隔离,再在规定的供电路径测电流。开发板有专用IDD跳线或测试接口时,按板卡手册使用;不要随意断开会影响运行的供电。
测量工具本身也可能改变现象。普通万用表串联测电流时会引入一定负担电压,切换档位还有可能让目标板供电短暂中断。要看微安级休眠与毫安级唤醒的切换,带动态范围的功耗分析仪往往更顺手。

另一件事是别只盯万用表的静态读数。很多产品会周期性醒来,测一次数据又睡下去。表上一个平均值,可能把很短的毫安级峰值和长时间的微安级休眠混在一起。用电流分析仪抓完整唤醒周期,往往更容易看出究竟哪里花了电。
如果电流周期性冒尖,记一下时间间隔,再查唤醒源和中断标志。有时程序看似已经进入Stop,实际上某个未清除的中断让它很快又醒了。只在代码里打一个“进入睡眠”日志,并不能证明它真的睡了足够久。
如果已经确认进入了预期的低功耗模式,电流仍高,可以依次核对外设时钟、GPIO上下拉、调试保持配置、唤醒中断以及板上其他负载。不要一看到毫安级,就急着换更低功耗的MCU。
低功耗设计最后要落到产品的工作周期上:睡多久、醒几次、每次做多少事。芯片手册里的最低电流是一个条件明确的指标,整机能不能达到,需要把这些条件一项项落实。
声明:
本文由凡亿教育整理,转载请注明来源!
投稿/招聘/广告/课程合作/资源置换 请加微信:13237418207






哔哩哔哩
微信公众号
小红书
抖音
知乎
西瓜视频
头条
微信视频号
