在配置外部中断的中断服务函数时,惯性思维地给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 | 以太网唤醒 |
此时我们可以使用 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;
}
EXTI_ClearITPendingBit(EXTI_Line13);
//清除LINE13上的中断标志位
}
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上的中断标志位
}
}