STM32的待机唤醒实验分析(基于原子哥程序)
看到以上代码会不会熟悉呢??在这里就不解释了哈、、所以重点来讲讲步骤
本文引用地址:https://www.eepw.com.cn/article/201610/311123.htm1、使能PWR的时钟:RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
2 、使能唤醒的功能:PWR_WakeUpPinCmd(ENABLE);
3、进入待机模式 : PWR_EnterSTANDBYMode();
请看代码:
void Sys_Standby(void) //在唤醒初始化中调用
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
PWR_WakeUpPinCmd(ENABLE);
PWR_EnterSTANDBYMode();
}
void Sys_Enter_Standby(void)//在中断函数里调用,用来复位,然后进入待机模式
{
RCC_APB2PeriphResetCmd(0X01FC,DISABLE); //在这里只是复位了IO口、、至于0x01fc是怎么来的、、大家请看RCC_APB2RSTR(下图)
Sys_Standby();
}

最后我们给出按键检测的处理程序、、在这里,3S只是一个效果、、也可以不用、、也可以长点、、看你个人哈(原子的程序,别告我盗版哈)
u8 Check_up(void)
{
u8 t = 0;
u8 tx = 0;
LED0 = 0;
while(1)
{
if(KEY3 == 1) //检测到按键按下
{
t++;
tx = 0;
}
else
{
tx++;
if(tx > 3)
{
LED0 = 1;
return 0; //错误按键或者按键时间不够
}
}
delay_ms(30);
if(t > 100) //100*30ms = 3s
{
LED0 = 0;
return 1;// 3s
}
}
}
看到这里、、可能有人会有些搞不懂在中断服务函数那里的逻辑、、在这里我给出解释哈:
从正常运行模式切换到待机模式 按住wkup键 外部中断0中断被触发 执行中断服务函数 Check_up()函数开始检测 如果时间没超过3s 返回零 这时工作在正常运行模式 如果按住时间超过了3s 返回值为1 进入待机模式
我们的程序在刚开始运行时就是没有按键按下、、所以没有上升沿,初始化函数里条件成立,从而进入了待机模式:请看初始化的代码:
if (Check_up() == 0)
29 {
30 Sys_Standby(); //进入待机模式
31 }
从待机模式切换到正常运行模式 按住wkup键的那一瞬间会有一个上升沿 而这个上升沿执行了唤醒功能但是没有执行外部中断0的中断服务函数 待机模式下cpu是不工作的 从待机模式唤醒后的代码执行等同于复位后的执行所以程序又会从头开始执行(这句话很重要) 然后又会执行到 Check_up()函数检测 如果按住键盘的时间没有超过3s 还是会处于待机模式 加入超过了3s 返回值为1 条件不成立 就会切换到正常运行模式 所以结论就是外部中断0的中断服务程序在待机模式切换到正常运行模式的时候从始至终是不会运行的
记住:唤醒中只是说需要上升沿、、并没有说要进入中断
所以:
1 、如果是正常运行,先执行中断程序,判断是否3秒,决定是否待机。
2 、如果是待机状态,则先复位并初始化,判断是否3秒,决定是否开机。
啊哈、、不知看到这里的你理解得怎么样了、、我也是初学者,尽量用我所理解的来帮助你们理解、、用点自认为是幽默的风格来、、不会显得那么的死板、、希望大家见谅哈、、初学者难免有理解上的失误或者不懂或者讲得不全面、、所以在这有写错的敬请原谅哈、、
评论