概述
目录
- EXTI 简介
- EXTI 框图
- (1)中断的线路(1-2-3-4-5)
- (2)产生事件线路(1-2-3-6-7-8)
- 疑惑:中断和事件的区别
- 1.硬件级与软件级
- 2.事件不一定产生中断
- 外部中断/事件线映射
- EXTI 配置步骤
- 初始化函数
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);
}
最后
以上就是传统彩虹为你收集整理的stm32—外部中断、中断和事件的区别EXTI 简介EXTI 框图疑惑:中断和事件的区别外部中断/事件线映射EXTI 配置步骤的全部内容,希望文章能够帮你解决stm32—外部中断、中断和事件的区别EXTI 简介EXTI 框图疑惑:中断和事件的区别外部中断/事件线映射EXTI 配置步骤所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复