第2章:MCU功耗模型——动态功耗与静态功耗的物理原理

做MCU低功耗设计,你首先得搞清楚一个问题:功耗到底从哪来的?

我刚开始做嵌入式那会儿,总觉得功耗是个玄学。代码跑起来电流大,睡下去电流小,仅此而已。直到有一次做电池供电的物联网项目,产品死活撑不过标称的续航时间,我才老老实实把CMOS电路的功耗公式翻出来啃了一遍。

嗯,这一啃就发现,其实功耗的物理原理并不复杂。说白了就两大类:动态功耗和静态功耗。咱们一个一个说。

2.1 动态功耗:芯片干活时烧的电

动态功耗,就是MCU在“动”的时候消耗的能量。比如CPU在跑代码、外设在传数据、GPIO在翻转电平——这些时候都在烧动态功耗。

动态功耗又分两部分:

  • 开关功耗(Switching Power)——给负载电容充放电
  • 短路功耗(Short-Circuit Power)——PMOS和NMOS同时导通时的漏电流

先看开关功耗。这是动态功耗的大头,公式长这样:

P_sw = α × C_L × V_DD² × f

解释一下每个参数:

参数 含义 典型值/范围
α 翻转活动因子(0~1) 0.1~0.5(取决于代码)
C_L 负载电容 几pF到几十pF
V_DD 供电电压 1.8V / 3.3V
f 时钟频率 几MHz到几百MHz

这个公式里有个关键点:V_DD是平方项。电压降一半,开关功耗降到四分之一。我在项目中遇到过,把MCU从3.3V降到1.8V,同样跑48MHz,电流直接砍掉60%以上。所以低功耗设计的第一条铁律就是——能用低压绝不用高压。

再看短路功耗。它发生在信号翻转的瞬间,PMOS和NMOS都处于半导通状态,形成一条从V_DD到GND的直流通路。公式是:

P_sc = t_sc × V_DD × I_peak × f

其中t_sc是短路导通时间,I_peak是峰值短路电流。这部分通常占动态功耗的10%~20%,不算大头,但也不能忽略。

实战经验: 我在做STM32L4的功耗优化时发现,GPIO翻转频率超过10MHz后,短路功耗会明显上升。解决办法是降低IO驱动强度,让信号边沿变缓——虽然EMI会稍微变差,但功耗确实下来了。

2.2 静态功耗:芯片睡觉时也在漏电

静态功耗,就是MCU进入睡眠模式后依然在消耗的那部分能量。很多人以为芯片睡了就不耗电,其实不然——晶体管关不断,电流一直在漏。

静态功耗主要来自四个漏电流路径:

  1. 亚阈值漏电流(I_sub)——V_GS低于阈值电压时,沟道依然有微弱电流
  2. 栅极漏电流(I_gate)——栅氧化层太薄,电子直接隧穿过去
  3. 栅极感应漏电流(I_GIDL)——漏极高电场在栅极下方感应出的漏电
  4. 反偏PN结漏电流(I_rev)——源/漏与衬底之间的PN结反向漏电

其中亚阈值漏电流是老大,占静态功耗的80%以上。它的公式是:

I_sub = I_0 × 10^(V_GS - V_TH) / S

这里S是亚阈值摆幅,理想值是60mV/decade,实际工艺下约80~100mV/decade。什么意思呢?就是阈值电压V_TH每降低100mV,亚阈值漏电流就增大10倍。

所以你看,低功耗MCU为什么喜欢用高阈值电压(HVT)的晶体管?就是为了压住这个漏电流。

核心结论: 动态功耗跟频率和电压的平方成正比,静态功耗跟阈值电压和温度成指数关系。低频低压能砍动态功耗,但静态功耗会随着工艺微缩和温度升高而暴涨。

2.3 CMOS功耗公式:把两笔账合起来算

把动态和静态加起来,就是CMOS电路的总功耗:

P_total = P_dynamic + P_static
         = (α × C_L × V_DD² × f) + (V_DD × I_leak)

这个公式看着简单,但实际项目中怎么用?我举个例子。

某次做NB-IoT终端,MCU大部分时间在睡眠,偶尔醒来发数据。睡眠时静态功耗是2μA,醒来时动态功耗是10mA。如果每10分钟发一次数据,每次发100ms,那么平均功耗是:

P_avg = (睡眠时间 × 静态功耗 + 工作时间 × 动态功耗) / 总时间
      = (599.9s × 2μA + 0.1s × 10mA) / 600s
      ≈ 2μA + 1.67μA
      ≈ 3.67μA

你看,虽然动态功耗峰值很高,但因为占空比极低,平均下来静态功耗反而成了主角。这就是为什么低功耗设计要同时优化动态和静态,不能偏废。

避坑指南: 我曾经在一个项目中只关注了动态功耗,把工作电流从15mA优化到了5mA,结果整机续航只提升了不到10%。后来一查,静态功耗占了总功耗的70%——白忙活一场。所以做功耗分析前,先搞清楚你的系统是“动态主导”还是“静态主导”。

2.4 功耗模型的知识结构

下面这张图把本章的核心逻辑串起来了。你可以把它当作功耗分析的思维导图:

CMOS功耗模型知识结构 CMOS总功耗 动态功耗 静态功耗 开关功耗 短路功耗 亚阈值漏电 其他漏电 核心公式 P_total = α·C_L·V_DD²·f + V_DD·I_leak 动态功耗 ∝ V_DD² · f | 静态功耗 ∝ e^(V_TH) · T 低功耗设计策略 动态主导 → 降电压、降频率、减少翻转活动 静态主导 → 用高阈值单元、关断电源域、降低温度

2.5 动态功耗 vs 静态功耗:一张表说清楚

为了方便对比,我把两者的关键差异整理成了一张表。做功耗分析时,先对照这张表判断你的系统属于哪种类型:

对比维度 动态功耗 静态功耗
产生原因 信号翻转、电容充放电 晶体管关不断、漏电流
主要公式 α·C_L·V_DD²·f V_DD·I_leak
与电压关系 平方关系(V_DD²) 线性关系(V_DD)
与频率关系 线性正比 无关
与温度关系 弱相关 指数正相关(温度每升10°C,漏电翻倍)
与工艺关系 随工艺微缩略有下降 随工艺微缩急剧上升
典型占比(高速运行) 90%~99% 1%~10%
典型占比(深度睡眠) 0%~5% 95%~100%

这张表我建议你截图存着。每次做功耗仿真前,先对照它判断你的系统处于哪个区间,然后针对性优化。

一个小技巧: 如果你不确定系统是动态主导还是静态主导,可以做个简单实验——把时钟频率降到原来的一半,如果总电流也降了一半左右,那就是动态主导;如果电流几乎没变,那就是静态主导。我在项目里用这个方法快速定位过好几次功耗瓶颈。

2.6 为什么功耗模型对仿真工具这么重要?

你可能会问:知道这些物理原理,跟我用功耗仿真工具有什么关系?

关系大了。功耗仿真工具本质上就是在模拟这个CMOS功耗公式。工具会读取你的代码执行轨迹、外设状态、时钟配置、电压设定,然后根据内置的功耗模型,估算出每个时间点的动态功耗和静态功耗。

如果你不理解功耗模型,你就看不懂工具给出的结果——为什么这里电流突然跳了10mA?为什么睡眠模式下的漏电流比手册标称值大了一倍?这些问题的答案,都在功耗模型里。

举个例子。我在用某款功耗仿真工具时,发现工具估算的静态功耗总是比实测值低。后来查了芯片的datasheet才发现,工具默认用的是25°C的漏电流参数,而我的产品工作在45°C的环境下。根据静态功耗的温度指数关系,温度每升10°C漏电翻倍,45°C比25°C高了20°C,漏电应该是4倍。我把工具的温度参数从25°C改成45°C后,仿真结果就和实测对上了。

你看,不懂功耗模型,你连工具的参数都设不对。

一句话总结: 功耗模型是功耗仿真工具的“物理引擎”。你理解得越深,工具用得越准,产品续航就越有保障。