一、低功耗是什么

低功耗的目标是降低集成电路的能量消耗。

STM32 上电后默认处于运行模式。运行模式下,CPU、时钟系统、外设等模块正常工作,功耗相对较高。当内核不需要持续运行时,可以让芯片进入低功耗模式,以减少电流消耗。

STM32F1 常用低功耗模式主要有三种:

模式 节能效果 唤醒后程序状态 典型特点
睡眠模式 较弱 程序继续运行 CPU 停止,外设仍可运行
停止模式 较好 程序继续运行 时钟系统关闭,唤醒后需重新配置系统时钟
待机模式 最强 程序复位重启 电压调节器关闭,只保留少量唤醒能力

可以简单理解为:

睡眠模式:只让 CPU 休息
停止模式:CPU 和大部分时钟系统都停下来
待机模式:系统进入最深低功耗,唤醒后相当于重新启动

二、STM32F1 电源系统结构

理解低功耗前,需要先了解 STM32F1 的供电结构。

1. ADC 电源和参考电压

ADC 相关电源通常包括:

引脚 作用
VDDA ADC 模拟电源输入
VSSA ADC 独立模拟地
VREF ADC 测量使用的参考电压

模拟电源和数字电源的稳定性会影响 ADC 采样精度。低功耗设计中,如果关闭外部模拟电路,也要考虑唤醒后模拟电源稳定时间。

2. 调压器电路

调压器为备份域和待机电路之外的大多数数字电路供电,包括:

  • Cortex-M3 内核

  • 数字外设

  • SRAM

在停止模式中,可以通过低功耗电压调节器进一步降低功耗。

3. 备份域电路

备份域通常包括:

  • LSE 振荡器

  • RTC

  • 后备寄存器

备份域可由 VBAT 供电。在主电源 VDD 掉电时,只要 VBAT 有效,RTC 和后备寄存器仍可继续工作。

三、睡眠模式

1. 睡眠模式的表现

睡眠模式下,CPU 内核时钟关闭,CPU 停止执行指令,但外设时钟可以继续运行。

也就是说,进入睡眠模式后:

  • CPU 不再主动执行主循环代码。

  • 外设可以继续工作。

  • 中断仍然可以唤醒 CPU。

  • SRAM 和寄存器状态保持。

2. 进入睡眠模式

睡眠模式通常通过内核指令进入:

WFI 或 WFE

其中:

指令 含义
WFI Wait For Interrupt,等待中断
WFE Wait For Event,等待事件

HAL 库提供的进入函数为:

HAL_PWR_EnterSLEEPMode();

3. 唤醒方式

睡眠模式可以被任意中断或唤醒事件唤醒。

常见做法是将 WKUP 按键所在引脚配置为外部中断。进入睡眠后,按键触发外部中断,CPU 被唤醒并继续运行。

4. 优缺点

项目 说明
优点 对系统影响小,唤醒快,外设可继续运行
缺点 只是关闭 CPU 内核时钟,节能效果最弱

睡眠模式适合短时间等待事件,例如等待按键、等待串口接收、等待外设中断。

四、停止模式

1. 停止模式的表现

停止模式比睡眠模式更省电。

停止模式下:

  • CPU 内核时钟关闭。

  • 内核逻辑电路的所有时钟关闭。

  • 时钟系统关闭。

  • SRAM 和寄存器内容保持。

  • 程序唤醒后不会复位,会从进入低功耗后的下一条指令继续执行。

停止模式适合系统需要较低功耗,但又希望唤醒后保持运行上下文的场景。

2. 进入停止模式

进入停止模式需要配合电源控制寄存器和 Cortex-M 内核低功耗控制位。

关键条件:

PDDS = 0
设置 LPDS 位选择电压调节器状态
SLEEPDEEP = 1
执行 WFI 或 WFE

HAL 库提供的进入函数为:

HAL_PWR_EnterSTOPMode();

3. 电压调节器状态

F1 停止模式中,LPDS 位决定电压调节器状态:

LPDS 状态
0 正常开启
1 低功耗模式

低功耗电压调节器可以进一步降低功耗,但唤醒恢复时间通常更长。

4. 唤醒方式

停止模式可由外部中断唤醒。使用按键唤醒时,通常需要把 WKUP 引脚或其他 GPIO 配置为 EXTI 外部中断。

需要注意:退出停止模式后,系统时钟通常会切换到 HSI RC 振荡器。因此唤醒后如果工程原本使用 HSE、PLL 等高速时钟,必须重新初始化系统时钟。

典型处理流程:

进入停止模式前:关闭或降低不必要外设功耗
外部中断唤醒
唤醒后:重新配置系统时钟
恢复外设工作状态
继续执行应用逻辑

5. 优缺点

项目 说明
优点 节能效果较好,程序不会复位,SRAM 和寄存器保持
缺点 恢复时间比睡眠模式长,唤醒后需要重新配置系统时钟

五、待机模式

1. 待机模式的表现

待机模式是 STM32F1 中功耗最低的模式。

待机模式下:

  • CPU 内核时钟关闭。

  • 内核逻辑电路的所有时钟关闭。

  • 时钟系统关闭。

  • 电压调节器关闭。

  • 大部分 SRAM 和寄存器内容丢失。

  • 唤醒后程序从复位流程重新开始执行。

待机模式适合长时间休眠、只需少数唤醒源恢复工作的场景。

2. 进入待机模式

进入待机模式的关键条件:

PDDS = 1
SLEEPDEEP = 1
执行 WFI 或 WFE

HAL 库提供的进入函数为:

HAL_PWR_EnterSTANDBYMode();

3. 唤醒方式

F1 待机模式常见唤醒源包括:

唤醒源 说明
WKUP 引脚上升沿 常用于按键唤醒
RTC 闹钟事件 可实现定时唤醒
NRST 外部复位 通过复位引脚唤醒
IWDG 复位 独立看门狗复位唤醒

待机模式下可用唤醒条件较少,设计时需要提前确认唤醒源是否满足需求。

4. 优缺点

项目 说明
优点 节能效果最好
缺点 唤醒后程序复位重启,可用唤醒源较少

如果系统需要在唤醒后恢复某些状态,建议将关键信息保存到后备寄存器、外部 EEPROM、Flash 或其他非易失存储器中。

六、F1 低功耗相关寄存器

STM32F1 低功耗控制主要涉及 SCB_SCRPWR_CRPWR_CSR

1. SCB_SCR 系统控制寄存器

SCB_SCR 用于选择休眠和深度休眠模式。

重点关注 SLEEPDEEP 位:

SLEEPDEEP 含义
0 进入睡眠模式
1 进入深度睡眠模式,用于停止模式或待机模式

睡眠模式不需要设置 SLEEPDEEP,停止模式和待机模式都需要设置该位。

2. PWR_CR 电源控制寄存器

PWR_CR 用于配置低功耗相关控制位,例如清除标志位、选择停止/待机模式、电压调节器状态等。

重点关注:

作用
PDDS 选择进入停止模式还是待机模式
LPDS 停止模式下选择电压调节器状态
CWUF 清除唤醒标志

PDDS 的含义:

PDDS 进入模式
0 停止模式
1 待机模式

3. PWR_CSR 电源控制/状态寄存器

PWR_CSR 用于管理待机/唤醒标志和唤醒引脚。

重点关注:

作用
EWUP 使能 WKUP 引脚作为待机唤醒源
WUF 唤醒标志

WUF 是唤醒标志,需要结合 PWR_CR 中的 CWUF 位进行清除。进入待机模式前通常要先清除旧的唤醒标志,避免刚进入待机就被历史标志影响。

七、F1 低功耗相关 HAL 函数

HAL 库封装了常见低功耗操作。

函数或宏 作用
HAL_PWR_EnterSLEEPMode() 进入睡眠模式
HAL_PWR_EnterSTOPMode() 进入停止模式
HAL_PWR_EnterSTANDBYMode() 进入待机模式
HAL_PWR_EnableWakeUpPin() 使能 WKUP 引脚唤醒功能
__HAL_PWR_CLEAR_FLAG() 清除 PWR 相关标志
__HAL_RCC_PWR_CLK_ENABLE() 使能电源控制外设时钟

底层进入低功耗最终依赖 Cortex-M 内核指令:

WFI 或 WFE

HAL 函数内部会根据参数和模式设置相关寄存器,并调用对应的内核低功耗指令。

八、睡眠模式使用流程

睡眠模式常用于等待外部中断或外设中断。

典型流程:

  1. 初始化唤醒源,例如将 WKUP 按键配置为外部中断。

  2. 根据需要降低外设功耗,例如降低屏幕亮度、关闭暂时不用的外设。

  3. 调用 HAL_PWR_EnterSLEEPMode() 进入睡眠模式。

  4. 外部中断或其他中断触发后唤醒 CPU。

  5. 中断处理完成后,程序继续执行。

睡眠模式对系统影响小,适合短时间低功耗等待。

九、停止模式使用流程

停止模式比睡眠模式更省电,但唤醒后需要处理系统时钟恢复。

典型流程:

  1. 初始化唤醒源,例如将 WKUP 按键配置为外部中断。

  2. 进入低功耗前处理外设状态,例如关闭屏幕背光、停止不必要的通信外设。

  3. 调用 HAL_PWR_EnterSTOPMode() 进入停止模式。

  4. 外部中断触发后唤醒 CPU。

  5. 重新配置系统时钟。

  6. 恢复必要外设。

  7. 程序继续运行。

停止模式的关键点是:唤醒后程序不复位,但时钟系统可能已经不是进入前的配置。

十、待机模式使用流程

待机模式功耗最低,但唤醒后程序会重新启动。

典型流程:

  1. 根据需要初始化 WKUP 为中断触发源。

  2. 关闭或降低外设功耗。

  3. 使能 PWR 时钟:

__HAL_RCC_PWR_CLK_ENABLE();
  1. 使能 WKUP 引脚唤醒功能:

HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
  1. 清除唤醒标志 WUF

__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
  1. 进入待机模式:

HAL_PWR_EnterSTANDBYMode();

唤醒后,程序会从复位入口重新执行。因此必须在启动阶段判断复位来源,并恢复必要状态。

十一、三种模式对比

对比项 睡眠模式 停止模式 待机模式
CPU 停止 停止 停止
时钟系统 多数仍可运行 关闭 关闭
电压调节器 工作 可正常或低功耗工作 关闭
SRAM/寄存器 保持 保持 大多不保持
唤醒后程序 继续运行 继续运行 复位重启
唤醒速度 最快 中等 较慢
功耗 最高 较低 最低
适合场景 短时间等待中断 中等功耗休眠 长时间低功耗休眠

选择低功耗模式时,要在功耗、唤醒速度、状态保持和唤醒源数量之间权衡。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐