3. 运行模式详解:Run模式、Sleep模式、Low-power Run模式的区别与切换

各位做低功耗项目的朋友,咱们今天聊聊STM32的三种核心运行模式。说实话,我刚入行那会儿,觉得低功耗就是“跑完程序就睡觉”,结果被现实狠狠教育了一回。后来才明白,这三种模式就像汽车的“怠速”、“熄火滑行”和“经济巡航”,用对了地方,功耗能差好几个数量级。

3.1 三种模式的核心区别

先看一张我手绘的对比图,帮你快速建立整体认知:

STM32三种运行模式对比 Run模式 CPU全速运行 所有外设可用 功耗:mA级别 特点: • 响应最快 • 功耗最高 • 适合计算密集型 典型功耗: ~10mA @ 72MHz Sleep模式 CPU时钟停止 外设继续工作 功耗:百μA级别 特点: • 快速唤醒 • 外设保持 • 适合间歇性任务 典型功耗: ~200μA @ 8MHz Low-power Run CPU低速运行 电压降至1.2V 功耗:十μA级别 特点: • 极低功耗 • 保持计算能力 • 适合持续监控 典型功耗: ~10μA @ 2MHz

3.2 Run模式——全速前进

Run模式就是芯片的“满血状态”。CPU全速跑,所有外设想开就开。我有个做数据采集的朋友,一开始所有代码都跑在Run模式下,结果电池三天就废了。

什么时候必须用Run模式?

  • 需要实时响应的场景(比如电机控制)
  • 大量数据运算(比如FFT、加密)
  • 外设频繁交互(比如SPI刷屏)

关键点:Run模式下,HCLK、PCLK1、PCLK2都是全速运行。功耗主要取决于主频和开启的外设数量。我习惯在项目初期就估算一下:每MHz大约消耗0.5~1mA电流。

3.3 Sleep模式——让CPU歇着

Sleep模式很有意思。CPU的时钟停了,但外设还在跑。你想想看,就像你让司机睡觉,但发动机还在怠速。这时候如果外设有中断,CPU能立刻醒来处理。

我做过一个温湿度采集项目,每5秒采一次数据。中间这5秒完全可以让CPU睡觉。代码怎么写?

// 进入Sleep模式
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);

// 醒来后自动从下一行继续执行
// 注意:醒来后时钟配置不变,直接跑

我的经验:Sleep模式唤醒时间极短,大约几个时钟周期。如果你用WFI(Wait For Interrupt)指令,任何中断都能唤醒。用WFE(Wait For Event)的话,需要事件触发。我个人更常用WFI,因为更直观。

这里有个坑——我曾经以为Sleep模式就是“关机”,结果发现DMA还在偷偷搬数据。嗯,其实这不是坏事,DMA+Sleep是个黄金组合:DMA搬数据,CPU睡觉,搬完了DMA中断唤醒CPU处理。

3.4 Low-power Run模式——省电又干活

Low-power Run模式是我最喜欢的模式。说白了,就是让芯片在“低电压+低频率”下继续跑程序。电压从1.8V降到1.2V,频率限制在2MHz以内,功耗直接掉到10μA级别。

什么时候用?比如一个气体传感器,需要每100ms读一次数据,但数据量很小。用Sleep模式?醒来太频繁,切换开销大。用Run模式?太费电。Low-power Run模式正好——CPU慢悠悠地跑着,功耗极低。

注意:进入Low-power Run模式前,必须先把系统时钟切换到MSI(多速内部振荡器),并且频率不能超过2MHz。我刚开始不知道这个限制,直接切过去,结果芯片直接死机。后来查手册才发现,低电压下高频跑不动。

切换代码示例:

// 1. 切换到MSI时钟,设置频率为2MHz
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);

// 2. 配置电压调节器为低功耗模式
HAL_PWREx_EnableLowPowerRunMode();

// 3. 现在芯片就在Low-power Run模式下了
// CPU继续执行代码,但功耗只有10μA左右

3.5 三种模式的切换策略

实际项目中,这三种模式经常要组合使用。我总结了一个“三段式”策略:

场景 推荐模式 原因
系统初始化、配置外设 Run模式 需要快速完成初始化
等待外部事件(如按键、数据到达) Sleep模式 快速响应,功耗适中
周期性采集低速传感器 Low-power Run模式 保持计算能力,功耗极低
长时间待机(秒级以上) Stop/Standby模式 后续章节会详细讲

核心原则:能不跑就不跑,能慢跑就慢跑。我见过太多人一上来就上Stop模式,结果唤醒太慢导致数据丢失。其实很多时候,Low-power Run模式才是最优解。

3.6 避坑指南

最后分享几个我踩过的坑:

  • 时钟切换顺序:进入Low-power Run模式前,必须先切时钟再降电压。顺序反了,芯片直接复位。
  • 外设状态:Sleep模式下,如果某个外设还在工作,它的时钟不能关。我试过关了TIM的时钟,结果定时器中断没了,系统睡死过去。
  • 唤醒源配置:用EXTI唤醒时,一定要配置好触发边沿。我曾经配成双边沿触发,结果按键按下时抖动了两次,程序逻辑全乱了。

嗯,这三种模式搞明白了,你的低功耗设计就成功了一半。剩下的Stop和Standby模式,那是更极致的省电方案,但代价是唤醒时间更长。怎么取舍?看你的项目需求了。


公众号:蓝海资料掘金营,微信deep3321