不知道大家是否遇到过这种情况,在待机唤醒实验的时候,在待机情况下,有时候按了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;
}
}
} |