2. MCU功耗模型解析:动态功耗与静态功耗、工作模式与睡眠模式、唤醒源分析

做低功耗设计,你得先搞清楚电都耗在哪了。很多人一上来就调睡眠模式,结果发现电池还是掉得飞快——说白了,你连功耗的构成都没摸透。

这一节,我带你把MCU的功耗模型拆开来看。搞懂了这些,后面做ThreadX的功耗管理才有根有据。

2.1 动态功耗与静态功耗

MCU的功耗,归根结底就两大类:动态功耗和静态功耗。它们产生的机理完全不同,优化手段也天差地别。

功耗类型 产生原因 主要影响因素 典型占比(运行态)
动态功耗 晶体管开关动作,对负载电容充放电 工作频率、电压、活动因子 70% ~ 90%
静态功耗 漏电流(亚阈值漏电、栅极漏电等) 工艺制程、温度、电压 10% ~ 30%

动态功耗,你可以理解为“干活消耗的电”。CPU在跑代码、外设在传数据,门电路在0和1之间来回跳变,每一次跳变都要消耗能量。公式很简单:P_dynamic = C × V² × f。C是负载电容,V是工作电压,f是切换频率。你看,电压是平方项,所以降电压是降动态功耗最狠的手段。

静态功耗,则是“躺着也耗电”。晶体管即使不开关,源极和漏极之间也会有漏电流。工艺越先进,漏电越严重。我做过一个28nm的MCU项目,室温下静态功耗还能接受,但温度一上到85°C,漏电流翻了好几倍,直接让待机电流崩了。

关键认知: 动态功耗主导运行态,静态功耗主导睡眠态。低功耗设计,就是在不同场景下分别压制这两类功耗。

2.2 工作模式与睡眠模式

现代MCU不会只有“开机”和“关机”两种状态。为了平衡性能和功耗,芯片内部设计了多个功耗层级。我习惯把它们分成三大类:

  • 运行模式(Run Mode):CPU全速执行代码,所有外设可用。功耗最高,动态功耗占大头。
  • 睡眠模式(Sleep Mode):CPU时钟停止,但外设和RAM保持供电。可以快速唤醒,适合短时等待。
  • 深度睡眠模式(Deep Sleep Mode):CPU、大部分外设、甚至RAM都掉电或进入低功耗保持状态。唤醒延迟大,但静态功耗极低。

不同厂商的叫法不一样。ST叫Sleep、Stop、Standby;NXP叫RUN、WAIT、STOP、VLPS。但底层逻辑是一样的——用唤醒时间换功耗。

模式 CPU状态 RAM保持 典型电流 唤醒时间
运行 运行 是 mA级 —
睡眠 停止 是 几百μA 几μs
深度睡眠 掉电 可选 几μA 几百μs~ms

我的经验: 不要一上来就追求最低功耗模式。我曾经在一个传感器节点项目里,直接用了深度睡眠,结果每次唤醒要花1ms,导致采样周期抖动太大,数据全废了。后来改成了睡眠模式+快速唤醒,功耗只多了20%,但系统稳定性好了很多。

2.3 唤醒源分析

MCU睡着了,怎么叫醒它?这就是唤醒源的事。不同的睡眠模式,可用的唤醒源不一样。选错了,要么叫不醒,要么功耗白降。

常见的唤醒源有这几类:

  • GPIO中断:最灵活,任何外部电平变化都能唤醒。但要注意,深度睡眠下可能只有特定引脚支持。
  • 定时器:RTC(实时时钟)是最常用的,能在深度睡眠下保持计时。我习惯用RTC做周期性唤醒,比如每秒钟醒来一次采集数据。
  • 通信外设:UART、I2C、SPI的接收中断。适合做“按需响应”的场景,比如收到命令才处理。
  • 比较器/ADC:模拟信号触发。比如电池电压低于阈值时唤醒报警。
  • 复位引脚:最粗暴的方式,但通常不用于正常唤醒流程。

避坑指南: 我曾经在一个项目中,把UART接收中断配置为唤醒源,结果没注意在深度睡眠模式下UART时钟被关了,中断根本触发不了。系统一直睡死,直到看门狗复位才发现。所以,一定要查数据手册里每个唤醒源在对应睡眠模式下是否可用。

2.4 功耗模型知识图谱

下面这张图,把MCU功耗模型的核心关系串起来了。你可以把它当作后续设计的“导航图”。

MCU功耗模型知识图谱 MCU功耗模型 动态功耗 静态功耗 开关损耗 短路损耗 亚阈值漏电 栅极漏电 工作模式 运行模式 睡眠模式 深度睡眠模式 唤醒源 GPIO中断 定时器/RTC 通信外设 比较器/ADC 复位引脚 核心关系:动态功耗主导运行模式,静态功耗主导睡眠模式;唤醒源的选择决定了睡眠深度和响应速度。

2.5 实际项目中的权衡

理论讲完了,说点实际的。你在做低功耗设计时,脑子里要时刻绷紧三根弦:

  1. 不要只看数据手册的“典型值”。数据手册上写的睡眠电流,通常是在25°C、最优条件下测的。实际产品在高温下,静态功耗可能翻倍。我建议你留出50%的余量。
  2. 唤醒时间不是免费的。深度睡眠虽然电流低,但唤醒后要重新初始化时钟、锁相环、外设,这段时间的功耗累积可能比一直睡在浅睡眠还高。你得算总账。
  3. 唤醒源要匹配睡眠模式。不是所有唤醒源在所有模式下都能用。比如,深度睡眠下,普通定时器可能已经掉电了,只能用RTC。这个坑我踩过不止一次。

一个小技巧: 我习惯在项目初期,用MCU的GPIO输出一个方波,配合示波器测量不同模式切换时的电流波形。这样能直观看到“唤醒尖峰”有多大,以及进入睡眠的延迟。比光看数据手册靠谱多了。

嗯,功耗模型这块就聊到这。你把这些概念吃透了,后面讲ThreadX的功耗管理框架时,你就能理解为什么RTOS要介入电源管理——它本质上是在帮你做“模式切换的调度决策”。