共用中断线,中断服务子函数不能判断中断源的BUG

2019-07-20 23:46发布

今天发现外部中断同一个中断服务子函数不能判断中断源。如下面所示,假设发生了line9中断,line5处理函数1也会执行,假设发生了line9中断,处理函数2也会执行。void EXTI9_5_IRQHandler(void)//中断服务函数,如果中断线是5-9。
{
        if(EXTI_GetITStatus(EXTI_Line5) != RESET)
        {
                处理函数1
                EXTI_ClearITPendingBit(EXTI_Line5);     
        }  

        if(EXTI_GetITStatus(EXTI_Line9) != RESET)
        {
                处理函数2
                EXTI_ClearITPendingBit(EXTI_Line9);     
        }
}       
库函数里面清中断标志函数,只会把对应中断标志置1来清除对应中断,所以我觉得应该是假如上一次发生了对应中断,下一次该标志位还是置位,所以即使线中断没有发生,对应处理函数还是会执行。

void EXTI_ClearITPendingBit(uint32_t EXTI_Line)
{
  /* Check the parameters */
  assert_param(IS_EXTI_LINE(EXTI_Line));

  EXTI->PR = EXTI_Line;
}

不知道大家有没有遇到过这样的问题
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
warship
1楼-- · 2019-07-21 05:29
不应该哦,
如果想保险一些的话,
可以在中断服务函数中再检测一下对应引脚的电平。
radar
2楼-- · 2019-07-21 05:33
warship 发表于 2019-6-13 22:12
不应该哦,
如果想保险一些的话,
可以在中断服务函数中再检测一下对应引脚的电平。

手册上说,EXTI_PR寄存器:当在外部中断线上发生了选择的边沿事件,该位被置’1’。在该位中写入’1’可以清除它。试过了清除标志位后,把EXTI_PR寄存器全部位赋值为0,仍然还是会同时执行两个线中断处理函数。
看来仅凭EXTI_PR寄存器对应位是不能判断中断源。
warship
3楼-- · 2019-07-21 09:34
radar 发表于 2019-6-14 12:39
手册上说,EXTI_PR寄存器:当在外部中断线上发生了选择的边沿事件,该位被置’1’。在该位中写入’1’可 ...

应该是没有问题的,
二者除了共用中断服务函数,
彼此是完全独立的,
你找一下其它的原因吧

一周热门 更多>