现象描述: 当外部中断(10-15)触发进入中断函数后,系统任何中断无法再进入(程序仍然在运行),原来认为是外部中断触发信号问题,一直在查硬件问题,后面发现是软件问题 如下:
在外部中断初始化时,我只清掉了需要用的外部中断(如上图,外部第14中断没用,我就没有清)
void Exti_Cfg(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_ClearITPendingBit(EXTI_Line0); // 初始化中断,先清除掉标志位
EXTI_ClearITPendingBit(EXTI_Line10); //
EXTI_ClearITPendingBit(EXTI_Line11); //
EXTI_ClearITPendingBit(EXTI_Line12); //
EXTI_ClearITPendingBit(EXTI_Line15); //
但是在中断服务函数里,我套用原先的模板 (即外部中断10-15都加以判断是否有中断,中断14我也加了判断)
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetFlagStatus(EXTI_Line15)!=RESET)
{
EXTI_ClearITPendingBit(EXTI_Line15);
}
if(EXTI_GetFlagStatus(EXTI_Line13)!=RESET)
{
EXTI_ClearITPendingBit(EXTI_Line14);
}
if(EXTI_GetFlagStatus(EXTI_Line12)!=RESET)
{
EXTI_ClearITPendingBit(EXTI_Line12);
}
if(EXTI_GetFlagStatus(EXTI_Line10)!=RESET)
{
EXTI_ClearITPendingBit(EXTI_Line10);
}
if(EXTI_GetFlagStatus(EXTI_Line11)!=RESET)
{
Delay_Us(20);
EXTI_ClearITPendingBit(EXTI_Line11);
}
}
就是这个中断14 没有初始化清除,导致10-15中断函数只要进入一次 整个中断就会死掉,无法进入。
当我在外部中断初始化时加入 EXTI_ClearITPendingBit(EXTI_Line14); 系统能能正常进出中断。
这个现象不是每个多元中断都会发生,像第5-9中断有没清的标志位,中断也不会死机。
我的结论: 外部中断初始化配置时,最好清除全部外部中断的标志位。
|