下面是我写的 EXTI9_5 的中断处理过程,但有一个问题不明白,向大家请教.
先贴出处理函数:
void EXTI9_5_IRQHandler(void) //外部引脚5-9引起的中断(在本例中使用PA8引脚)(连接USER1按键)
{
unsigned int i;
for(i=0;i<0x10000;i++); //软件消抖
if(User1 == 0x00)
{
Led(2,LedState(2)); //将第2个LED的状态反转
}
EXTI->PR=0x100;
EXTI->PR=0x100;
}
这是外部中断9_5的处理过程,但最后要对 EXTI 寄存器组中的 PR 寄存器赋值2次才可以,如果只有一个 EXTI->PR=0x100 的话,这个中断处理函数就会被重新调用一次,何解?但如果将 EXTI->PR=0x100 放入另一个函数中,就没有问题?搞了很长时间都搞不清楚?故求教.
例如改成下面的话就正常了.
void clear_pr(unsigned long val)
{
EXTI->PR=val;
}
void EXTI9_5_IRQHandler(void) //外部引脚5-9引起的中断(在本例中使用PA8引脚)(USER1)
{
unsigned int i;
for(i=0;i<0x20000;i++);
if(User1 == 0x00)
{
Led(2,LedState(2));
}
clear_pr(0x100);
}
最后说明,NVIC,AFIO,EXTI,SCB 这些寄存器都设置好了.
1.
- for(i=0;i<0x10000;i++); //软件消抖
复制代码这是错误作法
2.不知道你是用的哪种中断触发方式
可能原因,因为中断中时间太长,手抖引起了二次中断.
不知道为何楼主不使用ST的库,没看出楼主的程序和库的比有什么更高明之处.
是用,下降沿触发中断
回4楼,在ST的库中那个 EXTI_ClearITPendingBit 函数清除中断挂起位也只是一条指令:
EXTI->PR = EXTI_Line;
与我的也是一样,只不过它是要调用函数,如果将这指令放到中断的处理函数中也会重入中断,请问为何?
不用库的原因只是因为我这个中断的处理过程是用汇编写的.我上面写的只是一个验证的函数.其实STM32的库也不是很高明,请不要太过抬高它的作用.