睡眠模式SLEEP:CPU停,外设运行,唤醒源是所有中断(串口中断、按键中断、溢出中断...)
停止模式STOP:1.8V供电区域的所有时钟都被停止。CPU停、时钟停、外设停,只有SRAM和寄存器还能保持原来的值。唤醒源是外部中断(按键中断)。
待机模式SUSPEND:CPU停、外设停、时钟停、SRAM和寄存器停(相当于整个都断电了)。只有备份寄存器和待机电路还能工作。
睡眠模式(SLEEP)
HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry)
HAL库进入中断函数。
参数Regulator有两个选择:
- PWR_MAINREGULATOR_ON:主电源保持打开
- PWR_LOWPOWERREGULATOR_ON:低功耗部分的电源保持打开。
参数SLEEPEntry指定唤醒时的来源,有两个可选
- PWR_SLEEPENTRY_WFI :中断唤醒
- PWR_SLEEPENTRY_WFE:事件唤醒
当第二个参数选择PWR_SLEEPENTRY_WFE时,中断和事件都可以唤醒,所以优化代码,在进入SLEEP模式前关闭中断,唤醒后开启中断。
因为程序中可能有多个事件(本程序中只有一个按键事件),为了让指定事件来唤醒SLEEP模式,我们可以在进入SLEEP前关闭其他的事件。
HAL_Delay(3000);
HAL_GPIO_WritePin(Red_GPIO_Port,Red_Pin,GPIO_PIN_SET);
__disable_irq();
HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFE);
__enable_irq();
HAL_Delay(1000);
HAL_GPIO_TogglePin(Red_GPIO_Port,Red_Pin);
HAL_GPIO_TogglePin(Bule_GPIO_Port,Bule_Pin);
待机模式
使用RTC实现待机模式。
前面说过待机模式下,CPU停、外设停、时钟停、SRAM和寄存器停(相当于整个都断电了),那为什么RTC时钟可以继续呢?
因为RTC时钟通过备份电源供电,所以待机模式下,RTC可以继续运行。
由图可知,RTC是32KHZ时钟频率。配置下图参数实现一定时间的始终唤醒(这里配置成了3秒)。
void sys_enter_standby_mode()
{
__HAL_RCC_PWR_CLK_ENABLE(); //使能PWR时钟
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); //清除唤醒标志位
HAL_PWR_EnterSTANDBYMode(); //进入待机模式
}
while (1)
{
HAL_Delay(1500);
HAL_GPIO_WritePin(Bule_GPIO_Port,Bule_Pin,GPIO_PIN_RESET);
sys_enter_standby_mode();
}
在while中通过写入低电平和待机模式配合完成灯的闪烁。灯亮1.5秒,灭1.5秒。
注意:如果烧写完成后,没有效果,则重新给开发板上电即可。