目录
1.睡眠模式(Sleep Mode)
2.停止模式(stop mode)
3.待机模式(Standby Mode)
STM32提供了三种低功耗模式,分别是睡眠模式(Sleep Mode)、停止模式(Stop Mode)和待机模式(Standby Mode),我们在做一些电池供电项目的时候,低功耗模式显得尤为重要。
模式名称 | 进入 | 唤醒 | 唤醒后位置 | 对 1.2V域时钟的影响 | 对 VDD 域时钟的影响 | 功耗 |
睡眠模式 | WFI | 任意中断 | 睡眠位置开始执行 | CPU/CLK 关闭对其它时钟或模拟时钟源无影响 | 无 | 偏高 |
WFE | 唤醒事件 | |||||
停止模式 | PDDS 和LPDS 位+SLEEPDEEP 位+WFI或 WFE | 任意 EXTI 线(在 EXTI寄存器中配置,内部线和外部线) | 停止位置开始执行,但系统时钟变为HSI(内部高速时钟),需要重新配置时钟 | 所有 1.2 V域时钟都关闭 | HSI 和HSE 振荡器关闭 | 中等 |
待机模式 | PDDS 位+SLEEPDEEP 位+ WFI 或 WFE | WKUP 引脚上升沿、RTC闹钟(钟 A 或闹钟B)、BTC 唤醒事件、RTC 入侵事件、RTC 时间戳事件、NRST 引脚外部复位、IWDG 复位 | 相当于复位,系统重新开始运行 | 所有 1.2 V域时钟都关闭 | HSI 和HSE 振荡器关闭 | 最低 |
1.睡眠模式(Sleep Mode)
在睡眠模式下,只有STM32的内核时钟被关闭,而外设时钟仍然保持运行,所有的I/O引脚都保持它们在运行模式时的状态,WFI模式下可以通过任意中断唤醒,WFE模式下可以任意唤醒事件唤醒,唤醒后程序继续睡眠位置往下运行。
void enter_sleep_mode(void){
HAL_SuspendTick();//关闭系统systick中断,防止睡眠被systick中断打断
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);//进入WFI睡眠模式
HAL_ResumeTick();//打开系统systic中断
}
上面是进入睡眠模式的代码,因为系统存在1ms一次的systick,所以要将其手动关闭,等待睡眠模式被唤醒以后再恢复。
2.停止模式(stop mode)
在停止模式下,内核时钟和外设时钟都被关闭,但内核的1.8V供电区域仍然保持供电,SRAM和寄存器中的内容得以保留,IO口状态也可保持,可以通过任意一个外部中断来唤醒STM32,唤醒后需要重新初始化时钟和外设,当一个中断或唤醒事件导致退出停止模式时,HSI(高速内部时钟)通常被选为系统时钟。
void enter_stop_mode(void){
HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1);//禁用唤醒引脚
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);//清除唤醒标志
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);//启用唤醒引脚
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_STOPENTRY_WFI);//进入停止模式
}
进入停止模式之前先要重置一下唤醒引脚,注意停止模式结束以后,外设时钟被关闭,只能选用HSI重新初始化时钟和外设。
3.待机模式(Standby Mode)
待机模式是功耗最低的模式,关闭了所有的时钟,并关闭了内核的1.8V供电,除了电源控制/状态寄存器和备份寄存器之外,其他所有的寄存器和RAM数据都会丢失,可以通过唤醒引脚(如PA0)的上升沿、RTC(实时时钟)闹钟中断,或者复位操作来唤醒STM32,唤醒后,STM32相当于复位,程序将从复位地址开始执行。
由于待机模式被唤醒后相当于复位,从main函数重新初始化,所以不用再做特殊操作。
大家可以根据自己的项目需求去选择合适的低功耗模式。