OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6386|回复: 10

待机唤醒实验程序详解

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2015-12-23
在线时间
7 小时
发表于 2015-12-23 21:40:01 | 显示全部楼层 |阅读模式
        我看了唤醒待机实验程序,也和大多数人有同样的疑问,看了大家的讨论明白了,把自己的理解写下来:
       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;
 





正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

42

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
448
金钱
448
注册时间
2016-3-8
在线时间
57 小时
发表于 2016-12-20 15:47:49 | 显示全部楼层
大哥你的程序怎么和例程不一样,我的例程程序唤醒初始化函数给的check_wkup函数是这样的:if(Check_WKUP()==0) Sys_Standby();
回复 支持 1 反对 0

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2018-9-7
在线时间
0 小时
发表于 2018-9-7 15:12:21 | 显示全部楼层
我正在学习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();保持唤醒状态。
回复 支持 1 反对 0

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-12-24 13:32:09 | 显示全部楼层
分享更有助于进步,赞一个~~~~~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2016-3-5
在线时间
26 小时
发表于 2016-3-8 23:32:25 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

4

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
145
金钱
145
注册时间
2016-2-25
在线时间
44 小时
发表于 2016-3-9 09:13:31 来自手机 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2016-11-4
在线时间
29 小时
发表于 2016-11-20 14:03:52 | 显示全部楼层
刚开始执行代码时 进入睡眠模式  然后代码开始从main()函数执行 检测WKUP按键是否返回为0 还是1 如果3秒后返回为1 则不进入睡眠 唤醒了STM32    在睡眠时与外部中断无关 唤醒才与外部中断有关 外部中断检测是否返回值为1 则进入睡眠 如此循环
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2016-11-16
在线时间
5 小时
发表于 2016-11-21 10:58:45 | 显示全部楼层
我感觉看这个程序的时候特别在3s开机的功能有点模糊,后来想了一下,是在待机模式下,按下WK_UP键以后,立即进入开机状态,同时检测按键的时间是否超过3s,如果按下3s以后,不会进入if语句内,如果未超过3s则进入if语句内,执行进入待机函数,总体来说,就是开机时按下3秒,就开机,如果开机时未按下3s就进入待机。
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2017-3-3
在线时间
10 小时
发表于 2017-3-27 21:08:06 | 显示全部楼层
感谢分享,终于弄懂了
回复 支持 反对

使用道具 举报

0

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2018-3-1
在线时间
7 小时
发表于 2018-3-30 13:52:55 | 显示全部楼层
推一個!
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2018-7-3
在线时间
28 小时
发表于 2018-8-2 09:43:29 | 显示全部楼层
很强
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-23 13:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表