EXTI——GPIO外部中断
前言
STM32的每一个GPIO都可以产生这个中断,体现在GPIO就是电平的变化,可能由高电平变成低电平,或者由低电平变为高电平,这些电平的变化需要一个外设来管理,最后传给NVIC,就是内核里面的嵌套向量中断控制器来处理这个中断,而这个检测GPIO口电平的变化的外设就是EXTI。
EXTI简介及其寄存器
EXTI :外部中断/事件控制器
外部就是检测GPIO
EXTI框图
输入线
共20根
另外四个EXTI线的连接方式如下:
● EXTI线16连接到PVD输出
● EXTI线17连接到RTC闹钟事件
● EXTI线18连接到USB唤醒事件
● EXTI线19连接到以太网唤醒事件(只适用于互联型产品)
配置输入线的寄存器为外部中断配置寄存器 1至4(AFIO_EXTICRx,x=(1,2,3,4)),寄存器各位配置的如下:
边沿检测电路
可选择上升沿或下降沿触发选择寄存器
有关的寄存器有 上升沿触发选择寄存器(EXTI_RTSR),下降沿触发选择寄存器(EXTI_FTSR)
由于输入线二十条,则上升沿和下降沿寄存器都有20个有效位来控制,置1就可使对应的输入线上升沿或下降沿触发中断
软件中断事件寄存器
对应位置1,则会在挂起寄存器对应位置一,先标志一下
软件中断事件寄存器和和边沿检测电路均置一,则通过或门输出一
中断屏蔽寄存器
对应位置一才会相应中断
中断屏蔽寄存器和请求挂起寄存器均置一时通过与门才会输出1传至NVIC中断控制器,产生相应中断
代码编写(按键控制LED的亮灭)
按键对应GPIO初始化
按键连接的GPIO为PA0,将其设为浮空输入模式
GPIO_InitTypeDef GPIO_InitStruct;
//初始化要连接到EXTI的GPIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStruct.GPIO_PinGPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING ;
GPIO_Init(GPIOA,&GPIO_InitStruct);
初始化EXTI
EXTI_InitTypeDef EXTI_InitStruct;
//初始化EXTI用于产生中断或事件
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//打开时钟
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//输入线为PA0
EXTI_InitStruct.EXTI_Line=EXTI_Line0;
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;//产生中断
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising