1.外部中断/事件管理框图
2. 外部中断函数编写--以按键控制LED为例
2.1初始化要连接的GPIO&初始化外部中断结构体
查阅指南者原理图,知道KEY1是在PA0,所以要连接在EXTI0,同理,对于连接在PC13的按键KEY2,应该连接在EXTI13。
void EXTI_Key_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
/*开启按键GPIO口的时钟*/
RCC_APB2PeriphClockCmd(KEY1_INT_GPIO_CLK,ENABLE);
/* 配置 NVIC 中断*/
NVIC_Configuration();
/*--------------------------KEY1配置-----------------------------*/
/* 选择按键用到的GPIO */
GPIO_InitStructure.GPIO_Pin = KEY1_INT_GPIO_PIN;
初始化GPIO
/* 配置为浮空输入 */
/*浮空输入的意思是,其电平由外部电路决定*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(KEY1_INT_GPIO_PORT, &GPIO_InitStructure);
//初始化EXTI
/* 选择EXTI的信号源 */
GPIO_EXTILineConfig(KEY1_INT_EXTI_PORTSOURCE, KEY1_INT_EXTI_PINSOURCE);
EXTI_InitStructure.EXTI_Line = KEY1_INT_EXTI_LINE;
/* EXTI为中断模式 */
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
/* 上升沿中断 */
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
/* 使能中断 */
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
/*--------------------------KEY2配置-----------------------------*/
/* 选择按键用到的GPIO */
GPIO_InitStructure.GPIO_Pin = KEY2_INT_GPIO_PIN;
/* 配置为浮空输入 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(KEY2_INT_GPIO_PORT, &GPIO_InitStructure);
/* 选择EXTI的信号源 */
GPIO_EXTILineConfig(KEY2_INT_EXTI_PORTSOURCE, KEY2_INT_EXTI_PINSOURCE);
EXTI_InitStructure.EXTI_Line = KEY2_INT_EXTI_LINE;
/* EXTI为中断模式 */
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
/* 下降沿中断 */
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
/* 使能中断 */
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
supplement:外部中断结构体
typedef struct
{
uint32_t EXTI_Line; //用于产生中断/事件线
EXTIMode_TypeDef EXTI_Mode; //事件/中断模式选择
EXTITrigger_TypeDef EXTI_Trigger; //上升沿/下降沿触发选择,也可以是上升沿&下降沿都触发
FunctionalState EXTI_LineCmd; //对应中断屏蔽/事件屏蔽寄存器
}EXTI_InitTypeDef;
需要注意的是,在选择哪个外部引脚作为中断/事件触发引脚时,其配置函数在“stm32f10x_gpio.h”中,其函数原型为
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
第一个参数配置GPIOA---GPIOG,第二个参数配置GPIO_PinSource0 -- GPIO_PinSource15
2.2.初始化EXTI用于产生中断/事件
2.3.初始化NVIC,用于处理中断
注意,在编写初始化函数时,NVIC_IRQChannel的赋值尤为要注意。
在“stm32f10x.h”中查找。在编写大容量芯片时,中断线大于5时,并不在单独定义,而是[5..9]定义一个,[10..15]定义一个。
2.4.编写中断服务函数
为便于管理,应统一写在stm32f10x_it.c文件中,但要注意,函数名并不是任意的,而要去“startup_stm32f10x_hd.s”中查找中断向量表
以中断线EXTI0为例,
同时也要注意,类比于上面,EXTI5之后也是公用一个函数名。
编写中断服务函数常用套路