今天发现外部中断同一个中断服务子函数不能判断中断源。如下面所示,假设发生了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;
}
不知道大家有没有遇到过这样的问题
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
如果想保险一些的话,
可以在中断服务函数中再检测一下对应引脚的电平。
手册上说,EXTI_PR寄存器:当在外部中断线上发生了选择的边沿事件,该位被置’1’。在该位中写入’1’可以清除它。试过了清除标志位后,把EXTI_PR寄存器全部位赋值为0,仍然还是会同时执行两个线中断处理函数。
看来仅凭EXTI_PR寄存器对应位是不能判断中断源。
应该是没有问题的,
二者除了共用中断服务函数,
彼此是完全独立的,
你找一下其它的原因吧
一周热门 更多>