待机唤醒实验程序详解

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;
 





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
ouxili
1楼-- · 2019-07-21 06:10
 精彩回答 2  元偷偷看……
陈雷hbxy
2楼-- · 2019-07-21 08:56
我正在学习STM32F103,待机唤醒实验,我说说我的理解,大家看看对不对,
在开机时才有中断,按下WKUP,进入中断,判断是否按下3s,如果Check_WKUP()=1,进入待机状态,如果不=1,保持开机状态。
在待机时,按下WKUP立即就会唤醒,从main()函数开始运行,到WKUP_Init(),IO口,中断初始化结束以后,判断是否按下WKUP够3s,如果Check_WKUP()=0,没按下够3s,再次进入待机状态,如果够3s,则跳过if(Check_WKUP()==0) Sys_Standby();保持唤醒状态。
龙之谷
3楼-- · 2019-07-21 14:21
分享更有助于进步,赞一个~~~~~
凯歌
4楼-- · 2019-07-21 19:24
 精彩回答 2  元偷偷看……
ChanTselin5213
5楼-- · 2019-07-21 20:31
感谢分享
meng907161614
6楼-- · 2019-07-22 00:55
刚开始执行代码时 进入睡眠模式  然后代码开始从main()函数执行 检测WKUP按键是否返回为0 还是1 如果3秒后返回为1 则不进入睡眠 唤醒了STM32    在睡眠时与外部中断无关 唤醒才与外部中断有关 外部中断检测是否返回值为1 则进入睡眠 如此循环

一周热门 更多>