外部中断概述
STM32的中断控制器支持19个外部中断/事件请求:
- 线0-15:对应外部IO口的输入中断
- 线16:连接到PVD输出
- 线17:连接到RTC闹钟事件
- 线18:连接到USB唤醒事件
STM32每个IO口都有可以作为外部中断输入,IO口有很多,STM32供IO使用的中断线只有16个,那么中断线怎么跟IO口对应呢?
这个时候就要用到端口重映射了
GPIOx.0映射到EXTI0(外部中断线0)
GPIOx.1映射到EXTI1(外部中断线1)
…
GPIOx.15映射到EXTI15(外部中断线15)
怎么使用函数把GPIO口映射到外部中断线呢?
GPIO_EXTILineConfig可以配置,比如说把PE2映射到EXTI2(中断线2)
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);//PE2映射到中断线2
对于每个中断线,我们可以设置相应的触发方式以及使能,触发方式有三种:
- 上升沿触发
- 下降沿触发
- 边沿触发
一共16个外部中断线,STM32是否分配16个中断处理函数呢?
答案是否定的,外部中断在中断向量表中只分配了7个中断向量,也就是说16个外部中断只分配了7个外部中断服务函数
外部中断线5-9分配一个中断向量,外部中断线15-10分配一个中断向量
中断服务函数如下:
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
EXTI9_5_IRQHandler
EXTI15_10_IRQHandler
外部中断常用库函数
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);//设置IO口与中断线的映射关系exp: GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
//初始化中断线:触发方式等ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
//判断中断线中断状态,是否发生void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
//清除中断线上的中断标志位
外部中断库函数设置
1.使能外设以及初始化IO口为输入
GPIO_Init()
- 开启IO口复用时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE)
- 设置IO口与中断线的映射关系
void GPIO_EXTILineConfig();
- 初始化线上中断,设置触发条件等
EXTI_Init();
- 配置中断分组(NVIC),并使能中断
NVIC_Init();
- 编写中断服务函数
EXYIx_IRQHandler();
- 清除中断标志位
EXTI_ClearITPendingBit();