本节摘要:低功耗是电池供电设备的生死线,而 MCU 的低功耗能力来自一组分级的工作模式——运行、睡眠、停机、待机,功耗与唤醒代价逐级反向拉扯。本节讲清各模式的机理与适用场景,给出"占空比省电法"这一核心设计思想,并完整展开一节电池寿命的估算案例。它是第 7 章系统级功耗预算的方法底座。
某水表产品立项时承诺电池用十年,第一批样机八个月就趴窝。拆解分析:固件每秒轮询一次流量传感器,MCU 全程满速运行,平均电流毫安级——而预算要求平均电流微安级,差了三个数量级。问题不在选错了芯片,而在根本没用低功耗模式:芯片有睡觉的能力,固件却让它一直蹦迪。本节就解决"怎么让芯片该睡就睡、该醒秒醒"的问题。
MCU 的功耗大头是时钟翻转消耗的能量,所以低功耗设计的本质是按需关时钟:关得越多、睡得越沉,醒来的代价也越大。厂商据此把芯片分成几档模式,理解每档"关了什么、留了什么、怎么醒、多久醒",就掌握了全部选择逻辑。
| 模式 | 关掉什么 | 保留什么 | 功耗量级 | 唤醒方式 | 唤醒时间 |
|---|---|---|---|---|---|
| 运行 | 无 | 全部 | 毫安级 | —— | —— |
| 睡眠 | CPU 时钟 | 外设继续跑 | 几百微安 | 任意中断 | 微秒级 |
| 停机 | 所有时钟 | RAM 与寄存器内容 | 几微安 | 外部中断边沿 | 几微秒到几毫秒 |
| 待机 | 几乎一切含 RAM | 仅唤醒逻辑与备份域 | 约 1 微安 | 唤醒引脚、RTC | 相当于重新复位 |
睡眠模式最温和:CPU 停下,外设照常工作,任何一个中断都能叫醒它。适合"外设需要连续工作、CPU 只是间歇处理"的场景,比如 ADC 连续采样、CPU 只在有结果时介入。
停机模式是大多数电池设备的日常主力:所有时钟停摆,RAM 与寄存器内容原样冻结,外部中断边沿(如按键、传感器报警线)负责叫醒。唤醒后从停机指令的下一条继续执行,几微秒内恢复干活。代价是唤醒后通常要重新使能时钟源(若用了 PLL)。
待机模式最彻底:连 RAM 都断电,1 微安上下的漏电流接近芯片休眠极限。但醒来等于重新复位,程序从头跑,运行时变量全部蒸发——需要提前把关键数据搬进由独立电池域供电的备份寄存器。适合"每天醒一次干十秒活"的极端省电场景,水表、气表是典型用户。

单看"停机时几微安"没有意义——设备大部分时间睡、偶尔醒,真正决定电池寿命的是平均电流。平均电流等于各状态电流按时间加权。假设一台设备每 10 秒醒一次,干活 20 毫秒(电流 8mA),其余时间停机(电流 5µA):平均电流约 8mA × 0.002 + 5µA × 0.998 ≈ 21µA。若把"醒"的频率从 10 秒放宽到 60 秒,平均电流骤降到约 7µA——降频醒、缩时长、拉长周期,三个旋钮拧任何一个都是数量级的收益。这就是占空比省电法:低功耗产品的设计重心从来不是"跑得省",而是"睡得多"。
/* 占空比省电的骨架代码:醒来干活,干完立刻睡 */ for (;;) { read_sensor(); /* 醒来:读传感器 */ process_and_report(); /* 处理并上报 */ enter_stop_mode_wake_on_timer(); /* 立刻停机,RTC 定时 60 秒后唤醒 */ restore_clock(); /* 唤醒后先恢复时钟树 */ }
背景:为仓库温度记录仪做电池选型,要求纽扣电池供电、每分钟记录一次温度、每天通过无线短报一次。操作:列出电流账目——传感加热与测量 3mA 持续 5ms、MCU 计算 2mA 持续 5ms、无线发送 90mA 持续 40ms、每天一次;其余时间停机 4µA。计算单日耗电:测量 3mA×5ms×1440 次 ≈ 21.6mA·s;计算 2mA×5ms×1440 ≈ 14.4mA·s;发送 90mA×40ms ≈ 3.6mA·s;停机 4µA×86400s ≈ 345.6mA·s。合计约 385mA·s 每天即约 0.107mAh 每天。一颗标称 220mAh 的 CR2032,理论寿命约 2000 天。结果:理论通过,但实际要打对折——电池自放电、低温容量衰减、无线重传都要留余量,最终按五年寿命立项。解读:这个案例的方法比数字重要——把每个状态的电流乘以时长,累加后除以电池容量,一本电流账让"能撑多久"从拍脑袋变成可验算的算术。变式:若把上报频率从每天一次提到每小时一次,发送耗电增至 86mA·s 每天仍不是大头,说明该系统里省电的杠杆在测量频率而非通信频率——先算账,再优化,别凭感觉。
低功耗不只是"睡得沉",供电链路本身也有账。稳压器的静态电流是隐形大户:一颗静态电流 5mA 的老式线性稳压器,能让芯片 1µA 的停机功耗变得毫无意义——电池产品的稳压器要选静态电流微安级(甚至百纳安级)的低功耗型号。线性稳压与开关稳压的取舍:线性稳压(LDO)噪声小、电路简单,缺点是压差大时效率低;开关稳压效率高(九成上下),代价是开关噪声与成本——数字主电源常用开关稳压,对噪声敏感的模拟前端(ADC 参考、射频)再由 LDO 收尾,两级串联取长补短。去耦电容就近放置:每颗芯片的供电引脚旁放 100nF 级陶瓷电容滤高频,整板再配几颗 10µF 级电容补低频储能——省掉它们,芯片在内部开关瞬间就会"饿到",表现为莫名其妙的复位与死机。这些内容看似属于硬件工程师,但"芯片莫名复位"的排查第一站就是量电源——软件工程师能看懂供电问题,联调时能省下大量甩锅时间。
⚠️ 低功耗设计三板斧之外的四个高频坑:其一,漏电的引脚——悬空输入引脚在门限电压附近反复翻转是隐形电流源,未用引脚按手册建议配置为模拟输入或下拉;其二,不肯睡的外设——调试串口一直开着,芯片永远睡不沉,量产后记得关;其三,测量方法错误——普通万用表量微安级动态电流会失真,要用采样电阻加示波器或专门的功耗分析仪;其四,唤醒后忘记恢复时钟——停机唤醒后 PLL 已关,直接跑串口必然乱码,唤醒序列里第一件事是恢复时钟树。
低功耗固件开发有个绕不开的别扭:芯片进了深度睡眠,调试器就掉线,断点打不进去、程序"失踪"。工程上有三个惯用解法。其一,配置调试模块在停机模式下保持供电(多数 Cortex-M 芯片有对应的 DBGMCU 配置位),代价是休眠电流暴涨——只用于调试,量产固件必须关掉,否则省电设计全部白做,这是低功耗项目最经典的"样机省电、量产废电"陷阱。其二,调试阶段先用睡眠模式替代停机模式,把逻辑跑通,最后再切换深度模式做功耗实测。其三,用一颗电流表配合 GPIO 翻转打点:在进睡眠与唤醒处各翻转一次电平,示波器上能量出真实占空比,比任何软件估算都可信。