如果对你有帮助,请点赞收藏,谢谢~这是我更新的动力~
如果有任何问题欢迎在评论区交流~我们一同成长~
前言:
最近在学习原子的阿波罗,进行到待机实验,实验目的是摁下KEY_UP的时候就可以让MCU从待机模式唤醒了。而KEY1在按下的时候进入休眠。(验证过程比较繁琐,只看结论的小伙伴请找往下找STM32休眠时关闭看门狗的方案)
STM32F429提供了三种低功耗模式,以达到不同层次的降低功耗的目的:
(1)睡眠模式(CM4内核停止工作,外设仍在运行)
(2)停止模式(所有时钟都停止)
(3)待机模式(所有时钟都停止,啥都不干了,就等唤醒了)
待机模式的目的主要是节省功耗,在此模式下最低只需要2.2uA电流(最低功耗模式)。期间MCU所有功能全部关闭。可以由WKUP引脚上升沿、RTC闹钟、RTC唤醒、RTC入侵事件、RTC时间戳、NRST引脚外部复位、IWDG复位,唤醒。从待机模式唤醒后的代码执行等同于复位后的执行。
目的:用自己的办法实现待机、唤醒实验。
设计:用KEY_1触发进入待机模式,用KEY_UP唤醒。
cubemx配置:
将KEY_UP配置为系统唤醒、KEY1为中断模式,上拉,下降沿触发。开启中断,配置优先级
注意:IWDG的时钟不是systick而是LSI
所以,计算看门狗复位周期的时候要用 40K/分频算出频率 ,再被重装载值相除就是周期,单位S。例如:
40K/64 = 625hz //1s计数625次
2500/625 = 4s //4s需要计数2500次,也就是重装载值设为2500看门狗4s复位一次。
摁下KEY_UP的时候就可以让MCU从待机模式唤醒了。而KEY1在按下的时候进入休眠。
代码实现:
原子给出的进入休眠模式步骤:
(1)禁止所有RTC中断
(2)清零对应中断标志位
(3)清除PWR唤醒(WUF)标志
(4)重新使能RTC对应中断
(5)进入低功耗模式
原子代码如下:
//系统进入待机模式
void Sys_Enter_Standby(void)
{
__HAL_RCC_AHB1_FORCE_RESET(); //复位所有IO口
while(WKUP_KD); //等待WK_UP按键松开(在有RTC中断时,必须等WK_UP松开再进入待机)
__HAL_RCC_PWR_CLK_ENABLE(); //使能PWR时钟
__HAL_RCC_BACKUPRESET_FORCE(); //复位备份区域
HAL_PWR_Enabl