MCU 低功耗入门:低功耗单片机、唤醒源和「睡着也能干活」的外设
更新时间:2026-09-15。本文是「集成电路大类 · 低功耗设计与验证」入门层系统篇第 23 篇。前面讲的时钟门控、电源门控、分级睡眠,落到电池供电的单片机上会呈现出一种很不一样的编程思维:CPU 不是主角,它大部分时间在睡觉,真正长期站岗的是一小撮低功耗外设。 谁能让内核少醒、每次醒得短、睡得更深,谁的产品就能用一颗纽扣电池撑几年。本文把硬件睡眠等级、唤醒源、外设自治和软件写法串成一条可落地的线。睡眠分级的硬件原理见待机与睡眠模式,系统地图见低功耗导读。
本文要回答的问题
- 低功耗 MCU 和普通 MCU 在设计思路上最大的不同是什么?
- 传感器节点为什么不能用「while 循环不停查」,要改成事件驱动?
- 睡着的时候,谁在替 CPU 盯着外部世界?
- DMA、低功耗比较器/ADC/UART 是怎么做到「不叫醒 CPU 也能干活」的?
- 软件上怎么正确地让 MCU 睡下去、再被叫醒?
一、核心哲学:从「轮询」到「事件驱动」
新手写电池设备常犯的错误是让 CPU 一直跑着、循环查询传感器或按键(polling)。这时主控处在 active 态,几十毫安说没就没。低功耗的根本转变是事件驱动(interrupt/event-driven):
- 默认状态:内核停在最深的可行睡眠档,只有必须常开的电路有电;
- 外部或定时事件发生:由专门的低功耗检测电路发现,触发唤醒;
- 内核醒来,用最短时间处理(采样、计算、发包);
- 处理完立刻回到深睡。
这正是把 race-to-idle 做到极致:比「慢慢算」更省的是「快速干完然后彻底睡着」,因为深睡电流只有活跃时的万分之一量级。但前提是切换/唤醒开销摊得薄、活跃占空比极低(取舍见三种省电模式对比)。

二、第一支柱:选对睡眠等级、管住唤醒时间
MCU 的睡眠阶梯在第 22 篇已展开,落到 MCU 通常是:
| 等级 | 典型名字 | 内核 | RAM/寄存器 | 还能工作的模块 | 量级 / 唤醒 |
|---|---|---|---|---|---|
| 浅睡 | Sleep/WFI | CPU 时钟停 | 全保留 | 外设、时钟基本在 | 立刻/µs 级,省 CPU 动态电 |
| 深睡 | Stop/Deep-sleep | 停 | RAM retention、寄存器留 | RTC、低功耗定时器/比较器、部分中断 | 几~几十 µA,几十 µs~ms |
| 关断 | Standby/Off/Shutdown | 断电 | 仅备份寄存器 | RTC、唤醒引脚、复位逻辑 | nA~亚 µA,ms 级近冷启动 |
选档原则:在「能赶上要求的响应时间」前提下选最深的一档。 需要微秒级响应串口就只能浅睡;几分钟采一次温度、没有实时性要求,就大胆进关断态。唤醒时间(起振、稳压器恢复、PLL 锁定、冷启动初始化)是真实成本,要查 datasheet 的 wake-up time 并计入能量账。
三、第二支柱:让「对的唤醒源」直接叫醒系统
睡得深还能感知世界,靠的是一组在低功耗下仍工作的唤醒源。设计原则是:能由外设直接判断的,绝不为了判断而先唤醒 CPU。
- RTC / 低功耗定时器:周期唤醒的主力,定时到点产生中断。表计、手环靠它实现「每 N 毫秒/秒/分醒一次」。
- GPIO/外部中断(EXTI):按键、磁簧、传感器就绪线;很多 MCU 支持在关断态由特定引脚沿跳变唤醒。
- 模拟比较器 / ADC 窗口:让比较器盯着电池电压或传感器模拟量,越过阈值才唤醒 ADC/CPU,而不是让 ADC 一直采样。
- 接口活动检测:低功耗 UART 检测起始位、I²C 从机地址匹配、CAN/LIN 报文、无线电(BLE/Sub-GHz)收到匹配报文或前导码再唤醒主控——这类「地址唤醒/报文过滤」是无线节点省电的关键(避免无关广播也叫醒 CPU)。
- 掉电/复位检测(BOR/PVD):监测供电,保证低电压下行为安全。
很多低功耗 MCU 还有一条异步唤醒逻辑(always-on 域):它用低速时钟、厚氧高阈值器件做成,功耗极低但能异步接收引脚/定时器事件并负责拉起主域(常开岛概念见后续《SoC 电源架构》篇)。
四、第三支柱:外设「睡着也能干活」——自治与 DMA
深睡期间若所有事都得 CPU 醒着做,省电就无从谈起。低功耗 MCU 让一批外设脱离 CPU 自主运行:
- DMA 搬运:ADC 采样结果、UART/SPI 数据流可由 DMA 在不需要 CPU 指令的情况下直接搬进 RAM,CPU 只需在一块缓冲采满时被中断唤醒一次做批量处理,而不是每个字节醒一次。
- ADC + 比较器/看门狗自治:定时触发 ADC 采样、阈值越限才中断;窗口看门狗在睡眠中计时。
- 低功耗串行接口:UART/I²C/SPI 在低功耗时钟下保持地址/起始位侦测,收到和自己相关的通信才拉时钟、叫内核。
- 定时器/PWM 自主输出:电机/LED 调光等按硬件定时运行,不必 CPU 干预。
- 状态保持快速续跑:深睡时 RAM retention 保住变量和外设配置,醒来不用重新初始化全部寄存器,缩短活跃时间。
判断一个低功耗方案好不好,常看一个指标:「每处理一个事件,CPU 实际要醒多久、醒几次」。DMA + 外设自治能把「每字节醒一次」降成「每缓冲/每事件醒一次」,活跃占空比数量级地下降。
五、软件写法:让 MCU 正确地「睡—醒—干—睡」
事件驱动要落到代码习惯上,典型低功耗主循环长这样(以通用概念示意,非某厂 API):
// 初始化:配置外设 + DMA,注册中断,外设能自治的全部交给硬件
adc_dma_init(); // ADC→DMA→buffer,采满才中断
rtc_set_periodic(600); // 10 分钟周期唤醒
enable_irq();
for (;;) {
// 没事件时进入最深可行睡眠;WFI 让 CPU 停钟等待中断
enter_lowest_power_mode_allowed(); // 深睡/关断,RTC/唤醒引脚仍站岗
// —— 被某个中断唤醒后 ——
if (event == RTC_WAKEUP) {
start_adc_dma(); // ADC+DMA 自己采样搬运,CPU 不忙等
// 再次 WFI,等 DMA 半满/全满中断,而不是 while 轮询
wait_for_irq();
packetize_and_tx(); // 数据就绪:打包、开无线电、尽快发完
} // 回循环顶部,立刻再次深睡
}要点:
- 用 WFI/WFE + 中断代替忙等:绝不要
while(!flag);空转等外设。 - 让 DMA 批量搬、外设自主跑:把 CPU 从逐字节/逐采样的轮询里解放出来(见第四节)。
- 睡前妥善关断、醒后快速恢复:关掉不用的时钟门控和外设、把 I/O 配成不漏电的状态、用 RAM retention 保住上下文以缩短重启;注意稳压器模式切换、起振时间。
- 处理唤醒源的「假醒」与竞争:多个中断、唤醒后清除标志,避免刚睡又被残留标志抖醒。
- 关断态区分冷热启动:用复位标志判断是上电冷启动还是关断唤醒,后者从备份寄存器恢复最小上下文。
六、一个传感器节点的完整能量账
设温度节点:每 10 分钟(600s)一个周期,RTC 唤醒后活跃 50ms(含起振、ADC+DMA 采样、MCU 打包、无线电发送),活跃平均电流 30mA@3V;其余时间进关断态深睡,深睡电流(含 RTC、保持、唤醒检测)2µA。
- 每周期活跃电荷:
30mA × 0.05s = 1.5 mA·s; - 摊到 600s 的平均活跃电流:
1.5 / 600 = 0.0025mA = 2.5µA; - 深睡平均:
2µA; - 总平均电流 ≈ 4.5µA(再加上无线电发送峰值、稳压器效率、起振损耗会略高,工程上要留余量)。
一节 CR2032 约 220mAh(在 3V 下约 0.66Wh,换算见电池能量预算):理论寿命 220mAh / 0.0045mA ≈ 48,900h ≈ 5.6 年(实际受自放电、低温容量、发送占空比影响,常按 3~5 年设计)。
两个工程结论:①占空比极低时,2µA 深睡和 30mA 活跃对平均电流贡献相当,压低深睡电流和压缩活跃时长同样重要;②无线电/传感器往往是活跃电流峰值大户,能用更低占空比、更低发射功率、更短发送时间(报文过滤、数据聚合)省下的电,比优化 MCU 运算更显著(外设是功耗大头,见后续外设功耗篇)。
七、选型与评审 checklist(MCU 侧)
- 目标最深睡眠档在真实外设配置(RAM retention 容量、RTC、BOR、稳压器模式、温度)下的电流,而不是 datasheet 最小值;
- 各唤醒源能否在最深档工作、唤醒延迟是否满足实时性;
- 是否有 DMA、低功耗比较器/ADC、地址匹配接口、无线电前导码唤醒等自治能力;
- 起振/稳压器切换/冷启动时间和能耗计入占空比账;
- 工作电压与电池放电曲线、DC-DC vs LDO 效率(供电侧见后续《PMIC》篇);
- 软件是否彻底事件驱动、无忙等、无多余周期性中断。
八、通信才是大头:无线节点的能量要按「焦耳每比特」算
对 IoT 节点,MCU 运算往往不是能耗主角,无线电才是。一次 BLE/Sub-GHz 发射的瞬时电流可达 10~30mA(是 MCU active 的数倍),因此无线低功耗有一套独立直觉,核心指标是焦耳/有效比特和无线电的工作占空比:
- 发射时间比发射功率更关键:一次通信能耗 ≈ 发射电流 × 在线时长。提高比特率、减少前导码/握手往返、把多次小包聚合成一次大包(data aggregation/batching),常常比单纯降发射功率更省;
- 接收/监听同样耗电:射频接收机常开等报文的电流很大,靠前导码唤醒(WOR)、时隙同步、连接事件间隔拉长,让无线电绝大部分时间关闭;
- 片上处理换片上传输:在本地用极低功耗 MCU 先做阈值判断、特征提取、压缩,只有「值得报」的数据才开无线电——传一个原始波形不如传一个「异常」标志;
- 唤醒越精准越好:报文地址过滤保证邻居的通信不把本机主控叫醒。
把它并入第六节的账:若把每周期一次的无线发送从 20ms 压到 5ms@20mA,单周期活跃电荷立刻少 0.3mA·s(折平均 0.5µA),降幅可观。这与传感器端「少采样、只在越限时采」是同一种「先在本地判断、把贵的资源(无线/高功耗 ADC/主控)占空比压到最低」的哲学。系统设计常按能量来源排序优化:先砍通信,再砍传感/稳压,最后才抠 MCU 运算,和手段全景「先治占比最大那一摊」的原则一致(接口/PHY 常是功耗大头,后续外设功耗篇展开)。
这一篇在知识体系里的位置
- 睡眠分级与多模式电流表 → 上一篇《待机与睡眠模式》;
- 三招如何按空闲尺度使用 → 三种省电模式对比;
- 续航倒推与 mAh/Wh → 电池与能量预算;
- 常开岛与电源架构 → 后续《SoC 电源架构直觉》篇;
- 另一侧的复杂系统 → CPU 电源管理入门。
总结
一句话总结:低功耗 MCU 的设计哲学是事件驱动而非轮询——让 CPU 默认停在「能赶上响应截止时间的最深睡眠档」,由一小撮在低功耗常开域(低速时钟、厚氧高阈值器件)里运行的电路替它长期站岗,条件满足才通过中断把内核唤醒,用最短时间配合 DMA 干完采样/计算/发送就立刻睡回去,因为深睡电流(亚微安到几十纳安)只有活跃电流(几十毫安)的万分之一量级,能否省电取决于「让 CPU 少醒、每次醒得短、睡得深」。三根支柱分别是:按实时性在 sleep(停 CPU 时钟、µs 醒)、deep-sleep(停 PLL、RAM retention、只留 RTC、几十微安)、standby/off(电源门控、只留 RTC/唤醒引脚/备份寄存器、纳安级但毫秒冷启动)之间选档并把唤醒时间计入成本;用对唤醒源(RTC 闹钟、GPIO 沿、低功耗定时器、比较器/ADC 窗口阈值、UART 起始位/I²C 地址匹配/无线电前导码与报文过滤),让模拟和接口模块在不叫醒 CPU 的前提下直接判断,无关事件不要唤醒系统;以及外设自治,用 DMA 在无 CPU 指令下把 ADC/串口数据批量搬进 RAM、让低功耗比较器/ADC/定时器在睡眠中工作、用 RAM retention 保住上下文快速续跑,把「每字节醒一次」降为「每缓冲/每事件醒一次」。软件上要用 WFI/WFE 加中断代替 while 忙等、睡前关断不用的时钟和 I/O、醒后快速恢复并处理假醒与冷热启动。可验算的温度节点账(10 分钟周期、活跃 50ms/30mA、深睡 2µA)显示活跃与深睡对平均电流的贡献各约 2.5µA 和 2µA、总计约 4.5µA,对应一节 CR2032 理论约 5.6 年(实际按 3~5 年留余量),说明低占空比下压低深睡电流、压缩活跃时间(尤其无线电/传感器峰值)和降低发送占空比比优化 MCU 运算更关键。