我看了唤醒待机实验程序,也和大多数人有同样的疑问,看了大家的讨论明白了,把自己的理解写下来:
1、Check_WKUP()函数返回值为1时,在中断函数中执行的是进入待机,程序怎样执行唤醒的操作?
按下 WK_UP引脚会有两种情况:
(1)当此时处于待机时,按下键会马上唤醒芯片
此时从程序开始执行,即从主函数的第一句话开始执行。
( 此时不执行中断程序,唤醒指的就是主程序从第一句话执行,并且待机模式下,中断使能等操作的寄存器内容早已丢失。 )
执行到 WKUP_Init()时,在这个函数中有检测函数 if(Check_WKUP()==0)这条语句,判断是否按键达到3秒,
达到后则跳过进入待机模式的函数:Sys_Enter_Standby(); 进行中断初始化,和主函数中其他的初始化。
未达到3秒,则进入待机,这就是为什么下载完程序后会自动复位,因为检测不到按键按下,自然也没3秒,芯片进入待机状态。程序中有个巧妙设计,即增加一个变量tx记录时间,当tx>3时,即等了3个30ms按键都没按下,视为一次误操作,此时,返回0;这样,不用等待3S就能迅速进入待机,如果按照大多数人的想法,等3秒再去看是否有键按下,浪费了时间。
( 通过if(Check_WKUP()==0) {Sys_Enter_Standby();},这两句话实现了按下3秒开机,3秒以内关机的功能。)
(2)当芯片运行时,按下按键,执行中断函数。
2、中断中只执行进入待机的操作,至于唤醒操作是在初始化函数WKUP_Init()中实现的,由于WKUP_Init()函数能实现 WKUP键未按下120ms后有返回值,returned 0;通过调用该函数可以知道返回0时键未按下3s,主函数中是if(Check_WKUP()==0{Sys_Enter_Standby();}中断函数中是if(Check_WKUP()) {Sys_Enter_Standby();},通过if语句实现了按下3秒与不足3秒的不同控制。
3、程序中的创新的地方是tx变量的使用,有效的节省了判断是否3秒的时间,当我们没有按下WKUP时,经过90ms就能给出返回值,示意不足三秒,当我们按下WKUP时,不论我们按多长时间,总能在松开后90ms后给出判断,按下1500ms,在90ms后返回0;
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
在开机时才有中断,按下WKUP,进入中断,判断是否按下3s,如果Check_WKUP()=1,进入待机状态,如果不=1,保持开机状态。
在待机时,按下WKUP立即就会唤醒,从main()函数开始运行,到WKUP_Init(),IO口,中断初始化结束以后,判断是否按下WKUP够3s,如果Check_WKUP()=0,没按下够3s,再次进入待机状态,如果够3s,则跳过if(Check_WKUP()==0) Sys_Standby();保持唤醒状态。
一周热门 更多>