32F103提供19个外部中断:
0-15:对应外部IO口输入中断
16:连接到PVD输出
17:连接到RTC闹钟事件
18:连接到USB唤醒事件
IO设备线只有16条,但是GPIO口远远不止16个,所以需要映射
ABCDEFG的0都连接在一个线0,中断线每次只能连接到一个IO口上,这样就需要通过配置来决定对应的中断线配置到哪个GPIO上了。
这种映射关系通过:
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
eg:GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);
中断线2和EXTI2中断线链接,设置好中断线映射后,设置中断线上中断初始化参数来触发IO中断。
初始化通过:
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
同样里面有一个结构体:
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); //根据 EXTI_InitStruct中指定的参数初始化EXTI寄存器
可以看到是下降沿触发的,第一个参数中断线标号,第二个中断模式,第三个触发方式,第四个是使能中断线。
设置好了中断线和GPIO的映射关系,又设置好了中断的触发模式等参数,依然是外部中断,涉及到中断我们当然还要设置NVIC中断优先级。(和串口实验一样)
配置完中断优先级后,编写终端服务程序,32一共有6个外部中断函数。编写过程中经常用到两个函数:
1、判断中断线上是否有终端发生(标志位是否置位)
ITSt