待机唤醒实验程序详解

2019-07-21 05:09发布

        我看了唤醒待机实验程序,也和大多数人有同样的疑问,看了大家的讨论明白了,把自己的理解写下来:
       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;
 





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。