引子
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 | EXTI_InitTypeDef EXTI_InitStructure; |
这里,我们初始化了一个结构体,然后声明中断来自4号引脚,在STM32中,中断是依靠引脚选择的,所以如果E4和F4引脚同时收到了中断,就只能接收到一次中断。随后使能EXTI总线,然后设置为触发一个中断,下降沿触发。这里是因为我的按钮一边连接着地,一边连接着引脚,所以使用上拉输入,当按下时就会监听到一个低电平,产生一个下降沿。
NVIC的初始化
NVIC是一个嵌套中断处理结构,这里的配置也不难,只需要明白NVIC_InitTypeDef结构体就行:
1 | NVIC_InitTypeDef NVIC_InitStructure; |
这里,我初始化了一个结构体,然后声明中断来自于EXTI的4号,使能了NVIC总线,随后设置了抢占优先级和响应优先级,这两个优先级的含义是,如果CPU目前正在处理一个中断,如果抢占优先级是3,那么当前的2要比3小,更优先,所以会抢占掉当前的中断,如果当前的中断优先级是2,那么就排队,排队的时候程序的优先级首先看抢占优先级,随后看响应优先级。
GPIO中断配置
代码如下:
1 | GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource4); |
这里我们声明EXTI要监控来自于E4引脚的电平。
中断函数的编写
代码如下:
1 | void EXTI4_IRQHandler() { |
如果EXTI总线的中断标志位不是RESET,就表明当前遇到了一个中断,这个时候就打开LED0,值得注意的是,在中断函数里,一定要清除相应的标志位。
