STM32 外部中断(EXTI)
实验:配置一个引脚的下降沿作为外部中断。
参考:江协科技
相关缩写
RCC(Reset and Clock Control) 复位和时钟控制
GPIO(General Purpose Input/Output) 通用输入/输出
AFIO(Alternate Function Input Output) 复用功能输入输出
EXTI(External Interrupt/Event Controller 外部中断/事件控制器)
NVIC(Nested vectored interrupt controller) 嵌套向量中断控制器
整体框图
主要步骤
0 使能时钟
开启GPIO引脚和AFIO的时钟。AFIO用来把GPIO引脚作为EXTI线
1 初始化 GPIO
设置为输入引脚
2 选择 GPIO 引脚做 EXTI_Line
把GPIO引脚作为EXTI线
3 初始化 EXTI 外设
配置这个EXTI线的使能、触发模式,触发后是中断还是事件
4 初始化 NVIC 外设
配置这个中断源的使能、优先级
代码
void CountSensor_Init(void) {
/*0 开启时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 开启GPIOB的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // 开启AFIO的时钟,外部中断必须开启AFIO的时钟
/*1 GPIO初始化*/
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); // 将PB14引脚初始化为上拉输入
/*2 AFIO选择中断引脚*/
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,
GPIO_PinSource14); // 将外部中断的14号线映射到GPIOB,即选择PB14为外部中断引脚
/*3 EXTI初始化*/
EXTI_InitTypeDef EXTI_InitStructure; // 定义结构体变量
EXTI_InitStructure.EXTI_Line = EXTI_Line14; // 选择配置外部中断的14号线
EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 指定外部中断线使能
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 指定外部中断线为中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 指定外部中断线为下降沿触发
EXTI_Init(&EXTI_InitStructure); // 将结构体变量交给EXTI_Init,配置EXTI外设
/*NVIC中断分组*/
// 注意:整个工程只需要配置一次
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 配置NVIC为分组2
// 即抢占优先级范围:0~3,响应优先级范围:0~3
// 此分组配置在整个工程中仅需调用一次
// 若有多个中断,可以把此代码放在main函数内,while循环之前
// 若调用多次配置分组的代码,则后执行的配置会覆盖先执行的配置
/*4 NVIC配置*/
NVIC_InitTypeDef NVIC_InitStructure; // 定义结构体变量
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; // 选择配置NVIC的EXTI15_10线
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 指定NVIC线路使能
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 指定NVIC线路的抢占优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定NVIC线路的响应优先级为1
NVIC_Init(&NVIC_InitStructure); // 将结构体变量交给NVIC_Init,配置NVIC外设
}