【STM32】EXTI---外部中断/事件控制器

Author:AXYZdong 自动化专业 工科男
有一点思考,有一点想法,有一点理性!
定个小小目标,努力成为习惯!在最美的年华遇见更好的自己!
CSDN@AXYZdong,CSDN首发,AXYZdong原创
唯一博客更新的地址为: 👉 AXYZdong的博客 👈

在这里插入图片描述


  • 开发板:stm32f407VET6
  • 开发环境:keil5 MDK

插播一条反爬虫信息,读者可以忽略:


在这里插入图片描述

2020电赛前夜的一篇文章,明天8点开题,加油!


一、EXTI 简介

外部中断/事件控制器(EXTI)管理了控制器的 23个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI 可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。


二、EXTI 功能框图


在这里插入图片描述

  • 信号线上斜杠并标注 “23” 字样 :表示在控制器内部类似的信号线路有23个。
  • EXTI 是挂靠在 APB2 总线上的。

三、中断/事件线


中断/事件线输入源
EXTI0PX0(X 可为 A,B,C,D,E,F,G,H,I)
EXTI1PX1(X 可为 A,B,C,D,E,F,G,H,I)
EXTI2PX2(X 可为 A,B,C,D,E,F,G,H,I)
EXTI3PX3(X 可为 A,B,C,D,E,F,G,H,I)
EXTI4PX4(X 可为 A,B,C,D,E,F,G,H,I)
EXTI5PX5(X 可为 A,B,C,D,E,F,G,H,I)
EXTI6PX6(X 可为 A,B,C,D,E,F,G,H,I)
EXTI7PX7(X 可为 A,B,C,D,E,F,G,H,I)
EXTI8PX8(X 可为 A,B,C,D,E,F,G,H,I)
EXTI9PX9(X 可为 A,B,C,D,E,F,G,H,I)
EXTI10PX10(X 可为 A,B,C,D,E,F,G,H,I)
EXTI11PX11(X 可为 A,B,C,D,E,F,G,H,I)
EXTI12PX12(X 可为 A,B,C,D,E,F,G,H,I)
EXTI13PX13(X 可为 A,B,C,D,E,F,G,H,I)
EXTI14PX14(X 可为 A,B,C,D,E,F,G,H,I)
EXTI15PX15(X 可为 A,B,C,D,E,F,G,H,I)
EXTI16可编程电压检测器(PVD)输出
EXTI17RTC 闹钟事件
EXTI18USB OTG FS 唤醒事件
EXTI19以太网唤醒事件
EXTI20USB OTG HS(在 FS 中配置)唤醒事件
EXTI21RTC 入侵和时间戳事件
EXTI22RTC 唤醒事件
  • EXTI0至 EXTI15用于 GPIO,通过编程控制可以实现任意一个 GPIO作为EXTI 的输入源
  • SYSCFG 外部中断配置寄存器 1 配置EXTI0

在这里插入图片描述

▲ EXTI0输入源选择


四、EXTI 初始化结构体

typedef struct
{
   //中断/事件线
  uint32_t EXTI_Line;               /*!< Specifies the EXTI lines to be enabled or disabled.
                                         This parameter can be any combination value of @ref EXTI_Lines */
   //EXTI 模式
  EXTIMode_TypeDef EXTI_Mode;       /*!< Specifies the mode for the EXTI lines.
                                         This parameter can be a value of @ref EXTIMode_TypeDef */
   //触发类型
  EXTITrigger_TypeDef EXTI_Trigger; /*!< Specifies the trigger signal active edge for the EXTI lines.
                                         This parameter can be a value of @ref EXTITrigger_TypeDef */
   //EXTI 控制
  FunctionalState EXTI_LineCmd;     /*!< Specifies the new state of the selected EXTI lines.
                                         This parameter can be set either to ENABLE or DISABLE */ 
}EXTI_InitTypeDef;

4.1. 中断/事件线

#define EXTI_Line0       ((uint32_t)0x00001)     /*!< External interrupt line 0 */
#define EXTI_Line1       ((uint32_t)0x00002)     /*!< External interrupt line 1 */
#define EXTI_Line2       ((uint32_t)0x00004)     /*!< External interrupt line 2 */
#define EXTI_Line3       ((uint32_t)0x00008)     /*!< External interrupt line 3 */
#define EXTI_Line4       ((uint32_t)0x00010)     /*!< External interrupt line 4 */
#define EXTI_Line5       ((uint32_t)0x00020)     /*!< External interrupt line 5 */
#define EXTI_Line6       ((uint32_t)0x00040)     /*!< External interrupt line 6 */
#define EXTI_Line7       ((uint32_t)0x00080)     /*!< External interrupt line 7 */
#define EXTI_Line8       ((uint32_t)0x00100)     /*!< External interrupt line 8 */
#define EXTI_Line9       ((uint32_t)0x00200)     /*!< External interrupt line 9 */
#define EXTI_Line10      ((uint32_t)0x00400)     /*!< External interrupt line 10 */
#define EXTI_Line11      ((uint32_t)0x00800)     /*!< External interrupt line 11 */
#define EXTI_Line12      ((uint32_t)0x01000)     /*!< External interrupt line 12 */
#define EXTI_Line13      ((uint32_t)0x02000)     /*!< External interrupt line 13 */
#define EXTI_Line14      ((uint32_t)0x04000)     /*!< External interrupt line 14 */
#define EXTI_Line15      ((uint32_t)0x08000)     /*!< External interrupt line 15 */
#define EXTI_Line16      ((uint32_t)0x10000)     /*!< External interrupt line 16 Connected to the PVD Output */
#define EXTI_Line17      ((uint32_t)0x20000)     /*!< External interrupt line 17 Connected to the RTC Alarm event */
#define EXTI_Line18      ((uint32_t)0x40000)     /*!< External interrupt line 18 Connected to the USB OTG FS Wakeup from suspend event */                                    
#define EXTI_Line19      ((uint32_t)0x80000)     /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */
#define EXTI_Line20      ((uint32_t)0x00100000)  /*!< External interrupt line 20 Connected to the USB OTG HS (configured in FS) Wakeup event  */
#define EXTI_Line21      ((uint32_t)0x00200000)  /*!< External interrupt line 21 Connected to the RTC Tamper and Time Stamp events */                                               
#define EXTI_Line22      ((uint32_t)0x00400000)  /*!< External interrupt line 22 Connected to the RTC Wakeup event */ 

4.2. EXTI 模式

typedef enum
{
  EXTI_Mode_Interrupt = 0x00,  //产生中断
  EXTI_Mode_Event = 0x04       //产生事件
}EXTIMode_TypeDef;

4.3. 触发类型

typedef enum
{
  EXTI_Trigger_Rising = 0x08,         //上升沿
  EXTI_Trigger_Falling = 0x0C,        //下降沿
  EXTI_Trigger_Rising_Falling = 0x10  //上升沿和下降沿都触发
}EXTITrigger_TypeDef;

4.4. EXTI 控制

使能 EXTI ,一般都是使能,ENABLE

五、外部中断控制实验

按键作为外部输入,按下按键触发外部中断,进入中断服务函数。

编程要点

  • 初始化LED的GPIO
  • 开启按键GPIO时钟和SYSCFG时钟
  • 配置按键GPIO为输入模式
  • 配置NVIC
  • 按键GPIO连接到EXTI输入
  • 配置EXTI中断/事件线
  • EXTI中断服务函数

EXTI.h

// =============================================
# @Time    : 2020-10-09
# @Author  : AXYZdong
# @CSDN    : https://blog.csdn.net/qq_43328313
# @FileName: exti.h
# @Software: keil5 MDK
// =============================================

#ifndef _EXTI_H
#define _EXTI_H

//引脚宏定义  
/*******************************************************/ 
#define KEY1_EXTI_PORTSOURCE   EXTI_PortSourceGPIOE
#define KEY1_EXTI_PINSOURCE    EXTI_PinSource3
#define KEY1_EXTI_LINE         EXTI_Line3
#define KEY1_EXTI_IRQ          EXTI3_IRQn

#define KET1_IRQHandler        EXTI3_IRQHandler

void EXTI_Config(void);

#endif

EXTI.c

// =============================================
# @Time    : 2020-10-09
# @Author  : AXYZdong
# @CSDN    : https://blog.csdn.net/qq_43328313
# @FileName: EXTI.c
# @Software: keil5 MDK
// =============================================

#include "stm32f4xx.h"
#include "exti.h"
#include "bsp_key.h"
#include "delay.h"

uint8_t flag = 0x00;
void EXTI_Config(void)
{	
	EXTI_InitTypeDef EXTI_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	/* 使能 SYSCFG 时钟 ,使用 GPIO 外部中断时必须使能 SYSCFG 时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
	
  /* 连接 EXTI 中断源 到 key1 引脚 */ 	
	SYSCFG_EXTILineConfig(KEY1_EXTI_PORTSOURCE, KEY1_EXTI_PINSOURCE);
	
	EXTI_InitStructure.EXTI_Line = KEY1_EXTI_LINE;          //连接中断源
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;               //使能中断
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;     //中断模式
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
	EXTI_Init(&EXTI_InitStructure);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
	NVIC_InitStructure.NVIC_IRQChannel = KEY1_EXTI_IRQ;      //中断通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;  //抢占优先级1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =1;		 //子优先级1
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			 //IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	                         //根据指定的参数初始化VIC寄存器
	
}

void KET1_IRQHandler(void)
{
  delay_ms(10);
	if(KEY1 == RESET)
	{
	  flag++;
		flag &= 0x01;
		flag == RESET ? GPIO_SetBits(GPIOA,GPIO_Pin_6) : GPIO_ResetBits(GPIOA,GPIO_Pin_6);
	}
	while(!KEY1);
	EXTI_ClearITPendingBit(KEY1_EXTI_LINE);
}

main.c

// =============================================
# @Time    : 2020-10-09
# @Author  : AXYZdong
# @CSDN    : https://blog.csdn.net/qq_43328313
# @FileName: main.c
# @Software: keil5 MDK
// =============================================

#include "stm32f4xx.h"
#include "bsp_led.h"
#include "bsp_key.h"
#include "sys.h"
#include "delay.h"
#include "exti.h"

int main()
{ 
 	delay_init(168);        //初始化延时函数
	LED_GPIO_Config();      //初始化LED端口 
 	KEY_Init();             //初始化与按键连接的硬件接口
	EXTI_Config();          //初始化外部中断
	while(1)
	{
	}
}

实验现象

按下 KEY1 并弹开,LED点亮。再按下 KEY1 并弹开,LED熄灭。

六、总结

  • 注意 .h 文件中 EXTI 中断/事件线的配置
  • 与 f103 不同,f407需要开启 SYSCFG 外部中断配置寄存器的时钟
  • 宏定义的使用可以便于代码移植

【参考文献】

[1] 《零死角玩转 STM32—基于野火 F407[霸天虎]开发板 》



「你可能还想看」系列文章:
【STM32】点亮LED
【STM32】GPIO输入—按键检测
【STM32】0.96寸OLED显示屏(7针SPI协议)软件模拟SPI
【STM32】1.44寸TFT液晶屏显示字符、汉字和图片
【STM32】stm32f407 + DS18B20 碰出不一样的火花
【STM32】5分钟了解STM32的串口通信
【STM32】串口通信—用代码与芯片对话
【STM32】串口通信出现乱码(使用官方标准库)
【STM32】TIM—基本定时器
【STM32】PWM 输出 (标准库)

【STM32】CubeMX+HAL 点亮LED
【STM32】CubeMX+HAL 输出PWM

【STM32】ST-LINK下载器下载后需复位,程序才运行的问题

其他相关文章:
【信号与系统】笔记合集,你确定不收藏吗?我已经收藏了
我用50行代码居然「让天猫精灵把客厅灯开了」
流程图在线绘制,快速、便捷、高效!


  本次的分享就到这里


11

好书不厌百回读,熟读自知其中意。将学习成为习惯,用知识改变命运,用博客见证成长,用行动证明努力。
如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!
听说 👉 点赞 👈 的人运气不会太差,每一天都会元气满满呦!^ _ ^ ❤️ ❤️ ❤️
码字不易,大家的支持就是我坚持下去的动力。点赞后不要忘了👉关注👈我哦!
更多精彩内容请前往 AXYZdong的博客


如果以上内容有任何错误或者不准确的地方,欢迎在下面👇留个言。或者你有更好的想法,欢迎一起交流学习~~~

  • 55
    点赞
  • 109
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AXYZdong

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值