STM32F1外部中断EXTI

目录

1.  EXTI简介

2.  EXTI基本结构

3.  AFIO复用IO口

4.  EXTI框图

5.  EXTI程序配置

5.1  首先先配置要使用的GPIO口的引脚

5.2  配置AFIO数据选择器,选择想要中断的引脚

5.3  EXTI配置


1.  EXTI简介

        EXTI(Extern Interrupt)外部中断 EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序。

简单来说:电平变化,触发中断

STM32F1外部中断EXTI_第1张图片

支持的触发方式:上升沿/下降沿/双边沿/软件触发

·上升沿触发
        数字电平从低电平(数字“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,直接触发其他外设,外设间的联合操作

2.  EXTI基本结构

        每个GPIO都有16个引脚,每个引脚都能触发中断,但是会通过AFIO中断引脚选择的模块,在GPIOA,GPIOB,GPIOC......在16个引脚中选择一个Pin连接。

        相当于在PA0,PB0,PC0......选个0,PA1,PB1,PC1......选个1,依次类推

STM32F1外部中断EXTI_第2张图片

        其中5~9,还有10~15,分别写在一个函数内,使用过程中还要通过标志位,进一步判断到底是哦哪个中断。

3.  AFIO复用IO口

AFIO主要用于引脚复用功能的选择和重定义

在STM32中,AFIO主要完成两个任务:复用功能引脚重映射、中断引脚选择

STM32F1外部中断EXTI_第3张图片

我们要想对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 中断*/

4.  EXTI框图

STM32F1外部中断EXTI_第4张图片

5.  EXTI程序配置

STM32F1外部中断EXTI_第5张图片

5.1  首先先配置要使用的GPIO口的引脚

        进行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);

5.2  配置AFIO数据选择器,选择想要中断的引脚

	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);

5.3  EXTI配置

	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);

学习笔记,仅供参考。

你可能感兴趣的:(STM32学习笔记,电视盒子,单片机,stm32,嵌入式硬件,c语言,运维,服务器)