STM睡眠模式、停止模式、待机模式

睡眠模式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秒。

注意:如果烧写完成后,没有效果,则重新给开发板上电即可。

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值