4、MCU低功耗模式详解:Sleep模式、Stop模式、Standby模式、模式切换延迟对比

做加密狗这玩意儿,功耗是绕不开的坎儿。

你想想看,一个加密狗插在设备上,可能一年半载都不拔下来。如果功耗控制不好,电池没几天就废了,用户肯定骂娘。我这些年经手过不下二十款加密狗方案,踩过的坑比吃过的盐还多。今天咱们就把MCU的几种低功耗模式掰开揉碎了讲清楚。

4.1 为什么需要多种低功耗模式?

说白了,没有一种模式能包打天下。

加密狗的工作状态其实很分裂:大部分时间在待机,偶尔被主机唤醒做一次认证,认证完又继续睡大觉。不同场景对功耗和响应速度的要求完全不一样。

我个人习惯把低功耗模式分成三个梯队:

  • Sleep模式:打个盹儿,随时能醒
  • Stop模式:深度睡眠,但保留上下文
  • Standby模式:几乎关机,醒来从头再来

嗯,这里要注意,不同厂商的叫法可能不一样。ST叫Sleep/Stop/Standby,NXP叫Run/Wait/Stop,TI那边又是另一套。但底层逻辑大同小异。

4.2 Sleep模式:浅睡眠,快响应

Sleep模式是功耗和响应速度的平衡点。

进入Sleep模式后,CPU核心时钟停了,但外设时钟还在跑。什么意思呢?就是CPU不干活了,但定时器、串口、I2C这些外设还在正常工作。

典型功耗: 1-10 mA(取决于外设开启数量)

唤醒时间: 几微秒到几十微秒

我在项目中遇到过一种情况:加密狗需要每隔100ms检测一次USB总线状态。如果用Stop模式,每次唤醒要几百微秒,太慢了。后来改用Sleep模式,定时器中断一响,CPU瞬间醒来检查总线,检查完继续睡。整个过程行云流水。

// 进入Sleep模式的典型代码(以STM32为例)
HAL_SuspendTick();          // 暂停系统滴答定时器
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
// 醒来后继续执行
HAL_ResumeTick();

我的经验: Sleep模式下,记得把不用的外设时钟关掉。我曾经因为忘了关SPI时钟,白白多耗了2mA电流。排查了整整一下午才发现。

4.3 Stop模式:深度睡眠,保状态

Stop模式就狠多了。

进入Stop模式后,CPU停了,所有外设时钟也停了。但SRAM和寄存器内容还在,也就是说程序跑到的位置、变量的值都保留着。醒来后直接从断点处继续执行。

典型功耗: 几十微安到几百微安

唤醒时间: 几十微秒到几百微秒

为什么会这样?因为Stop模式下,主稳压器还在工作,给SRAM供电。有些MCU还支持低功耗稳压器模式,功耗能再降一个数量级。

我记得有一次做加密狗,要求待机电流低于50μA。Sleep模式死活降不下去,因为外设时钟关不干净。换成Stop模式后,电流直接掉到20μA,完美达标。

// 进入Stop模式
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
// 唤醒后需要重新配置系统时钟
SystemClock_Config();

避坑指南: 从Stop模式唤醒后,系统时钟会自动切换到HSI(内部高速振荡器)。如果你用的是外部晶振,必须手动重新配置时钟树。我曾经因为这个疏忽,导致加密狗唤醒后通信速率不对,折腾了两天才找到原因。

4.4 Standby模式:几乎关机,最省电

Standby模式,说白了就是让MCU进入一种「假死」状态。

在这个模式下,除了唤醒逻辑和备份域(RTC、备份寄存器),其他所有电路都断电了。SRAM内容丢失,程序重新从头执行。

典型功耗: 几十纳安到几微安

唤醒时间: 几毫秒

你想想看,纳安级别是什么概念?一节CR2032纽扣电池,容量大概200mAh。如果加密狗一直处于Standby模式,理论上可以撑上万年。当然实际不可能,因为总要醒来干活。

我做过一个极端低功耗的加密狗项目,要求电池用三年。最后方案就是:平时Standby,RTC定时唤醒做一次认证,认证完继续Standby。平均电流做到了5μA以下。

// 进入Standby模式
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
HAL_PWR_EnterSTANDBYMode();
// 注意:这里不会继续执行,MCU相当于复位了

我的建议: Standby模式虽然省电,但每次唤醒都要重新初始化外设和变量。如果你的加密狗需要频繁唤醒(比如每秒一次),那就不太合适了。唤醒开销反而会拉高平均功耗。

4.5 模式切换延迟对比

光看功耗还不够,切换延迟同样关键。我整理了一张对比表,方便你快速决策:

模式 典型功耗 唤醒延迟 上下文保留 适用场景
Sleep 1-10 mA 1-10 μs 完全保留 频繁唤醒、快速响应
Stop 20-500 μA 50-500 μs SRAM保留 中等频率唤醒、低功耗
Standby 0.1-5 μA 1-10 ms 仅备份域 极低功耗、长时间待机

从表中能看出来,功耗每降一个数量级,唤醒延迟就涨一个数量级。这是物理规律,没办法的事。

4.6 实战中的模式选择策略

讲了这么多理论,到底怎么选?我分享一个实战中的决策流程:

  1. 先算平均功耗预算:比如电池容量200mAh,要求用2年,那平均电流不能超过11.4μA。
  2. 再算唤醒频率:加密狗多久被唤醒一次?每次唤醒工作多久?
  3. 最后选模式:如果唤醒频率高(>1Hz),用Sleep;频率中等(0.1-1Hz),用Stop;频率低(<0.1Hz),用Standby。

我曾经遇到一个坑:客户要求待机功耗低于10μA,但唤醒响应时间必须小于100μs。你想想看,这俩要求是矛盾的。Standby功耗够低但唤醒太慢,Stop唤醒够快但功耗超标。最后折中方案是:平时用Stop模式,但把不用的外设全部断电,再配合低功耗稳压器,硬是把功耗压到了8μA,唤醒时间80μs。嗯,有时候就得在夹缝中找平衡。

核心要点: 没有最好的模式,只有最合适的模式。加密狗的低功耗设计,本质是在功耗、响应速度和功能完整性之间做权衡。

好了,这一章的内容就到这里。下一章咱们聊聊加密狗特有的「USB挂起检测与唤醒」,这可是加密狗低功耗设计的重头戏。