STM32笔记 (八)EXTI外部中断(通过按键来触发EXTI中断)

简介

EXTI (External interrupt/event controller),也就是外部中断/事件控制器,用于单片机对外部事件做出一定的反应,如利用EXTI外部中断来检测按键是否按下。支持多达20个软件的中断/事件请求,每个 GPIO 都可以被设置为输入线,占用 EXTI0 至EXTI15, 而且每一个中断/事件都有独立的触发和屏蔽,也就是说每一个事件都能自定义触发的方式和屏蔽掉所选定的中断路线,这些都可以通过对应的寄存器来配置。

相关寄存器

  • 中断屏蔽寄存器(EXTI_IMR)
    用来屏蔽中断请求
    在这里插入图片描述
  • 事件屏蔽寄存器(EXTI_EMR)
    用来屏蔽事件请求
    在这里插入图片描述
  • 上升沿触发选择寄存器(EXTI_RTSR)
    上升沿触发:从低电平到高电平
    在这里插入图片描述
  • 下降沿触发选择寄存器(EXTI_FTSR)
    下降沿触发:从高电平到低电平
    在这里插入图片描述
  • 软件中断事件寄存器(EXTI_SWIER)
    在这里插入图片描述
  • 挂起寄存器(EXTI_PR)
    在这里插入图片描述

外部中断/事件控制器框图

在这里插入图片描述

这里的 / 20 指的是有20种触发源,而且这二十种触发源所对应的框图都是一样的

GPIO的连接映像图

在这里插入图片描述
可以看到,GPIO的是受到AFIO_EXTICRx(外部中断配置寄存器)控制的,每次使用GPIO的外部中断都需要对其使能,这四个寄存器,每一个配置GPIO的四个编号引脚
在这里插入图片描述

EXTI的初始化结构体

typedef struct
{
  uint32_t EXTI_Line;             //中断/事件线 
   
  EXTIMode_TypeDef EXTI_Mode;       //模式

  EXTITrigger_TypeDef EXTI_Trigger;  //触发方式(上升或下降)

  FunctionalState EXTI_LineCmd;   //EXTI使能
    
}EXTI_InitTypeDef;

通过按键来触发EXTI中断

流程图:
在这里插入图片描述
示例代码有关电路图:
在这里插入图片描述

示例代码:

#include "stm32f10x.h"
#include "bsp_systick.h"
#include "bsp_usart.h"

uint8_t flag=1;

void LED_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
	
	GPIO_Init(GPIOB,&GPIO_InitStructure);
}

void EXTI_GPIO_Config()
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO,ENABLE);
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);

	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	
	GPIO_Init(GPIOE,&GPIO_InitStructure);
}

void EXTI_Config(void)
{
	EXTI_InitTypeDef EXTI_InitStructure;
	
	EXTI_InitStructure.EXTI_Line = EXTI_Line4;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	
	EXTI_Init(&EXTI_InitStructure);
}

void NVIC_Config(void)
{
	NVIC_InitTypeDef NVIC_InitStructure;
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
	
	NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	
	NVIC_Init(&NVIC_InitStructure);
}

int main(void)
{	
	LED_Config();
	EXTI_GPIO_Config();
	EXTI_Config();
	NVIC_Config();
	
	GPIO_SetBits(GPIOB,GPIO_Pin_5);
	while(1)
	{
	}
}

void EXTI4_IRQHandler(void)
{
	delay_ms(10); //软件消抖
	if( (GPIOE->IDR & (1<<4)) == 0)
	{
		if(flag)
		{
			GPIOB->ODR = (0<<5);
			flag = !flag;
		}
		else
		{
			GPIOB->ODR = (1<<5);
			flag = !flag;
		}
			
	}
	EXTI_ClearITPendingBit(EXTI_Line4);
}




原创文章 12 获赞 0 访问量 1102

猜你喜欢

转载自blog.csdn.net/zcy_cyril/article/details/105935369