金牌会员
 
- 积分
- 2015
- 金钱
- 2015
- 注册时间
- 2014-7-1
- 在线时间
- 190 小时
|
20金钱
举个例子吧外部中断初始化
//外部中断初始化程序
void EXTI_Init(void)
{
Ex_NVIC_Config(GPIO_B,6,RTIR); //上升沿触发
Ex_NVIC_Config(GPIO_B,7,RTIR);
Ex_NVIC_Config(GPIO_B,8,RTIR);
Ex_NVIC_Config(GPIO_B,9,RTIR);
MY_NVIC_Init(2,1,EXTI9_5_IRQn,2); //抢占2,子优先级1,组2
}
//外部中断9~5服务程序
void EXTI9_5_IRQHandler(void)
{
temp=EXTI->PR;
switch(temp)
{
case EXTI_PR_PR6: //判断引脚电平,然后干嘛干嘛
break;
case EXTI_PR_PR7: //判断引脚电平,然后干嘛干嘛
break;
case EXTI_PR_PR8: //判断引脚电平,然后干嘛干嘛
break;
case EXTI_PR_PR9: //判断引脚电平,然后干嘛干嘛
break;
default:break;
}
EXTI->PR=1<<9; //清除LINE5上的中断标志位
EXTI->PR=1<<8; //清除LINE5上的中断标志位
EXTI->PR=1<<7; //清除LINE5上的中断标志位
EXTI->PR=1<<6; //清除LINE5上的中断标志位
}
极端情况下,问题如下
1、如果一个中断A发生,另外一个中断B同时来到,会不会B打断A?
2、在1的基础上,B不会打断A,那中断A执行结束后,中断B会来到吗?
3、在2的基础上,中断B不会来到,那怎样设计,让在中断A执行结束后,中断B也能正常执行?
4、在3的基础上,把清除中断标志位放到对应的发生源下,是不是就可以不会漏掉中断了?
|
最佳答案
查看完整内容[请看2#楼]
1、5~9是共用同一个中断的,只有高优先级的才能抢占低优先级中断,你这属于相同的中断,所以不会打断的,
2-4、如果你不清除标志位,B中断会在A结束后继续触发,清除中断标志位放到对应的发生源是可以避免漏掉中断, 这个理解没错的,不过这里其实还有风险,就是在你执行过程中如果同一个中断触发了两次,还是有漏中断的风险。如A,B同时触发,在你执行A的时候,B再次触发,此时B的中断就被漏掉了,考虑到这种情况,这样写是较完 ...
|