介绍
STM32F103的中断控制器支持19个外部中断/事件请求。
线0~15:对应外部IO口的输入中断。 线16:连接到PVD输出线。 线17:连接到RTC闹钟事件。 线18:连接到USB唤醒事件。
外部IO口的输入中断
总结步骤
第一步:开启AFIO时钟 第二步:设置IO口与中断线的映射关系。 第三步:初始化线上中断,设置触发条件等。 第四步:配置中断分组(NVIC),并使能中断。 第五步:编写中断服务函数。 第六步:清除中断标志位
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
每个中断都设有状态位,每个中断/事件都有独立的触发和屏蔽设置。 可以看出,STM32供IO口使用的中断线只有16个,但是STM32的IO口却远远不止 16个, GPIOx.0 ~ GPIOx.15( x=A,B,C,D,E,F,G) 分别对应中断线0~15。 每条中断线最多对应7个IO口,但每次只能连接到1个IO口上,这样就需要通过配置映射关系来决定对应的中断线配置到哪个GPIO 上。
映射函数
GPIO_EXTILineConfig()
设置好中断线映射之后, 那么到底来自这个 IO 口的中断是通过什么方式触发的呢? 接下来我们就要设置该中断线上中断的初始化参数了。
中断初始化参数
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line=EXTI_Line4;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
我们设置好中断线和 GPIO 映射关系,又设置好了中断的触发模式等初始化参数。
NVIC 中断优先级
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
只有7个中断向量,外部中断线0 ~ 4分别对应EXTI0_IRQn ~ EXTI4_IRQn中断向量。
外部中断线 5 ~ 9 共用一个 EXTI9_5_IRQn中断向量,外部中断线10~15 共用一个 EXTI15_10_IRQn中断向量
7个中断向量 EXTI0_IRQn; EXTI1_IRQn; EXTI2_IRQn; EXTI3_IRQn; EXTI4_IRQn; EXTI9_5_IRQn; EXTI15_10_IRQn;
有7个中断向量,也就是只能使用7个中断服务函数
EXTI0_IRQHandler()
EXTI1_IRQHandler()
EXTI2_IRQHandler()
EXTI3_IRQHandler()
EXTI4_IRQHandler()
EXTI9_5_IRQHandler()
EXTI15_10_IRQHandler()
EXTI_ClearITPendingBit()
|