外部中断共用一个外部中断函数,三个按键对应中短线 10、11、12,共用中断函数EXTI15_10_IRQHandler
[mw_shl_code=c,true]void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line10) != RESET)
{
delay_ms(10);
if(KEY_RIGHT == 0)
{
BEEP = 1;
delay_ms(100);
BEEP = 0;
EXTI_ClearITPendingBit(EXTI_Line10);
}
}
if(EXTI_GetITStatus(EXTI_Line11) != RESET)
{
delay_ms(10);
if(KEY_CAHCEL == 0)
{
BEEP = 1;
delay_ms(100);
BEEP = 0;
EXTI_ClearITPendingBit(EXTI_Line11);
}
}
if(EXTI_GetITStatus(EXTI_Line12) != RESET)
{
delay_ms(10);
if(KEY_UP == 0)
{
BEEP = 1;
delay_ms(100);
BEEP = 0;
EXTI_ClearITPendingBit(EXTI_Line12);
}
}
}[/mw_shl_code]
为什么其中一个中断发生的时候都要执行
[mw_shl_code=c,true]delay_ms(10);3次,也就是说检查中短线请求
[mw_shl_code=c,true]if(EXTI_GetITStatus(EXTI_Line10) != RESET)[/mw_shl_code]
[/mw_shl_code]
[mw_shl_code=c,true]if(EXTI_GetITStatus(EXTI_Line11) != RESET)[/mw_shl_code]
[mw_shl_code=c,true]if(EXTI_GetITStatus(EXTI_Line11) != RESET)[/mw_shl_code]
[mw_shl_code=c,true]这三个函数不灵啊,但是我直接看寄存器EXTI-> R这个又是对的啊[/mw_shl_code]
[mw_shl_code=c,true]最后我又把上面的换成[/mw_shl_code]
[mw_shl_code=c,true]if((EXTI-> R)&(1<<10))[/mw_shl_code]
[mw_shl_code=c,true]if((EXTI-> R)&(1<<11))[/mw_shl_code]
[mw_shl_code=c,true]if((EXTI-> R)&(1<<12))
[/mw_shl_code]
[mw_shl_code=c,true]这样每次中断就会只执行1次delay了[/mw_shl_code]
[mw_shl_code=c,true]
[mw_shl_code=c,true]EXTI_GetITStatus(EXTI_Line)这应该是一个意思啊,而且它还判断了中断有没有被禁用[/mw_shl_code]
[mw_shl_code=c,true]这么不行呢[/mw_shl_code]
[/mw_shl_code]
|