MCU低功耗模式概览:Active、Idle、Sleep、Deep Sleep、Shutdown等模式的定义与区别
TinyML 设备通常部署在电池供电或能量采集的场景中,例如可穿戴健康监测、工业振动传感器、智能农业节点等。这些设备的核心矛盾在于:既要持续感知环境并运行轻量级神经网络推理,又必须将平均功耗控制在微安甚至纳安级别。MCU 的低功耗模式并非一个简单的“开关”,而是一套分级精细的电源与时钟管理策略。理解 Active、Idle、Sleep、Deep Sleep、Shutdown 等模式的定义、硬件行为与恢复代价,是设计 TinyML 睡眠机制的第一道门槛。本章将从 Cortex-M 内核与主流 MCU(如 STM32、nRF52、ESP32)的视角,系统拆解这些模式的本质区别。
上图展示了 MCU 低功耗模式的连续谱系。从 Active 到 Shutdown,功耗逐级下降,但恢复延迟和唤醒源限制也逐级增加。TinyML 工程师需要根据推理任务的周期性和实时性要求,选择最合适的睡眠深度。例如,一个每 10 秒采集一次加速度数据并运行 1 毫秒推理的跌倒检测设备,在非工作期间应进入 Deep Sleep 而非 Sleep,因为 Sleep 模式下外设时钟保持会浪费大量能量。
核心原理:电源域、时钟域与内核状态的协同控制
理解低功耗模式的关键在于三个维度:电源域(Power Domain)、时钟域(Clock Domain)和内核执行状态(Core State)。现代 MCU 内部被划分为多个电源域,例如 STM32L4 系列包含 VDD 主域、VCORE 内核域、VBAT 备份域等。低功耗模式的本质是逐级切断非必要电源域的供电,同时关闭对应时钟源。
- Active 模式:所有电源域上电,所有时钟源(HSI、HSE、PLL)运行,CPU 全速执行。此时功耗最高,但性能最强。TinyML 推理通常在此模式下进行,因为需要大量乘加运算。
- Idle 模式(WFI/WFE):CPU 内核时钟停止,但外设时钟(如 SPI、I2C、DMA)仍保持运行。任何中断或事件均可唤醒。此模式适合等待外设数据就绪的短暂间隙,例如等待 DMA 搬运完传感器数据。
- Sleep 模式:在 Cortex-M 中,Sleep 模式通常指关闭 CPU 时钟,但保留所有外设时钟和 RAM。在 STM32 中,Sleep 模式进一步分为 Sleep(仅 CPU 停止)和 Low-power Sleep(降低稳压器输出)。此模式下,系统时钟(如 SysTick)可能仍在运行,但 CPU 不执行指令。
- Deep Sleep 模式:这是 TinyML 设备最常用的模式。在 STM32 中对应 Stop 模式,在 nRF52 中对应 System OFF 模式。此时,高频时钟(HSE/HSI)被关闭,主稳压器进入低功耗状态,仅保留低速时钟(LSI/LSE)供 RTC 和独立看门狗使用。RAM 内容是否保留取决于具体配置(如 STM32 的 SRAM1/SRAM2 可独立保持)。
- Shutdown 模式:最深的睡眠状态。在 STM32 中对应 Standby 模式,在 nRF52 中对应 System OFF。此时,除备份域(备份寄存器、RTC)和唤醒逻辑外,所有电路均断电。RAM 内容丢失,程序必须从复位向量重新执行。唤醒只能通过特定引脚(如 WAKEUP 引脚)、RTC 闹钟或复位。
关键区别总结:Idle 与 Sleep 的主要差异在于外设时钟是否保留;Deep Sleep 与 Sleep 的差异在于高频时钟和主稳压器是否关闭;Shutdown 与 Deep Sleep 的差异在于 RAM 是否保持以及是否需要复位唤醒。在 TinyML 场景中,模型权重和中间变量通常存储在 RAM 中,因此选择 Deep Sleep 而非 Shutdown 可以避免每次唤醒后重新加载模型。
判断方法:如何根据应用场景选择正确的低功耗模式
选择低功耗模式需要综合考虑三个因素:唤醒延迟容忍度、数据保持需求和外设工作需求。以下是一个实用的决策流程:
- 评估任务周期:如果推理任务间隔小于 1 秒,建议使用 Sleep 模式,因为频繁进入 Deep Sleep 的唤醒延迟(通常数百微秒到数毫秒)会占据大量时间。如果间隔大于 10 秒,Deep Sleep 是更优选择。
- 检查 RAM 保持需求:如果模型权重(如 TensorFlow Lite Micro 的模型数组)存储在 Flash 中,且推理前需要从 Flash 加载到 RAM,则 Shutdown 模式也可接受。但如果模型常驻 RAM 且重新加载耗时较长,必须选择 Deep Sleep 以保持 RAM 供电。
- 确认唤醒源:Deep Sleep 模式通常只支持 RTC 闹钟、外部中断(如 GPIO 边沿触发)和比较器唤醒。如果应用需要 UART 或 I2C 唤醒,则必须使用 Sleep 模式,因为这些外设的时钟在 Deep Sleep 中会被关闭。
- 测量实际功耗:使用开发板上的电流测量跳线或高精度万用表,分别测量各模式下的电流。注意,数据手册中的典型值是在理想条件下测得的,实际值可能因温度、电压和外设配置而偏差 20% 以上。
| 模式 | CPU 状态 | 外设时钟 | RAM 保持 | 典型唤醒延迟 | 典型功耗(STM32L4) |
|---|---|---|---|---|---|
| Active | 运行 | 全部使能 | 完整 | — | ~100 μA/MHz |
| Idle (WFI) | 停止 | 全部保持 | 完整 | ~1 μs | ~1-5 mA |
| Sleep | 停止 | 可选保持 | 完整 | ~5 μs | ~500 μA |
| Deep Sleep (Stop) | 停止 | 仅低速时钟 | 可选 | ~50-200 μs | ~3-10 μA |
| Shutdown (Standby) | 复位 | 全部关闭 | 丢失 | ~1-5 ms | ~0.3-1 μA |
经验法则:对于 TinyML 设备,如果唤醒后需要执行 tflite::MicroInterpreter::Invoke() 进行推理,建议使用 Deep Sleep。因为推理本身需要毫秒级时间,而 Deep Sleep 的唤醒延迟(数百微秒)相对可接受。如果唤醒后仅需读取一个 GPIO 状态并立即再次睡眠,则 Shutdown 模式更合适。
案例拆解:智能门磁传感器的低功耗模式设计
以一个典型的智能门磁传感器为例,该设备使用 STM32L031 和霍尔传感器,每 100 毫秒检测一次门开关状态,并通过 BLE 发送事件。初始设计使用 Sleep 模式,但实测电池(CR2032,225 mAh)寿命仅 3 个月,远低于预期的 12 个月。
初始现象与数据:通过电流探头测量,Sleep 模式下电流为 450 μA,Active 模式(含 BLE 发送)平均电流为 15 mA,每次发送持续 20 ms。设备每 100 ms 唤醒一次,每次唤醒后运行 2 ms 的检测代码,然后进入 Sleep。平均电流计算如下:
平均电流 = (2ms × 15mA + 98ms × 0.45mA) / 100ms
= (30 + 44.1) / 100
= 0.741 mA
电池寿命 = 225 mAh / 0.741 mA ≈ 303 小时 ≈ 12.6 天
实际寿命 3 个月是因为设备并非持续运行,而是门开关事件触发 BLE 发送,但 100 ms 的轮询周期导致大部分时间处于 Sleep 模式。问题在于 Sleep 模式保留了所有外设时钟,包括 SPI 和 GPIO 的时钟,这些时钟在空闲时仍然消耗能量。
优化方案:将轮询周期从 100 ms 延长到 500 ms,并改用 Deep Sleep 模式。霍尔传感器通过外部中断(EXTI)唤醒 MCU,而不是轮询。具体步骤如下:
- 配置霍尔传感器输出连接到 PA0(EXTI0),使能上升沿和下降沿中断。
- 在进入 Deep Sleep 前,关闭 SPI、I2C 等外设时钟,仅保留 LSI 时钟供 RTC 使用。
- 设置 RTC 闹钟为 500 ms 周期,作为备用唤醒源(防止霍尔传感器失效)。
- 在唤醒后,先检查唤醒标志:如果是 EXTI 中断,则读取门状态并发送 BLE;如果是 RTC 闹钟,则仅清除标志并重新进入 Deep Sleep。
结果对比:优化后,Deep Sleep 电流降至 3.5 μA,Active 模式(含 BLE 发送)平均电流为 12 mA,每次发送 20 ms。假设每天门开关 50 次,每次触发一次 BLE 发送:
每日 Active 时间 = 50 × 20ms = 1s
每日 Deep Sleep 时间 = 86400s - 1s = 86399s
平均电流 = (1s × 12mA + 86399s × 0.0035mA) / 86400s
= (12 + 302.4) / 86400
≈ 0.00364 mA
电池寿命 = 225 mAh / 0.00364 mA ≈ 61813 小时 ≈ 7 年
风险与代价:Deep Sleep 模式下,霍尔传感器的供电需要从 VDD 切换到 VBAT 或通过 GPIO 控制,否则传感器本身会消耗额外电流。此外,BLE 模块(如 nRF24L01)在 Deep Sleep 前必须进入 Standby 模式,否则其待机电流可能高达 1 mA。本案例中,BLE 模块通过一个 MOSFET 开关控制电源,在 Deep Sleep 期间完全断电。
重要提醒:不要仅依赖数据手册的典型功耗值。实际测量时,注意 PCB 上的漏电流(如去耦电容的漏电、焊盘残留助焊剂)可能比 MCU 的 Deep Sleep 电流还大。建议在原型阶段使用 STM32CubeMonitor-Power 或 J-Link Power Debug 工具进行长时间电流记录。
常见误区与总结复盘
在低功耗模式设计中,工程师常犯以下错误:
- 误区一:认为 Sleep 和 Deep Sleep 差别不大。实际上,Sleep 模式下外设时钟保持运行,电流可能高达数百微安,而 Deep Sleep 可降至微安级。对于电池供电设备,这可能是数周与数月的寿命差异。
- 误区二:忽略 GPIO 的浮空输入电流。在进入低功耗模式前,未使用的 GPIO 应配置为模拟输入或输出低电平,否则浮空输入会通过内部上拉/下拉电阻产生额外电流。
- 误区三:唤醒后未清除中断标志。如果 EXTI 中断标志未清除,MCU 会立即再次唤醒,导致无法进入睡眠,形成“假死”状态。
- 误区四:在 Deep Sleep 中保留不必要的 RAM 区域。STM32 的 SRAM 可以按区域关闭,如果模型权重存储在 Flash 中,可以关闭部分 SRAM 以进一步降低功耗。
总结复盘:低功耗模式的选择本质上是性能、延迟和功耗的三角权衡。TinyML 设备应遵循“最小唤醒时间”原则:在满足实时性要求的前提下,尽可能缩短 Active 时间,并选择最深的睡眠模式。同时,必须建立完整的功耗预算表,将 MCU、传感器、无线模块和电源转换效率全部纳入计算。建议在项目初期就使用低功耗评估板(如 STM32L4 Discovery Kit)进行功耗摸底,而不是等到 PCB 完成后再优化。
设计检查清单:① 确认所有外设时钟在睡眠前关闭;② 将未使用 GPIO 配置为模拟模式;③ 验证唤醒源是否配置正确且中断标志可清除;④ 测量实际睡眠电流并与数据手册对比;⑤ 在电池输入端串联 10Ω 采样电阻,使用示波器观察电流波形,确认没有异常尖峰。