一、低功耗是什么
低功耗的目标是降低集成电路的能量消耗。
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 或 WFEHAL 库提供的进入函数为:
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 或 WFEHAL 库提供的进入函数为:
HAL_PWR_EnterSTANDBYMode();3. 唤醒方式
F1 待机模式常见唤醒源包括:
| 唤醒源 | 说明 |
|---|---|
| WKUP 引脚上升沿 | 常用于按键唤醒 |
| RTC 闹钟事件 | 可实现定时唤醒 |
| NRST 外部复位 | 通过复位引脚唤醒 |
| IWDG 复位 | 独立看门狗复位唤醒 |
待机模式下可用唤醒条件较少,设计时需要提前确认唤醒源是否满足需求。
4. 优缺点
| 项目 | 说明 |
|---|---|
| 优点 | 节能效果最好 |
| 缺点 | 唤醒后程序复位重启,可用唤醒源较少 |
如果系统需要在唤醒后恢复某些状态,建议将关键信息保存到后备寄存器、外部 EEPROM、Flash 或其他非易失存储器中。
六、F1 低功耗相关寄存器
STM32F1 低功耗控制主要涉及SCB_SCR、PWR_CR和PWR_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 或 WFEHAL 函数内部会根据参数和模式设置相关寄存器,并调用对应的内核低功耗指令。
八、睡眠模式使用流程
睡眠模式常用于等待外部中断或外设中断。
典型流程:
初始化唤醒源,例如将
WKUP按键配置为外部中断。根据需要降低外设功耗,例如降低屏幕亮度、关闭暂时不用的外设。
调用
HAL_PWR_EnterSLEEPMode()进入睡眠模式。外部中断或其他中断触发后唤醒 CPU。
中断处理完成后,程序继续执行。
睡眠模式对系统影响小,适合短时间低功耗等待。
九、停止模式使用流程
停止模式比睡眠模式更省电,但唤醒后需要处理系统时钟恢复。
典型流程:
初始化唤醒源,例如将
WKUP按键配置为外部中断。进入低功耗前处理外设状态,例如关闭屏幕背光、停止不必要的通信外设。
调用
HAL_PWR_EnterSTOPMode()进入停止模式。外部中断触发后唤醒 CPU。
重新配置系统时钟。
恢复必要外设。
程序继续运行。
停止模式的关键点是:唤醒后程序不复位,但时钟系统可能已经不是进入前的配置。
十、待机模式使用流程
待机模式功耗最低,但唤醒后程序会重新启动。
典型流程:
根据需要初始化
WKUP为中断触发源。关闭或降低外设功耗。
使能 PWR 时钟:
__HAL_RCC_PWR_CLK_ENABLE();使能
WKUP引脚唤醒功能:
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);清除唤醒标志
WUF:
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);进入待机模式:
HAL_PWR_EnterSTANDBYMode();唤醒后,程序会从复位入口重新执行。因此必须在启动阶段判断复位来源,并恢复必要状态。
十一、三种模式对比
| 对比项 | 睡眠模式 | 停止模式 | 待机模式 |
|---|---|---|---|
| CPU | 停止 | 停止 | 停止 |
| 时钟系统 | 多数仍可运行 | 关闭 | 关闭 |
| 电压调节器 | 工作 | 可正常或低功耗工作 | 关闭 |
| SRAM/寄存器 | 保持 | 保持 | 大多不保持 |
| 唤醒后程序 | 继续运行 | 继续运行 | 复位重启 |
| 唤醒速度 | 最快 | 中等 | 较慢 |
| 功耗 | 最高 | 较低 | 最低 |
| 适合场景 | 短时间等待中断 | 中等功耗休眠 | 长时间低功耗休眠 |
选择低功耗模式时,要在功耗、唤醒速度、状态保持和唤醒源数量之间权衡。