OpenEdv-开源电子网

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

关于原子哥STM32待机唤醒实验的bug

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2014-11-1
在线时间
0 小时
发表于 2014-11-19 11:36:38 | 显示全部楼层 |阅读模式
不知道大家是否遇到过这种情况,在待机唤醒实验的时候,在待机情况下,有时候按了3S按键,唤醒不了,但是有的时候可以。也就是存在干扰,使得唤醒不稳定。

通过分析代码,我找到了bug所在:当MCU处于待机状态时候,只要给WAKU一个上升沿,MCU立刻唤醒并且从main()函数开始执行,当执行到 if(Check_WKUP()==0)Sys_Standby();时候,是要判断按键是否达到了3S,如果没有就又进入了待机状态,如果达到了3S就跳过这条语句,正常执行。 那么bug就在这里,因为在执行这个函数Check_WKUP(),程序正常运行,是会响应中断的,所以在判断你按下按键时间内,如果你手抖动下,可能在WAKU又产生一个上升沿,导致进入中断服务函数,这样你一直按着到3S,就会执行Sys_Enter_Standby(),导致再次进入待机,也就是没唤醒到。

处理办法是:在Check_WKUP()里面加条EXTI->IMR&=~(1<<0); 把中断屏蔽,然后跳出去时候恢复中断。
附加代码:

u8 Check_WKUP(void) 
{
u8 t=0;
u8 tx=0;
LED0=0; 
EXTI->IMR&=~(1<<0); //disable interrupt
while(1)
{
if(WKUP_KD)
{
t++;
tx=0;
}else 
{
tx++; 
if(tx>10)
{
LED0=1;
EXTI->IMR|=1<<0; //enable interrupt
return 0;
}
}
delay_ms(30);
if(t>=100)
{
LED0=0;   
EXTI->IMR|=1<<0; //enable interrupt
return 1;
}
}

做个技术上的屌丝,生活中的凤凰男
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

头像被屏蔽

38

主题

382

帖子

0

精华

高级会员

Rank: 4

积分
596
金钱
596
注册时间
2012-12-5
在线时间
19 小时
发表于 2014-11-19 14:43:31 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-15 17:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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