目录
1. EXTI简介
2. EXTI基本结构
3. AFIO复用IO口
4. EXTI框图
5. EXTI程序配置
5.1 首先先配置要使用的GPIO口的引脚
5.2 配置AFIO数据选择器,选择想要中断的引脚
5.3 EXTI配置
EXTI(Extern Interrupt)外部中断 EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序。
简单来说:电平变化,触发中断
支持的触发方式:上升沿/下降沿/双边沿/软件触发
·上升沿触发
数字电平从低电平(数字“0”)变为高电平(数字“1”)的那一瞬间叫作上升沿。 上升沿触发是当信号有上升沿时的开关动作,当电位由低变高而触发输出变化的就叫上升沿触发。也就是当测到的信号电位是从低到高也就是上升时就触发,叫做上升沿触发。
·下降沿触发
数字电路中,数字电平从高电平(数字“1”)变为低电平(数字“0”)的那一瞬间叫作下降沿。下降沿触发是当信号有下降沿时的开关动作,当电位由高变低而触发输出变化的就叫下降沿触发。也就是当测到的信号电位是从高到低也就是下降时就触发,叫做下降沿触发。
那么我们可以很好的理解两种触发:
上升沿触发 就是当电压从低变高时触发中断
下降沿触发 就是当电压从高变低时触发中断
双边沿触发
可以看做上升沿和下降沿的结合,也就是二者都可以触发中断。
软件触发
引脚没变化,程序执行代码触发中断。
支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断
也就是PA0,PB0,PC0等不能同时使用,Pin引脚需要不同,例如PA0和PA1,PA0和PB1等能同时用。
通道数:16个GPIO_Pin(0~15),外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒
触发响应方式:中断响应/事件响应
中断响应:申请中断,CPU执行中断
事件响应:触发外设,信号不会在到CPU,直接触发其他外设,外设间的联合操作
每个GPIO都有16个引脚,每个引脚都能触发中断,但是会通过AFIO中断引脚选择的模块,在GPIOA,GPIOB,GPIOC......在16个引脚中选择一个Pin连接。
相当于在PA0,PB0,PC0......选个0,PA1,PB1,PC1......选个1,依次类推
其中5~9,还有10~15,分别写在一个函数内,使用过程中还要通过标志位,进一步判断到底是哦哪个中断。
AFIO主要用于引脚复用功能的选择和重定义
在STM32中,AFIO主要完成两个任务:复用功能引脚重映射、中断引脚选择
我们要想对PC13和PC14等引脚进行当做普通GPIO口使用则需要AFIO的参与:
//时钟使能
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC , ENABLE );
RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO , ENABLE );
PWR_BackupAccessCmd( ENABLE ); //允许修改RTC和后备寄存器
RCC_LSEConfig( RCC_LSE_OFF ); //关闭外部低速时钟,PC14+PC15可以用作普通IO
BKP_TamperPinCmd(DISABLE); //关闭入侵检测功能,PC13可以用作普通IO
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 |GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOC, &GPIO_InitStructure);
PWR_BackupAccessCmd(DISABLE);/* 禁止修改RTC和后备寄存器*/
//BKP_ITConfig(DISABLE); /* 禁止TAMPER 中断*/
进行RCC时钟配置,这里我使用的事PC13和PC14引脚:
//时钟使能
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC , ENABLE );
RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO , ENABLE );
PWR_BackupAccessCmd( ENABLE ); //允许修改RTC和后备寄存器
RCC_LSEConfig( RCC_LSE_OFF ); //关闭外部低速时钟,PC14+PC15可以用作普通IO
BKP_TamperPinCmd(DISABLE); //关闭入侵检测功能,PC13可以用作普通IO
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 |GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOC, &GPIO_InitStructure);
PWR_BackupAccessCmd(DISABLE);/* 禁止修改RTC和后备寄存器*/
//BKP_ITConfig(DISABLE); /* 禁止TAMPER 中断*/
下面做个了解
用来复位AFIO外设,调用这个函数,AFIO的外设配置就会全部清除:
void GPIO_AFIODeInit(void);
锁定GPIO配置,调用函数,参数指定某一个引脚,该引脚参数就会被锁定,防止以外更改:
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
用来配置AFIO的时间输出功能:
void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource); void GPIO_EventOutputCmd(FunctionalState NewState);
引脚重映射:
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
配置AFIO数据选择器,选择想要中断的引脚:
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
以太网外设有关,暂时用不到:
void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource14);
拓展:
清除配置的EXTI:
void EXTI_DeInit(void);
把参数传递的结构体变量赋一个默认值:
void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);
软件触发外部中断:
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);
主程序:获取指定函数是否置“1”:
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);
对置“1”的标志位进行清除:
void EXTI_ClearFlag(uint32_t EXTI_Line);
中断函数内进行置“1”和清除:
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line); void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line13 | EXTI_Line14;//指定需要配置的中断线
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//指定选择的中断线的新状态,开启中断
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//指定外部中断线的模式,中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发,指定触发信号的有效边沿,Rising上升沿出发
EXTI_Init(&EXTI_InitStructure);
学习笔记,仅供参考。