【STM32】EXTI外部中断

引子

EXTI是STM32中负责处理外部事件和中断的外设,它监听指定引脚的电平变化,出现符合预期的变化就产生一个中断或者事件。在STM32中,EXTI中断是受NVIC中断系统管理的,从而实现中断的排队或者嵌套。

EXTI的代码应用实际上非常简单,只需要遵循:使能->初始化AFIO引脚->初始化EXTI->初始化NVIC->GPIO中断配置->编写中断处理函数即可。

初始化AFIO引脚

在STM32中,AFIO的一个功能就是中断引脚选择,所以在这里,初始化GPIO的时钟是不够的,我们也要初始化AFIO的时钟:

1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

EXTI的初始化

EXTI就是外部中断,这里的配置都很简单,只需要明白EXTI_InitTypeDef结构体就行:

1
2
3
4
5
6
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line4;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_Init(&EXTI_InitStructure);

这里,我们初始化了一个结构体,然后声明中断来自4号引脚,在STM32中,中断是依靠引脚选择的,所以如果E4和F4引脚同时收到了中断,就只能接收到一次中断。随后使能EXTI总线,然后设置为触发一个中断,下降沿触发。这里是因为我的按钮一边连接着地,一边连接着引脚,所以使用上拉输入,当按下时就会监听到一个低电平,产生一个下降沿。

NVIC的初始化

NVIC是一个嵌套中断处理结构,这里的配置也不难,只需要明白NVIC_InitTypeDef结构体就行:

1
2
3
4
5
6
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_Init(&NVIC_InitStructure);

这里,我初始化了一个结构体,然后声明中断来自于EXTI的4号,使能了NVIC总线,随后设置了抢占优先级和响应优先级,这两个优先级的含义是,如果CPU目前正在处理一个中断,如果抢占优先级是3,那么当前的2要比3小,更优先,所以会抢占掉当前的中断,如果当前的中断优先级是2,那么就排队,排队的时候程序的优先级首先看抢占优先级,随后看响应优先级。

GPIO中断配置

代码如下:

1
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource4);

这里我们声明EXTI要监控来自于E4引脚的电平。

中断函数的编写

代码如下:

1
2
3
4
5
6
void EXTI4_IRQHandler() {
if(EXTI_GetITStatus(EXTI_Line4) != RESET) {
LED0_ON();
EXTI_ClearITPendingBit(EXTI_Line4);
}
}

如果EXTI总线的中断标志位不是RESET,就表明当前遇到了一个中断,这个时候就打开LED0,值得注意的是,在中断函数里,一定要清除相应的标志位。

文章作者:
文章链接: https://www.coderlock.site/2025/12/18/【STM32】EXTI外部中断/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 寒夜雨