我是靠谱客的博主 曾经电脑,最近开发中收集的这篇文章主要介绍STM32笔记 (八)EXTI外部中断(通过按键来触发EXTI中断)简介相关寄存器外部中断/事件控制器框图GPIO的连接映像图EXTI的初始化结构体通过按键来触发EXTI中断,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
EXTI外部中断
- 简介
- 相关寄存器
- 外部中断/事件控制器框图
- GPIO的连接映像图
- 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);
}
最后
以上就是曾经电脑为你收集整理的STM32笔记 (八)EXTI外部中断(通过按键来触发EXTI中断)简介相关寄存器外部中断/事件控制器框图GPIO的连接映像图EXTI的初始化结构体通过按键来触发EXTI中断的全部内容,希望文章能够帮你解决STM32笔记 (八)EXTI外部中断(通过按键来触发EXTI中断)简介相关寄存器外部中断/事件控制器框图GPIO的连接映像图EXTI的初始化结构体通过按键来触发EXTI中断所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复