OpenEdv-开源电子网

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

STM32待机唤醒实验,按一次WKUP为什么没有退出待机模式?

[复制链接]

1

主题

6

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-5-29
在线时间
2 小时
发表于 2015-8-7 19:00:14 | 显示全部楼层 |阅读模式
5金钱
STM32待机唤醒实验,按一次WKUP为什么没有退出待机模式?不是说WKUP引脚的上升沿可以退出待机模式吗?为什么也要3秒?
void EXTI0_IRQHandler(void)
{                
EXTI_ClearITPendingBit(EXTI_Line0); // 清除LINE10上的中断标志位  
if(Check_WKUP())//关机?
{  
Sys_Enter_Standby();  
}



中断服务函数这里是怎么让它开机的?
谢谢大家的热情帮助
长路漫漫,唯剑作伴。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-8-7 19:00:15 | 显示全部楼层
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-5-29
在线时间
2 小时
 楼主| 发表于 2015-8-7 19:00:15 | 显示全部楼层
不好意思不好意思。。。。你的回答正好解决了我的疑惑。。。。下次我会注意提问的细节问题的,不过最主要是有时候因为对一个问题不理解已经导致我无法正确去描述它了。非常感谢你的耐心帮助!!
长路漫漫,唯剑作伴。
回复

使用道具 举报

3

主题

2165

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5759
金钱
5759
注册时间
2013-11-22
在线时间
1208 小时
发表于 2015-8-7 21:21:59 | 显示全部楼层
长按 3s 以上开机
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-5-29
在线时间
2 小时
 楼主| 发表于 2015-8-9 00:42:53 | 显示全部楼层
回复【3楼】龙之谷:
---------------------------------
还是不太理解它函数是怎么让它退出待机模式的,待机模式下按WKUP灯亮进入中断,为什么没有退出待机模式?
长路漫漫,唯剑作伴。
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-8-9 18:53:44 | 显示全部楼层
回复【4楼】大鱼:
---------------------------------
大热天,人本来就容易发脾气,看到你的回复,也是无语了,读了好几遍还是感觉不怎么通顺,是我的理解能力脱轨了吗

问问题,把问题描述清楚一些,如果太长就分个123来说,别人也容易明白你卡在哪里

在待机模式下按WKUP是不会进入中断的,此时还没有配置中断,只是它的上升沿触发退出待机模式。退出待机模式相当于复位,此时会再次判断是否进入待机模式,如果按下时间低于3S会再次进入,所以需要长按3S以上来进入运行模式。
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

6

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2012-9-22
在线时间
21 小时
发表于 2017-1-21 22:28:27 | 显示全部楼层
龙之谷 发表于 2015-8-9 18:53
回复【4楼】大鱼:
---------------------------------
大热天,人本来就容易发脾气,看到你的回复,也是无 ...

谢谢,我正好看到这个回答了
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2017-8-19
在线时间
9 小时
发表于 2017-8-29 16:44:50 | 显示全部楼层
龙之谷 发表于 2015-8-9 18:53
回复【4楼】大鱼:
---------------------------------
大热天,人本来就容易发脾气,看到你的回复,也是无 ...

解释很透彻,正好碰到这个问题,很有用,谢谢啦
回复

使用道具 举报

23

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2305
金钱
2305
注册时间
2017-7-6
在线时间
280 小时
发表于 2018-1-29 13:30:46 | 显示全部楼层
我刚看待机试验也有这个疑惑,现在懂了。在待机模式下按下KEY_UP只是退出待机模式(相当于复位),并没有进中断。然后复位后跑到WKUP_Init()这个函数然后开始判断,长按三秒及以上才能开始否则又进入待机模式去了。这里我觉得为啥待机唤醒后为啥一定要复位,而不是从之前待机的位置继续跑
回复

使用道具 举报

0

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2018-3-1
在线时间
7 小时
发表于 2018-3-30 15:26:50 | 显示全部楼层
龙之谷 发表于 2015-8-9 18:53
回复【4楼】大鱼:
---------------------------------
大热天,人本来就容易发脾气,看到你的回复,也是无 ...

受益了~推!
回复

使用道具 举报

5

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2017-2-21
在线时间
17 小时
发表于 2018-7-13 15:09:54 | 显示全部楼层
请问下,这个地方的待机和唤醒都是一个入口,怎么解释呢?
触发3s后,响应,进入Sys_Enter_Standby();  开机和待机都是这个入口。是里面哪个地方做这个动作呢?请各位帮忙看看,谢谢!

void EXTI0_IRQHandler(void)
{                                                                                                  
        EXTI_ClearITPendingBit(EXTI_Line0); // 清除LINE10上的中断标志位                  
        if(Check_WKUP())//关机?
        {                  
                Sys_Enter_Standby();  
        }
}

void Sys_Standby(void)
{  
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);        //使能PWR外设时钟
        PWR_WakeUpPinCmd(ENABLE);  //使能唤醒管脚功能
        PWR_EnterSTANDBYMode();          //进入待命(STANDBY)模式                  
}
//系统进入待机模式
void Sys_Enter_Standby(void)
{                         
        RCC_APB2PeriphResetCmd(0X01FC,DISABLE);        //复位所有IO口
        Sys_Standby();
}
//检测WKUP脚的信号
//返回值1:连续按下3s以上
//      0:错误的触发       
u8 Check_WKUP(void)
{
        u8 t=0;        //记录按下的时间
        LED0=0; //亮灯DS0
        while(1)
        {
                if(WKUP_KD)
                {
                        t++;                        //已经按下了
                        delay_ms(30);
                        if(t>=100)                //按下超过3秒钟
                        {
                                LED0=0;                 //点亮DS0
                                return 1;         //按下3s以上了
                        }
                }else
                {
                        LED0=1;
                        return 0; //按下不足3秒
                }
        }
}  
回复

使用道具 举报

2

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2019-5-30
在线时间
17 小时
发表于 2019-7-24 19:29:35 | 显示全部楼层
A.在待机模式下按WKUP键,会产生一个上升沿,这个上升沿会触发系统退出待机模式(此时已经是退出待机模式了,如果是下面的B状态,即很快就又进入待机模式,所以我们感觉不到是退出待机,其实是已经退出了,只是从退出到又进入之间间隔太快了,我们看不到罢了,这是一种假象),退出待机模式相当于复位,复位之后程序正常运行,此时会先进行初始化检测按下按键的时间是否低于3S,
B.如果低于3秒(证明不到3秒,哪怕是轻触一下,此时按键返回值为0),会再次进入待机模式(就是上面说的假象),如此循环,即此时回到A的状态;
C.如果大于3秒(证明已经超过或等于3秒,此时按键返回值为1),此时是正常模式(不会像B那样反复进入待机模式,此处称为长按3秒退出待机模式),程序继续往下执行,此时如果按一下按键(不管是按一下还是长按都会产生一个上升沿)都会进入外部中断程序,在中断程序中会重新调用按键扫描程序进行按键时长扫描(上一次的返回值1不会使用,即不会记录上一次的返回值,只会重新获取返回值),如大于3秒(返回值1)则进入待机模式(此处就称之为长按3秒进入待机模式),否则不进入(程序依然是正常运行状态)。
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-7-22
在线时间
5 小时
发表于 2019-8-8 16:02:38 | 显示全部楼层
shuojun 发表于 2019-7-24 19:29
A.在待机模式下按WKUP键,会产生一个上升沿,这个上升沿会触发系统退出待机模式(此时已经是退出待机模式了 ...

很感谢你的回答让我理解了这个实验,不过有一小点需要修正,并不是 从退出待机模式到又进入之间间隔太快了 而看不到现象,而是退出待机模式后,重新执行main 函数,执行到WKUP_Init(); 语句时,在按下WKUP按键的这段时间内都不会继续执行WKUP_Init(); 后面的语句,直到松开按键并且按下的时间有3秒,才会执行后面的点亮屏幕,显示字符串的操作。

说的有点啰嗦,大致就是如果按下的按键没有3秒,比如2.7秒,这2.7秒都会在执行WKUP_Init();语句,而不会执行后面的点亮屏幕操作,所有这2.7秒内没有现象。

如果把 LCD_Init(); 放到 WKUP_Init(); 之前,会看到待机模式下,按下WKUP按键,屏幕点亮,但是没有显示字的现象
回复

使用道具 举报

2

主题

41

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2019-4-25
在线时间
87 小时
发表于 2019-12-10 09:13:54 | 显示全部楼层
感谢这么多人的解释,基本上懂了:
1、刚开始跑程序时 WKUP_Init 先检测按键,无长按进入待机状态,此时还未配置中断;
2、按下WKUP马上退出待机模式,进入 WKIP_Init 按键检测,超过3s 则if不成立,不进入待机;
3、而后初始化中断、LCD
4、开机状态下按WKUP触发中断,检测是否长按超过3s,超过进入待机

以上是个人对长按功能的理解。但小弟还有一处不解:进入待机之后程序还在跑吗?为何LED0是闪烁的?
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2021-2-6
在线时间
3 小时
发表于 2021-11-14 20:33:42 | 显示全部楼层
Metory 发表于 2019-8-8 16:02
很感谢你的回答让我理解了这个实验,不过有一小点需要修正,并不是 从退出待机模式到又进入之间间隔太快 ...

事实上,我进入这个帖子的原因就是因为自己编程中出现了按下WKUP,屏幕点亮而不显示字的异常情况
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 15:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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