求教STM32的外部中断(EXTI)的问题

17584681   2010-1-15 15:38 楼主
下面是我写的 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 这些寄存器都设置好了.

回复评论 (4)

1.
  1. for(i=0;i<0x10000;i++); //软件消抖
复制代码
这是错误作法
2.不知道你是用的哪种中断触发方式

可能原因,因为中断中时间太长,手抖引起了二次中断.
点赞  2010-1-17 11:16
                                 不知道为何楼主不使用ST的库,没看出楼主的程序和库的比有什么更高明之处.
点赞  2010-1-17 11:22
是用,下降沿触发中断

回4楼,在ST的库中那个 EXTI_ClearITPendingBit 函数清除中断挂起位也只是一条指令:
  EXTI->PR = EXTI_Line;
与我的也是一样,只不过它是要调用函数,如果将这指令放到中断的处理函数中也会重入中断,请问为何?
不用库的原因只是因为我这个中断的处理过程是用汇编写的.我上面写的只是一个验证的函数.其实STM32的库也不是很高明,请不要太过抬高它的作用.
点赞  2010-1-17 21:04
                                 再回3楼,绝对不是手抖引起的二次中断
点赞  2010-1-17 21:06
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复