NVIC&EXTI

一、中断简介

什么是中断

打断CPU执行正常的程序,转而处理紧急程序,然后返回原暂停的程序继续运行,这就叫中断。

中断的作用和意义

1、实时控制。在确定时间内对相应事件作出响应,如:温度监控。

2、故障处理。检测到故障,需要第一时间处理,如:电梯门夹人了。

3、数据传输。不确定数据何时会来,如:串口数据接收。

STM32 GPIO外部中断简图

二、NVIC

NVIC基本概念

NVIC,即嵌套向量中断控制器,全称Nested vectored interrupt controller。属于内核。

中断优先级

STM32中的中断优先级可以分为:抢占式优先级和响应优先级,响应优先级也称子优先级,每个中断源都需要被指定这两种优先级。

抢占优先级(pre):抢占优先级高的中断可以打断正在执行的抢占优先级低的中断。

响应优先级(sub):抢占优先级相同,响应优先级高的中断不能打断响应优先级低的中断。

当两个或者多个中断的抢占式优先级和响应优先级相同时,那么就遵循自然优先级,此时需要看中断向量表的中断排序,数值越小,优先级越高。

#备注:自然优先级,也就是中断向量表的优先级。

NVIC相关函数(常用)

1、HAL_NVIC_SetPriorityGrouping()

void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup);

函数描述

该函数用于设置中断优先级分组。

函数形参

形参 1 (uint32_t PriorityGroup)是中断优先级分组号,可以选择NVIC_PRIORITYGROUP_0 到 NVIC_PRIORITYGROUP_4(共 5 组)。

函数返回值

无。

2、HAL_NVIC_SetPriority函数

void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority,

                                                                                                               uint32_t  SubPriority);

函数描述

该函数用于设置中断的抢占优先级和响应优先级(子优先级)。

函数形参

形参 1 (IRQn_Type IRQn)是中断号,可以选择IRQn_Type 定义的枚举类型,定义在 stm32f407xx.h中。

形参 2 (uint32_t PreemptPriority)是抢占优先级,可选0~15。

形参 3 (uint32_t  SubPriority)是响应优先级,可选0~15。

函数返回值

无。

3. HAL_NVIC_EnableIRQ 函数

void HAL_NVIC_EnableIRQ(IRQn_Type IRQn);

函数描述

该函数用于使能中断。

函数形参

形参 1 (IRQn_Type IRQn)是中断号,可以选择IRQn_Type 定义的枚举类型,定义在 stm32f407xx.h中。

函数返回值

无。

4. HAL_NVIC_DisableIRQ 函数

void HAL_NVIC_DisableIRQ(IRQn_Type IRQn);

函数描述

该函数用于中断除能。

函数形参

无。

函数返回值

无。

5. HAL_NVIC_SystemReset 函数

void HAL_NVIC_SystemReset(void);

函数描述

该函数用于软件复位系统。

函数形参

无。

函数返回值

无。

三、EXTI

EXTI基本概念

EXTI即是外部(扩展)中断和事件控制器,全称External(Extended) interrupt/event Controller。

中断和事件的理解

中断:要进入NVIC,有相应的中断服务函数。需要CPU处理。

事件:不进入NVIC,仅用于内部硬件自动控制,如TIM、DMA、ADC。

EXTI功能框图

若EXTI产生中断,信号最终进入NVIC控制器。

若EXTI产生事件,信号不进入NVIC。

1、EXTI中断信号产生和传递过程

输入线是线路的信息输入端,它可以通过配置寄存器设置为任何一个GPIO口,或者是一些外设的事件。输入线一般都是存在电平变化的信号。

标号①,包括边沿检测电路,上升沿触发选择寄存器(EXTI_RTSR)和下降沿触发选择寄存器(EXTI_FTSR)。边沿检测电路以输入线作为信号输入端,如果检测到有边沿跳变就输出有效信号‘1’到标号②部分电路,否则输入无效信号‘0’。边沿跳变的标准在于开始的时候对于上升沿触发选择寄存器或下降沿触发选择寄存器对应位的设置。

标号是一个或门电路,它的两个信号输入端分别是软件中断事件寄存器(EXTI_SWIER)和边沿检测电路的输入信号。或门电路只要输入端有信号‘1’,就会输出‘1’,所以就会输出‘1’到标号③电路和标号④电路。通过对软件中断事件寄存器的读写操作就可以启动中断/事件线,即相当于输出有效信号‘1’到或门电路输入端。

标号是一个与门电路,它的两个信号输入端分别是中断屏蔽寄存器(EXTI_IMR)和标号②电路输出信号。与门电路要求输入都为‘1’才输出‘1’,因此,如果中断屏蔽寄存器(EXTI_IMR)设置为0时,不管从标号②电路输出的信号特性如何,最终标号③电路输出的信号都是0;假如中断屏蔽寄存器(EXTI_IMR)设置为1时,最终标号③电路输出的信号才由标号②电路输出信号决定,这样就可以简单控制EXTI_IMR来实现中断的目的。标号②电路输出‘1’就会把请求挂起寄存器(EXTI_PR)对应位置1。

最后,请求挂起寄存器(EXTI_PR)的内容就输出到NVIC内,实现系统中断事件的控制。

2、EXTI事件产生和传递过程

事件线路是从标号②之后与中断线路有所不用的,之前的线路都是共用的。

标号是一个与门,输入端来自标号②电路以及来自于事件屏蔽寄存器(EXTI_EMR)。如果EXTI_EMR寄存器设置为0,那不管标号②电路输出的信号是‘0’还是‘1’,最终标号④输出的都是‘0’;如果EXTI_EMR寄存器设置为1,最终标号④电路输出信号就由标号②电路输出的信号决定,这样子就可以简单的通过控制EXTI_EMR寄存器来达到是否产生事件的目的。

标号④电路输出有效信号1就会使脉冲发生器电路产生一个脉冲,而无效信号就不会使其产生脉冲信号。脉冲信号产生可以给其他外设电路使用,例如定时器,模拟数字转换器等,这样的脉冲信号一般用来触发TIM或者ADC开始转换。

3、中断线路和事件线路的不同

如前文所述,EXTI产生中断,信号最终进入NVIC控制器。EXTI产生事件,信号不进入NVIC。

中断线路的目的使把输入信号输入到NVIC,进一步运行中断服务函数,实现功能。而事件线路目的是传输一个脉冲信号给其他外设使用,属于硬件级功能。

4、STM32F407的EXTI

EXTI支持23个外部中断/事件请求,这些都是信息输入端,也就是上面提及到了输入线,具体如下:

EXTI线0~15:对应外部IO口的输入中断;

EXTI线16:连接到PVD输出; 

EXTI线17:连接到RTC闹钟事件; 

EXTI线18:连接到USB唤醒事件; 

EXTI线19:连接到以太网唤醒事件; 

EXTI线20:连接到USB OTG HS(在FS中配置)唤醒事件; 

EXTI线21:连接到RTC入侵和时间戳事件;

EXTI线22:连接到RTC唤醒事件;

从上面可以看出,STM32F407供给IO口使用的中断线只有16个,但是STM32F407的IO口却远远不止16个,所以STM32把GPIO管脚GPIOx.0~GPIOx.15(x=A,B,C,D,E,F,G)分别对应中断线0~15。这样子每个中断线对应了最多7个IO口,以线0为例:它对应了GPIOA0、GPIOB0、GPIOC0、GPIOD0、GPIOE0、GPIOF0和GPIOG0。而中断线每次只能连接到1个IO口上,这样就需要通过配置(SYSCFG_EXTICR寄存器)决定对应的中断线配置到哪个GPIO上了。

四、如何使用中断?

1、总体概述

2、EXTI的HAL库设置步骤

3、EXTI的配置步骤

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值