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功耗模型的核心关系串起来了。你可以把它当作后续设计的“导航图”。
2.5 实际项目中的权衡
理论讲完了,说点实际的。你在做低功耗设计时,脑子里要时刻绷紧三根弦:
- 不要只看数据手册的“典型值”。数据手册上写的睡眠电流,通常是在25°C、最优条件下测的。实际产品在高温下,静态功耗可能翻倍。我建议你留出50%的余量。
- 唤醒时间不是免费的。深度睡眠虽然电流低,但唤醒后要重新初始化时钟、锁相环、外设,这段时间的功耗累积可能比一直睡在浅睡眠还高。你得算总账。
- 唤醒源要匹配睡眠模式。不是所有唤醒源在所有模式下都能用。比如,深度睡眠下,普通定时器可能已经掉电了,只能用RTC。这个坑我踩过不止一次。
一个小技巧: 我习惯在项目初期,用MCU的GPIO输出一个方波,配合示波器测量不同模式切换时的电流波形。这样能直观看到“唤醒尖峰”有多大,以及进入睡眠的延迟。比光看数据手册靠谱多了。
嗯,功耗模型这块就聊到这。你把这些概念吃透了,后面讲ThreadX的功耗管理框架时,你就能理解为什么RTOS要介入电源管理——它本质上是在帮你做“模式切换的调度决策”。