4、低功耗设计原则:功耗来源(动态、静态、外设)、低功耗模式(睡眠、深度睡眠、待机)、功耗测量方法
TinyML 设备通常由电池或能量采集系统供电,其功耗预算往往被限制在微瓦到毫瓦级别。对于周期性采样任务而言,系统并非持续满负荷运行,而是遵循“采样—处理—传输—休眠”的循环节奏。因此,低功耗设计的核心并非单纯降低某一时刻的电流,而是最小化整个任务周期内的平均功耗。本章将系统拆解功耗的三大来源(动态、静态、外设),深入解析 MCU 的三种典型低功耗模式(睡眠、深度睡眠、待机),并给出可落地的功耗测量方法与工程判断依据。
上图给出了本章的完整知识框架:功耗来源决定了优化方向,低功耗模式提供了可选的运行状态,而测量方法则是验证优化效果的唯一依据。三者构成闭环,缺一不可。下面逐一展开。
4.1 功耗来源:动态、静态与外设
4.1.1 核心原理
MCU 系统的功耗由三部分构成,理解其物理机制是优化的前提。
- 动态功耗:由 CMOS 电路翻转产生。公式为 \(P_{dyn} = \alpha \cdot C_L \cdot V_{DD}^2 \cdot f\),其中 \(\alpha\) 是翻转率,\(C_L\) 是负载电容,\(V_{DD}\) 是供电电压,\(f\) 是时钟频率。动态功耗与电压的平方成正比,因此降低电压是最高效的手段,其次是降频和减少不必要的翻转。
- 静态功耗:由晶体管漏电流(亚阈值漏电、栅极漏电)造成。即使时钟停止,只要供电存在,漏电就存在。先进制程(如 28nm 以下)漏电占比显著上升,对电池供电设备影响很大。
- 外设功耗:传感器、无线模块(BLE/WiFi)、ADC、DAC、外部存储器等独立于 MCU 内核的功耗。外设功耗往往远高于 MCU 自身,且不受 CPU 睡眠状态控制,必须单独管理。
4.1.2 判断方法
在工程实践中,可通过以下步骤定位功耗大户:
- 查阅芯片数据手册中的
IDD参数(运行、睡眠、深度睡眠、待机各状态电流)。 - 使用电流探头分别测量内核供电和外设供电支路,区分内外功耗。
- 通过软件逐模块使能/禁用外设时钟,观察电流变化,定位高耗外设。
4.1.3 案例拆解:环境监测节点的功耗审计
某环境监测节点使用 STM32L0 系列 MCU,挂载 SHT30 温湿度传感器和 SX1276 LoRa 模块。初始设计为每 60 秒采样一次并上报。实测平均电流为 45μA,超出目标 10μA。通过逐模块测量发现:LoRa 模块在睡眠模式下仍消耗 1.6μA(未完全关断),SHT30 在测量间隙未进入睡眠,额外消耗 3.2μA。优化措施:将 LoRa 的 DIO0 引脚配置为中断唤醒,并在非发送时段将其置于 Sleep 模式;SHT30 每次采样后立即发送 0x0157 命令进入睡眠。优化后平均电流降至 8.7μA,满足电池寿命要求。
4.1.4 常见误区
- 误区一:只关注 MCU 内核电流,忽略外设。实际上外设常占系统总功耗的 60% 以上。
- 误区二:认为降频一定省电。若任务必须在 10ms 内完成,降频导致运行时间延长,动态功耗可能不变甚至增加。
- 误区三:忽略电压调节。使用 LDO 将 3.7V 降至 1.8V 时,LDO 自身损耗为 (3.7-1.8)×I,若电流 10mA,损耗达 19mW,远超 MCU 功耗。此时应使用 DC-DC。
4.2 低功耗模式:睡眠、深度睡眠与待机
4.2.1 核心原理
ARM Cortex-M 系列 MCU 提供多种低功耗模式,其本质是关闭不同数量的时钟和电源域。以 STM32L4 为例:
| 模式 | CPU | SRAM | 外设时钟 | 唤醒源 | 典型电流 | 唤醒时间 |
|---|---|---|---|---|---|---|
| Sleep | 停止 | 保留 | 可配置 | 任意中断 | ~100μA | ~2μs |
| Deep Sleep (Stop) | 停止 | 保留 | 关闭(可保留 RTC/LPTIM) | RTC、外部中断、LPTIM | ~1μA | ~10μs |
| Standby | 断电 | 丢失 | 全部关闭 | RTC、WKUP 引脚、复位 | ~0.3μA | ~100μs |
选择模式的核心依据是唤醒后是否需要保留 RAM 数据以及允许的唤醒延迟。对于周期性采样任务,若采样间隔大于 100ms,通常使用 Deep Sleep;若间隔大于数秒且无需保留中间数据,可考虑 Standby。
4.2.2 操作流程
- 确定任务周期和唤醒源(RTC 定时、外部传感器中断、定时器)。
- 根据是否需要保留 RAM 数据选择模式:需要保留则用 Deep Sleep,否则可用 Standby。
- 配置唤醒源:RTC 闹钟、LPTIM 超时、GPIO 外部中断。
- 在进入低功耗前,关闭不必要的外设时钟,将 GPIO 设置为模拟输入或固定电平,避免浮空输入导致的额外漏电。
- 使用
__WFI()或__WFE()指令进入模式。
4.2.3 实战场景:电池供电的温湿度记录仪
设备每 5 分钟采集一次数据并存储到 Flash,要求电池续航 2 年(CR2032,容量 220mAh)。计算可得平均电流需小于 12.5μA。方案:使用 Deep Sleep 模式,RTC 定时 5 分钟唤醒。唤醒后启动传感器(耗时 20ms),读取数据(10ms),写入 Flash(25ms),然后重新进入 Deep Sleep。实测平均电流 9.8μA,满足要求。若改用 Standby,则每次唤醒需重新初始化 RAM 和传感器,增加 5ms 启动时间,但待机电流降至 0.3μA,平均电流可进一步降至 7.2μA,但代码复杂度增加。
HAL_PWR_EnterSTOPMode() 时,第二个参数选择 PWR_STOPENTRY_WFI 可确保正确进入。
4.2.4 常见误区
- 误区一:认为 Standby 永远最好。若任务需要频繁唤醒(如每 10ms 一次),Standby 的唤醒时间(100μs)和 RAM 丢失导致的重新初始化开销反而使平均功耗更高。
- 误区二:忽略 GPIO 状态。浮空输入引脚会因电压波动产生额外漏电,甚至导致 MCU 无法进入最低功耗模式。
- 误区三:唤醒后未恢复时钟配置。从 Deep Sleep 唤醒后,系统时钟可能恢复为默认 MSI,若未重新配置为 HSE/PLL,会导致任务执行时间变长,动态功耗增加。
4.3 功耗测量方法
4.3.1 核心原理
功耗测量的难点在于宽动态范围:系统在活跃时电流可达数十毫安,而睡眠时低至微安级,跨度超过 4 个数量级。普通万用表无法准确捕捉瞬态电流,必须使用专用工具或方法。
4.3.2 测量方法对比
| 方法 | 原理 | 精度 | 带宽 | 适用场景 |
|---|---|---|---|---|
| 串联电阻 + 示波器 | 测量采样电阻两端压降 | 中等(±5%) | 高(>100MHz) | 捕捉瞬态电流尖峰 |
| 电流探头(霍尔/罗氏线圈) | 非接触测量 | 高(±1%) | 高 | 高频动态电流 |
| 高精度功耗仪(如 Nordic PPK2) | 积分采样 | 极高(nA 级) | 中等(~100kHz) | 长时间平均功耗测量 |
| 万用表(积分模式) | 平均电流 | 低(无法测瞬态) | 极低 | 仅用于粗略估算 |
4.3.3 操作流程(以 Nordic PPK2 为例)
- 将 PPK2 串联在电源与目标板之间,设置为
Ampere Meter模式。 - 配置采样率为 100kHz,测量时长覆盖至少 3 个完整任务周期。
- 运行设备,记录电流波形。
- 使用软件计算平均电流、峰值电流、各阶段(活跃/睡眠)电流和持续时间。
- 根据平均电流和电池容量估算续航:\(T_{battery} = \frac{C_{battery}}{I_{avg}}\)。
4.3.4 案例拆解:定位异常唤醒电流
某设备在 Deep Sleep 模式下实测电流为 15μA,远高于数据手册的 1μA。使用示波器 + 1Ω 采样电阻测量,发现每 1ms 出现一个 200μA、持续 20μs 的电流尖峰。分析代码发现,定时器 TIM2 未关闭,仍在产生更新中断,导致 MCU 频繁从 Deep Sleep 唤醒。修复:在进入 Deep Sleep 前关闭 TIM2 并禁用其中断。修复后电流降至 1.2μA。此案例说明,测量不仅要看平均值,更要观察波形细节。
4.3.5 总结复盘
- 测量前先确认工具的量程和带宽,避免损坏设备或得到错误数据。
- 测量时保持设备处于真实工作状态,避免调试器(如 ST-Link)连接,因为调试器本身会供电并影响电流。
- 记录环境温度和电压,因为漏电流对温度敏感,温度每升高 10°C,漏电约翻倍。
- 最终验证应使用电池实测,而非仅依赖电源模拟器,因为电池内阻会影响峰值电流下的电压跌落。