在系统或电源复位以后,微控制器处于 运行状态。运行状态下的 HCLK 为 CPU 提供时钟,内核执行程序代码。当 CPU 不需继续运行 时,可以利用多个低功耗模式来节省功耗,例如等待某个外部事件时。
STM32的3种低功耗模式:
在运行模式下,可以通过下面方式降低功耗:
① 降低系统时钟。
② 关闭APB和AHB总线上未被使用的外设时钟。
在这三种低功耗模式中,最低功耗的是待机模式,在此模式下,最低只需要 2.2uA 左右的 电流。停机模式是次低功耗的,其典型的电流消耗在 350uA 左右。最后就是睡眠模式了。根据最低电源消耗,最快启动时间和可用的唤醒源等条件,选择一种最佳的低功耗模式。
STM32F4的待机模式
待机模式可实现 STM32F4 的最低功耗。该模式是在CM4 深睡眠模式时关闭电压调节器。整个1.2V 供电区域被断电。PLL、 HSI 和 HSE 振荡器也被断电。SRAM 和寄存器内容丢失。除备份域(RTC 寄存器、RTC 备份 寄存器和备份 SRAM)和待机电路中的寄存器外,SRAM 和寄存器内容都将丢失。
从待机模式唤醒后的代码执行等同于复位后的执行(采样启动模式引脚,读取复位向量等)。 电源控制/状态寄存器(PWR_CSR)将会指示内核由待机状态退出。
进入待机模式涉及到 2 个寄存器,电源控制寄存器(PWR_CR)和电源控制/状态寄存器(PWR_CSR)。
①设置PDDS位进入深度睡眠时进入待机模式。
PWR_CSR电源控制/状态寄存器
① 设置EWUP,使能WKUP 引脚用于待机唤醒。
② WUF唤醒标志,用来判断是否发生唤醒事件。
对于使能了 RTC 闹钟中断或 RTC 周期性唤醒等中断的时候,进入待机模式前,必须按如 下操作处理:
1, 禁止 RTC 中断(ALRAIE、ALRBIE、WUTIE、TAMPIE 和 TSIE 等)。
2, 清零对应中断标志位。
3, 清除 PWR 唤醒(WUF)标志(通过设置 PWR_CR 的 CWUF 位实现)。
4, 重新使能 RTC 对应中断。
5, 进入低功耗模式。
在有用到 RTC 相关中断的时候,必须按以上步骤执行之后,才可以进入待机模式,否则可能无法唤醒。
固件库中低功耗操作函数
文件:stm32f4xx_pwr.c / stm32f4xx_pwr.h
void PWR_EnterSTOPMode();//进入停机模式
void PWR_EnterSTANDBYMode(void);//进入待机模式
void PWR_WakeUpPinCmd(FunctionalState NewState);//使能Wakeup引脚唤醒
FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG);
void PWR_ClearFlag(uint32_t PWR_FLAG);
文件: core_cm4.h
__WFI() ;
__WFE() ;
待机唤醒配置步骤:
①使能电源时钟。因为要配置电源控制寄存器,所以必须先使能电源时钟。RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
② RTC相关处理:关闭RTC相关中断。
③设置WK_UP引脚作为唤醒源。设置PWR_CSR的EWUP位,使能WK_UP用于将CPU从待机模式唤醒。
PWR_WakeUpPinCmd(ENABLE); //使能唤醒管脚功能
④设置SLEEPDEEP位,设置PDDS位,执行WFI指令,进入待机模式。
void PWR_EnterSTANDBYMode(void);
配置以及主函数
通过串口在屏幕上打印时间,我们在13:50:00前通过KEY0按键来开启待机模式,通过闹钟在13:50:00唤醒。
int main(void)
{ u32 x=0;RTC_TimeTypeDef RTC_TimeStruct;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2delay_init(168); //初始化延时函数LED_Init(); //初始化LED端口 BEEP_Init(); //初始化蜂鸣器端口KEY_Init(); //初始化与按键连接的硬件接口My_RTC_Init();uart_init(115200); //初始化串口波特率为115200LED0=0; //先点亮红灯delay_ms(1000);while(1){if(x%100==0){RTC_GetTime(RTC_Format_BIN,&RTC_TimeStruct);printf("Time:%02d:%02d:%02d\r\n",RTC_TimeStruct.RTC_Hours,RTC_TimeStruct.RTC_Minutes,RTC_TimeStruct.RTC_Seconds);}if(KEY_Scan(0)==KEY0_PRES){RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能PWR外设时钟PWR_BackupAccessCmd(ENABLE);//后备区域访问使能RTC_ITConfig(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA,DISABLE);//关闭RTC相关中断 RTC_ClearITPendingBit(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA);//清楚RTC相关中断标志位。PWR_ClearFlag(PWR_FLAG_WU);//清除Wake-up 标志PWR_WakeUpPinCmd(ENABLE); //使能唤醒管脚功能 RTC_Set_AlarmA(5,13,50,0); PWR_EnterSTANDBYMode(); //进入待命(STANDBY)模式}delay_ms(10);x++;}}
运行视频
待机唤醒实验