stm32—外部中断、中断和事件的区别


EXTI 简介

外部中断/事件控制器(EXTI):包含多达 20 个用于产生事件/中断请求的边沿检测器。
EXTI 的每根输入线都可单独进行配置,以选择类型(中断或事件)和相应的触发事件(上升沿触发、下降沿触发或边沿触发),还可独立地被屏蔽。

EXTI 框图

在这里插入图片描述

  • “20”(如标号9):表示在控制器内部类似的信号线路有 20 个( EXTI 总共有 20 个中断/事件线)。
  • 20个的原理都是一样的,只需要理解一个

EXTI的两大功能:
(1)产生中断,1-2-3-4-5 用于产生中断
(2) 产生事件,3-6-7-8 用于产生事件

(1)中断的线路(1-2-3-4-5)

在这里插入图片描述

①输入线,EXTI 控制器有 20 个中断/事件输入线,可以通过寄存器设置为任意一个 GPIO,也可以是一些外设的事件,输入线一般是存在电平变化的信号。
②边沿检测电路,EXTI 可以对触发方式进行选择,通过上升沿触发选择寄存器和下降沿触发选择寄存器对应位的设置来控制信号触发。
③或门电路,一端输入信号线由边沿检测电路提供,一端由软件中断事件寄存器(可以使用软件来启动中断/事件线)提供,只要有一个为有效信号 1,则输出有效信号 1。输出的信号会被保存到挂起寄存器内,电路输出为 1 就会把挂起寄存器对应位置 1。

④与门电路,一端输入信号线由③电路输出提供,一端由中断屏蔽寄存器提供,只有当两者都为有效信号 1,才会输出有效信号 1。
⑤将挂起寄存器内容输入到 NVIC 内,从而实现系统中断事件的控制。

(2)产生事件线路(1-2-3-6-7-8)

在这里插入图片描述

⑥与门电路,一端来至标号 ③的输出信号,一端来至事件屏蔽寄存器(可以简单的控制事件屏蔽寄存器来实现是否产生事件),只有两者都为有效电平 1,才会输出有效高电平
⑦脉冲发生器电路,⑥有效,脉冲发生器会输出一个脉冲信号。
⑧脉冲信号:由脉冲发生器产生,是事件线路的终端,此脉冲信号可供其他外设电路使用,比如定时器、ADC 等。这样的脉冲信号通常用来触发定时器、ADC 等开始转换。

疑惑:中断和事件的区别

1.硬件级与软件级

中断线路最终会输入到 NVIC 控制器中,从而会运行中断服务函数,实现中断内功能,这个是软件级的。
事件线路最后产生的脉冲信号会流向其他的外设电路,是硬件级的。

2.事件不一定产生中断

比如我妈妈叫我等洗衣机的衣服洗好再去晾衣服,那我现在还在做我手头的事情,洗衣机洗衣服当做是一个事件,这个时候我并没有中断自己的事情去晾衣服;但是洗衣机洗好了并发出响声通知我去晾衣服,这个时候我就需要中断我手头的事情去晾衣服,晾衣服就是我的中断服务函数,那么晾完衣服后,我就返回我的断点继续去做我自己的事情
对应到Stm32:AD转换是一个事件(上述已有举例),但是转换结束就是一个中断事件。

外部中断/事件线映射

在这里插入图片描述
中断/事件线(20根)分类:
(1)供外部 IO 口使用的中断线有 16 根,每个 GPIO 端口均有 16 个管脚,因此把每个端口的 16 个 IO 对应那 16 根中断线 EXTI0-EXTI15。
在这里插入图片描述

(2)EXTI线16连接到PVD输出
(3)EXTI线17连接到RTC闹钟事件
(4)EXTI线18连接到USB唤醒事件
(5)EXTI线19连接到以太网唤醒事件(只适用于互联型产品)

EXTI 配置步骤

(1)使能 IO 口时钟,配置对应的IO口模式为输入
(2)开启 AFIO 时钟,设置 IO 口与中断线的映射关系,将 GPIO 映射到对应的中断线上,然后把 GPIO 映射到对应的中断线上,配置 GPIO 与中断线映射
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //将中断线 0 映射到 GPIOA 端口
(3)配置中断分组(NVIC),使能中断
在这里插入图片描述

(4)初始化 EXTI,选择触发方式

EXTI_InitTypeDef 结构体成员变量如下:

typedef struct 
{ 
//中断/事件线,EXTI0-EXTI20
uint32_t EXTI_Line; 
//EXTI模式,中断模式EXTI_Mode_Interrup和事件模式EXTI_Mode_Event。 
EXTIMode_TypeDef EXTI_Mode; 
//EXTI_Trigger:触发方式选择:上升沿触发EXTI_Trigger_Rising、下降沿触发 EXTI_Trigger_Falling、上升沿和下降沿触发 
EXTITrigger_TypeDef EXTI_Trigger; 
//中断线使能或失能 
FunctionalState EXTI_LineCmd;
}EXTI_InitTypeDef; 
 

(6)编写 EXTI 中断服务函数
在这里插入图片描述

  • 0-4 个中断线都是独立的函数EXTIx_IRQHandler
  • 5-9 共用一个函数 EXTI9_5_IRQHandler
  • 10-15 也共用一个函数XTI15_10_IRQHandler

初始化函数

要使用外部中断,我们必须先对它进行配置。EXTI 初始化代码如下:

void My_EXTI_Init(void)  
{ 
NVIC_InitTypeDef NVIC_InitStructure; 
EXTI_InitTypeDef EXTI_InitStructure; 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); 
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);//选择 GPIO 管 
脚用作外部中断线路 
//EXTI0 NVIC 配置 
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//EXTI0 中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级 
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级 
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道使能 
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化 VIC 寄存器 

EXTI_InitStructure.EXTI_Line=EXTI_Line0; 
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; 
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising; 
EXTI_InitStructure.EXTI_LineCmd=ENABLE; 
EXTI_Init(&EXTI_InitStructure); 
} 

  • 13
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
外部中断是指由外部信号触发的中断事件。在STM32微控制器中,外部中断可以通过引脚的外部触发方式来实现。以下是一些关于STM32外部中断的常见问题和回答: 1. 如何配置外部中断? 首先,选择要作为外部中断触发源的引脚。然后,使用GPIO库函数将引脚配置为输入模式,并启用外部中断功能。最后,配置外部中断触发条件,例如上升沿、下降沿或双边沿触发。具体的配置步骤和函数可以参考ST固件库或者HAL库的文档。 2. 如何编写外部中断中断服务函数? 在STM32微控制器上,外部中断触发时,会跳转到预定义的中断服务函数。您需要在代码中编写该中断服务函数,并根据需求进行处理。可以使用HAL库提供的函数来判断是哪个引脚触发了中断,并进行相应的处理。 3. 外部中断有哪些触发方式? STM32微控制器支持多种触发方式,包括上升沿触发(Rising Edge Trigger)、下降沿触发(Falling Edge Trigger)、双边沿触发(Rising/Falling Edge Trigger)等。您可以根据实际需求选择合适的触发方式。 4. 外部中断能同时处理多个引脚的中断吗? 是的,STM32微控制器支持同时处理多个引脚的外部中断。您可以配置多个引脚为外部中断触发源,并在中断服务函数中根据需要进行处理。 请注意,以上回答是基于一般情况下的使用,具体的配置和编程方式可能会因不同的STM32系列、芯片型号和开发环境而有所差异。建议您参考相关的文档和例程来进行具体的配置和编程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值