中断概念--EXTI--NVIC
1.概念
为什么引入中断?
中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的,中断功能的存在,很大程度上提高了单片机处理外部或内部事件的能力。
中断系统特点
①分时操作。CPU 可以分时为多个 I/O 设备服务,提高了计算机的利用率;
②实时响应。CPU 能够及时处理应用系统的随机事件,系统的实时性大大增强;
③可靠性高。CPU 具有处理设备故障及掉电等突发性事件能力,从而使系统可靠性提高
中断过程
对于单片机来讲,中断是指CPU在处理某一时间A时,发生了另一事件B请求CPU立刻去处理(中断发生或中断请求);CPU暂时停止当前的工作(中断响应),转而去处理事件B(中断服务),待CPU处理事件B完成后,再回到原来事件A被中断的地方继续处理事件A(中断返回)。这一过程称为中断,注意是整个过程,而不是单一的停止一件事的意思。# 中断和异常!!!
STM32F103 在内核水平上搭载了一个异常响应系统, 支持为数众多的系统异常和外部中断。
其中系统异常有 8 个(如果把 Reset 和 HardFault 也算上的话就是 10 个),外部中断有 60个。除了个别异常的优先级被定死外,其它异常的优先级都是可编程的。有关具体的系统异常和外部中断可在标准库文件 stm32f10x.h 这个头文件查询到,在 IRQn_Type 这个结构体里面包含了 F103 系列全部的异常声明。
我们以STM32为例来讲解中断,提到中断就不得不提到EXTI和NVIC了,前者是单片机的一个外设,而NVIC一般是在内核中。
2.NVIC—嵌套向量中断控制器
NVIC 中文名字嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。但是各个芯片厂商在设计芯片的时候会对 Cortex-M3 内核里面的 NVIC 进行裁剪,把不需要的部分去掉,所以说 STM32 的 NVIC 是 Cortex-M3 内核的 NVIC 的一个子集。
一般在芯片手册中会给出芯片的中断向量表。
以下是关于NVIC的几个概念。
1.中断优先级
NVIC允许为不同的中断设置优先级。优先级决定了中断的相对顺序,当多个中断同时发生时,具有较高优先级的中断将先被处理。NVIC通常支持多级优先级,可以进一步细化中断的优先级设置。
在 NVIC 有一个专门的寄存器:中断优先级寄存器 NVIC_IPRx,用来配置外部中断的优先级,IPR 宽度为 8bit,原则上每个外部中断可配置的优先级为 0~255,数值越小,优先级越高。但是绝大多数 CM3 芯片都会精简设计,以致实际上支持的优先级数减少,在F103 中,只使用了高 4bit,如下所示

用于表达优先级的这 4bit,又被分组成抢占优先级和子优先级。如果有多个中断同时响应,抢占优先级高的就会 抢占 抢占优先级低的优先得到执行,如果抢占优先级相同,就比较子优先级。如果抢占优先级和子优先级都相同的话,就比较他们的硬件中断编号,编号越小,优先级越高。
优先级分组
优先级分组真值表:

2.中断向量表
中断向量表是一个存储中断处理程序地址的表格。NVIC负责管理中断向量表,并在中断发生时根据中断号找到相应的中断处理程序地址。每个中断在中断向量表中占据一个位置,该位置存储了相应中断处理程序的地址。
下图是STM32F103产品的中断向量表





3.中断嵌套
NVIC支持中断嵌套功能,即当一个中断正在处理时,如果更高优先级的中断请求发生,处理器可以中断当前中断的处理,转而处理更高优先级的中断。这种中断嵌套机制允许处理多个并发的中断事件,并确保较高优先级的中断得到及时处理。
4.中断处理程序
中断处理程序是与特定中断相关联的代码块。当中断请求被响应时,NVIC会跳转到相应中断处理程序的地址,执行其中断处理代码。中断处理程序负责处理中断事件,并在处理完毕后返回到原来的执行点。
3.EXTI—外部中断/事件控制器
EXTI(External interrupt/event controller)—外部中断/事件控制器,管理了控制器的 20个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI 可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性
中断控制器和外设的配合:STM32微控制器的外设通常具有自己的中断控制器和中断请求。外设通过中断请求线将外设通过中断请求线将中断信号发送给中断控制器。中断控制器负责接收和处理外设的中断请求,并将其映射到相应的中断向量表中的中断号。处理器通过NVIC与中断控制器协作,根据中断号找到对应的中断处理程序,并执行相应的操作。
1.EXTI的功能框图

2.外部中断线选择
EXTI 有 20 个中断/事件线,每个 GPIO 都可以被设置为输入线,占用 EXTI0 至
EXTI15,还有另外七根用于特定的外设事件

EXTI0 至 EXTI15 用于 GPIO,通过编程控制可以实现任意一个 GPIO 作为 EXTI 的输入源
中断线的选择如图:

我们使用EXTI时要用到GPIO的复用功能,开启时钟时不要忘了
3.EXTI的寄存器
中断屏蔽寄存器(EXTI_IMR)

事件屏蔽寄存器(EXTI_EMR)

上升沿触发选择寄存器(EXTI_RTSR)

下降沿触发选择寄存器(EXTI_FTSR)

软件中断事件寄存器(EXTI_SWIER)

挂起寄存器(EXTI_PR)

4. 中断回调函数实现
在启动文件 startup_stm32f10x_hd.s 中我们预先为每个中断都写了一个中断服务函数,只是这些中断函数都是为空,为的只是初始化中断向量表。实际的中断服务函数都需要我们重新编写,为了方便管理我们把中断服务函数统一写在 stm32f10x_it.c 这个库文件中。
当发生中断时,系统自动执行中断处理函数。
void KEY1_IRQHandler(void)
{
//判断是否发生中断
if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET)
{
//发生中断,进行操作
LED1_TOGGLE;
//清除中断标志位
EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);
}
}
库函数详解
获取中断状态
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);//获取状态标志
返回中断状态 参数中断线 你要获得那条中断线的状态
void EXTI_ClearFlag(uint32_t
2417




被折叠的 条评论
为什么被折叠?



