转载:https://blog.csdn.net/weixin_39450910/article/details/104561985
在配置外部中断的中断服务函数时,惯性思维地给EXTI_LINE12分配了EXTI12_IRQn通道,后编译器报错,提示EXTI12_IRQn未定义。查找资料后发现外部中断的5-9,10-15各自共用了一个通道EXTI15_10_IRQn以及EXTI9_5_IRQn.如表所示
NVIC中的中断通道 | 外部中断的中断线 | GPIO |
---|---|---|
EXTI0_IRQn | EXTI_LINE0 | PX0(X为A,B,C,D···下同) |
EXTI1_IRQn | EXTI_LINE1 | PX1 |
EXTI2_IRQn | EXTI_LINE2 | PX2 |
EXTI3_IRQn | EXTI_LINE3 | PX3 |
EXTI4_IRQn | EXTI_LINE4 | PX4 |
EXTI9_5_IRQn | EXTI_LINE5,EXTI_LINE6····EXTI_LINEn····EXTI_LINE9 | PXn(n需与前面的n保持一致,下同) |
EXTI15_10_IRQn | EXTI_LINE10,EXTI_LINE11····EXTI_LINEn····EXTI_LINE15 | PXn |
EXTI16 | EXTI16 | PVD输出 |
RTCAlarm_IRQn | EXTI17 | RTC闹钟 |
USBWakeUp_IRQn | EXTI18 | USB唤醒 |
EXTI19 | EXTI19 | 以太网唤醒 |
那么,既然5-9,10-15的中断通道各自只有一个,如何针对每个LINE编写中断服务函数呢?
此时我们可以使用 ITStatus EXTI_GetITStatus(uint32_t EXTI_Line) 来判断到底是那条线唤起了中断服务函数。如下例:
void EXTI15_10_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line12)!=RESET ){ delay_ms(10);//消抖 if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)==0) { key_s=1; SendData(); key_s=0; } EXTI_ClearITPendingBit(EXTI_Line12); //清除LINE12上的中断标志位 } if(EXTI_GetITStatus(EXTI_Line13)!=RESET ){ delay_ms(10);//消抖 if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==1) { key1=1; SendData(); key1=0;
<span class="token punctuation">}</span> <span class="token function">EXTI_ClearITPendingBit</span><span class="token punctuation">(</span>EXTI_Line13<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//清除LINE13上的中断标志位 </span>
}
if(EXTI_GetITStatus(EXTI_Line14)!=RESET ){
delay_ms(10);//消抖
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==1)
{
key2=1;
SendData();
key2=0;
}
EXTI_ClearITPendingBit(EXTI_Line14); //清除LINE14上的中断标志位
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34