在学习外部中断之前,我们要先了解一下NVIC寄存器,NVIC全称嵌套向量中断寄存器,控制整个芯片的中断相关功能。但我们不需要学习NVIC所有的寄存器,弄懂ISER(set)、ICER(clear)和IP三个寄存器就行。查询固件库:
这是我们需要用到的所有内容。
我们以EXTI0为例,首先我们要使用NVIC_InitTypeDef结构体来配置中断的通道以及抢占优先级和子优先级,配置完后对结构体进行初始化,EXTI0的有关NVIC寄存器的配置就完成了。
EXTI0~15的中断来源都是GPIO,因此我们也需要像配置按键那样来进行配置EXTI0的GPIO输入口。我们以PA0为例(按键引脚):
配置好GPIO后,需要对EXTI进行配置。
查询STM32F103的参考手册可知,GPIO线上的中断信号是通过AFIO_EXTICR1 寄存器来传递的,使用了AFIO寄存器。查询参考手册发现,对AFIO相关寄存器进行读写时,需要打开AFIO时钟。
接下来我们只需要配置EXTI就可以了。查询固件库,找到我们所需要的用的函数。
首先,我们需要对EXTI结构体进行配置,EXTI_Line选择你的中断来自于GPIO_x,Mode选择产生中断还是事件,Trigger选择上升沿还是下降沿,Cmd使能(对寄存器EXTI_IMR和EXTI_EMR进行配置)。结构体配置好后,进行初始化。
整个流程看参考手册的外部中断框图就行了。
最后一步要写中断函数,注意中断函数名是库中写好的,最好不要更改。
我们所使用的EXTI0中断的函数名为EXTI0_IRQHandler() EXTI_GetITStatus(uint32_t EXTI_Line)和EXTI_ClearITPendingBit(uint32_t EXTI_Line)是对标志位的检测和清除,对应对挂起寄存器的PRx位。