历史上的今天
返回首页

历史上的今天

今天是:2024年12月09日(星期一)

正在发生

2021年12月09日 | 【STM32】EXTI---外部中断/事件控制器

2021-12-09 来源:eefocus

一、EXTI 简介

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


二、EXTI 功能框图

在这里插入图片描述

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

EXTI 是挂靠在 APB2 总线上的。


三、中断/事件线

image.png?imageView2/2/w/550

image.png?imageView2/2/w/550

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 外部中断配置寄存器的时钟宏定义的使用可以便于代码移植


推荐阅读

史海拾趣

Broadcom(博通)公司的发展小趣事

进入21世纪,随着网络泡沫的破灭,博通陷入了严重的财务困境。亏损累计高达65亿美元,股价大幅下跌,公司甚至不得不裁员以维持运营。然而,正是在这样的困境中,博通展现出了坚韧不拔的精神。通过优化产品结构、调整市场策略,博通逐渐走出了低谷,并在2003年推出了全球第一个802.11b单片机,重新赢得了市场的关注。

Dearborn Electronics Inc公司的发展小趣事

Dearborn Electronics Inc.注重国际合作与交流,与全球多家知名企业和研究机构建立了紧密的合作关系。通过引进国外先进的技术和管理经验,公司不断提升自身的核心竞争力。同时,公司也积极参与国际市场竞争,拓展海外市场,为未来的发展奠定了坚实的基础。

以上这些故事框架仅供参考,你可以根据这些框架进行深入的调查和研究,撰写出具体、详细的发展故事。

Hisetec Electronic Co Ltd公司的发展小趣事

背景:随着环保意识的增强,消费者对电子产品的环保要求也越来越高。Hisetec Electronic Co Ltd公司积极响应这一趋势,将绿色环保理念融入产品设计、生产和回收的全过程。

发展:公司投入大量资金研发环保材料和生产工艺,确保产品从源头到终端都符合环保标准。同时,公司还建立了完善的电子废弃物回收体系,对废旧电子产品进行拆解、分类和再利用。这些举措不仅赢得了消费者的信任和支持,还推动了整个电子行业的绿色升级。

FEI Microwave Inc公司的发展小趣事

随着5G技术的商用化,微波通信市场迎来了新的发展机遇。为了满足市场需求,FEI Microwave Inc公司迅速调整研发策略,加大投入力度,成功研发出了一系列针对5G应用的微波通信产品。这些产品以其高性能、高可靠性和高性价比迅速在市场上获得了认可,为FEI Microwave Inc公司赢得了更多的市场份额。

Cableform Inc公司的发展小趣事

随着全球化趋势的加速推进,Cableform Inc公司开始实施全球化战略。公司在全球范围内设立了多个分支机构和研发中心,加强了与国际同行的合作与交流。同时,公司还积极参与国际展览和技术研讨会等活动,展示了其最新的技术成果和产品应用。这些举措不仅提升了公司在国际市场的知名度和影响力,也为公司的长期发展奠定了坚实的基础。

这五个故事虽然是虚构的,但它们反映了Cableform Inc公司可能经历的一些重要发展阶段和关键事件。当然,实际的发展过程可能更加复杂和多变,但无论如何,这些故事都展现了公司在电子行业中的坚韧不拔和不断进取的精神。

圣邦微电子(Fangtek)公司的发展小趣事

进入21世纪,电子行业迎来了快速发展的黄金时期。为了适应市场需求的变化,Cableform Inc不断加大研发投入,致力于技术创新。公司成功开发出了一系列具有自主知识产权的电磁控制产品,涵盖了从直流电机控制到高精度磁铁控制等多个领域。这些技术创新不仅提升了公司的核心竞争力,也为客户提供了更加高效、可靠的解决方案。

问答坊 | AI 解惑

读写HT24 系列的EEPROM 应用范例

發點读写HT24 系列的EEPROM 应用范例…

查看全部问答>

稳压电源实用手册

稳压电源实用手册 [ 本帖最后由 文浩 于 2009-7-9 17:06 编辑 ]…

查看全部问答>

avr单片机读书笔记

好东西,不想独自放到电脑里面,与大家共享. 单片机学习及提升的绝佳资料,可以让你直接成为单片机高手,为arm学习打下坚实的基础. …

查看全部问答>

嵌入式硬盘录像机录像的磁盘,linux下无法挂载

Linux系统下新增一块500G磁盘,这个磁盘是用于嵌入式硬盘录像机录像的磁盘,我需要把里面的内容COPY出来,但是无法挂载这块磁盘。用fdisk -l出现如下提示: Disk /dev/sda: 500.1G,500107862016 bytes 255 heads,63 sectors/track,60801 cylind ...…

查看全部问答>

100分请您提供WinCEPB50-061231-Product-Update-Rollup-Armv4I.msi,GOOGLE至凌晨没找着

如题,多谢。 我已经打了了: WinCEPB50-081231-Product-Update-Rollup-Armv4I.msi WinCEPB50-090131-2009M01-Armv4I.msi WinCEPB50-090228-2009M02-Armv4I.msi 结果编译时,发现WINCE500\\PUBLIC\\COMMON\\OAK\\DRIVERS\\SDCARD\\SDBUSDRIVER ...…

查看全部问答>

关于WINCE50下中断号

请问各位:    1、WINCE50下是不是分物理中断号和逻辑中断号??物理中断号就是定义的跟硬件开关中断相关的中断号,逻辑中断号是物理中断号对应的由系统调用的中断号???这个理解对不对???    2、BSP中SD驱动的注册表信 ...…

查看全部问答>

/dev 下没有U盘的设备文件

有HOTPLUG udev /DEV 下没有U盘设备文件 fdisk -l 也没有!…

查看全部问答>

目标板tftp怎么开启? (

主机弄好了TFTP-SERVER,目标板默认启动无TFTP服务,查了下帮助是用TFTPBOOT开启 MINICOM登入后,输入TFTPBOOT后,目标板IP是192。168。1。134 SERVER地址是192。168。1。106 但是连接不上总是TRY AGAIN,我把主机地址改为192。168。1。106也连 ...…

查看全部问答>

sql ce2.0用rda连接sql server,出现问题,在线等

请教一个问题,我用rda连接sql server ,但出现以下错误: 未处理的“System.Data.SqlServerCe.SqlCeException”类型的异常出现在 System.Data.SqlServerCe.dll 中。 我是C# 2003、sql server 2000、Pda是win mobile 5.0 我的代码如下: string ...…

查看全部问答>

異步、同步通信?

什麽叫異步、同步通信,他們的區別是什麽?…

查看全部问答>