中断(NVIC和EXTI、中断优先级基本概念及分组、中断配置步骤API及相关寄存器、AFIO或SYSCFG、EXTI和IO映射、EXTI的配置步骤、HAL库中断回调处理机制)

您所在的位置:网站首页 i7寄存器 中断(NVIC和EXTI、中断优先级基本概念及分组、中断配置步骤API及相关寄存器、AFIO或SYSCFG、EXTI和IO映射、EXTI的配置步骤、HAL库中断回调处理机制)

中断(NVIC和EXTI、中断优先级基本概念及分组、中断配置步骤API及相关寄存器、AFIO或SYSCFG、EXTI和IO映射、EXTI的配置步骤、HAL库中断回调处理机制)

2024-07-09 22:45| 来源: 网络整理| 查看: 265

参考

http://t.csdnimg.cn/Hd7TZ

一、什么是中断?

在这里插入图片描述 在这里插入图片描述 中断是一种计算机体系结构中的机制,它打断了CPU正在执行的正常程序流程,使其临时转而处理紧急或优先级较高的程序,处理完成后再返回到原先暂停的程序,实现了对事件的及时响应。中断主要用于处理异步事件,例如外部设备的输入、时钟信号等。

中断的基本工作流程如下:

1.中断发生: 由于某个事件的发生,例如外部设备的输入、定时器计数溢出等,引发了中断请求。 2.CPU响应: 当中断请求发生时,CPU会在适当的时机检测到中断请求并作出响应,暂停当前正在执行的指令流程。 3.中断处理程序执行: CPU跳转到与中断相关联的中断处理程序,执行与中断相关的操作。 4.中断处理: 中断处理程序完成相应的任务,可能涉及对寄存器、内存等状态的保存和恢复,处理完后准备返回。 5.恢复执行: 处理完成后,CPU将返回到被中断的程序,继续执行原先暂停的指令流程。

中断机制使计算机能够及时响应外部事件,提高了系统的实时性和处理能力。

中断的作用和意义

在这里插入图片描述 中断在计算机系统中具有重要的作用和意义,主要体现在以下几个方面:

1.实时控制: 中断允许系统在确定的时间内对特定事件作出及时响应,这对于实时控制系统非常关键。例如,在温度监控系统中,如果温度超过设定阈值,中断可以立即触发相应的处理程序,采取必要的措施以防止系统过热。

2.故障处理: 中断机制允许系统检测到故障并迅速作出响应。在电梯门夹人的情况下,中断可以立即中止正常操作并启动紧急停止程序,以确保乘客的安全。

3.数据传输: 对于异步事件,如数据传输,中断可以在数据到达时通知系统,并立即处理接收到的数据。在串口数据接收的例子中,中断可以用来触发数据接收处理程序,确保及时处理接收到的数据而不需要系统持续轮询。

4.高效处理紧急程序: 中断允许处理紧急程序而不需要等待当前任务的完成。这提高了系统的效率,因为CPU可以在需要时立即切换到处理中断的任务,而不必等待当前任务的结束。

5.不占用CPU资源: 中断允许系统在等待事件发生的同时执行其他任务,而不会一直占用CPU资源。系统可以在需要时响应中断,而在没有中断时执行其他任务,提高了系统的并发性和效率。

综上所述,中断在实时响应、故障处理、异步数据传输等方面发挥着重要作用,使计算机系统更加灵活、高效、可靠。

STM32 GPIO外部中断简图

在这里插入图片描述 外部中断的配置和处理,以下是每个步骤的简要解释:

1.外部信号: 通常来自于外部世界的信号,例如传感器的状态变化、按键的按下等。

2.GPIO(通用输入输出): 外部信号被连接到单片机的GPIO引脚上。在这里,你提到了上拉输入、下拉输入和浮空输入,这是指对GPIO引脚进行不同的配置,以适应不同的电路连接方式。

3.AFIO(Alternate Function I/O)或 SYSCFG(System Configuration): 这是针对不同系列的STM32微控制器的不同名称。这一步的目的是将GPIO引脚映射到外部中断线 EXTI 上。

4.EXTI(外部中断): EXTI 模块允许你配置外部中断线,以便在输入信号发生变化时生成中断。你可以设置上升沿触发、下降沿触发等条件。

5.NVIC(嵌套向量中断控制器): NVIC 是用于配置和控制中断的模块。在这一步,你启用了外部中断,并设置了相应的中断优先级。

6.CPU(中央处理单元): 当外部中断条件满足时,中断被触发,CPU会暂停当前执行的程序,转而执行与中断相关的处理程序。这可能包括保存当前状态、执行中断服务程序,然后在处理完成后恢复原始状态。

总的来说,这个流程描述了外部信号如何通过GPIO、AFIO/SYSCFG、EXTI、NVIC等模块被引导到CPU中进行处理。这种机制使得嵌入式系统能够对外部事件进行实时响应,是许多嵌入式应用中常见的配置和处理流程。

二、NVIC

在这里插入图片描述

2.1、NVIC基本概念

在这里插入图片描述

什么是中断向量表?

在这里插入图片描述 中断向量表(Interrupt Vector Table,简称IVT)是嵌入式系统中一块用于存储中断服务函数地址的固定内存区域。它通常是在系统启动时被定义和初始化的,以确保当发生中断时,CPU可以迅速找到并执行相应的中断服务函数。

以下是关于中断向量表的一些要点: 1.内存中的位置: 中断向量表通常被放置在内存的固定位置,并且其地址需要按照一定的规则对齐。在许多嵌入式系统中,IVT的起始地址是0x00000000,每个中断的入口地址都以4字节对齐排列。

2.存储中断服务函数地址: 中断向量表的主要目的是存储每个中断对应的中断服务函数的首地址。每个中断都有一个唯一的位置(向量),其地址保存在中断向量表中。当相应的中断被触发时,CPU会从中断向量表中获取对应中断的地址,并跳转到该地址执行中断服务函数。

3.启动文件和初始化: 中断向量表的定义和初始化通常是由系统的启动文件(startup file)负责的。在启动过程中,这个文件会设置中断向量表的内容,将每个中断的服务函数地址写入到相应的位置。

4.自动执行中断服务函数: 当中断发生时,CPU会自动根据中断向量表中的地址跳转到相应的中断服务函数,开始执行中断处理。这种自动执行的机制使得系统能够及时响应中断事件。

总体而言,中断向量表是一种组织和存储中断服务函数地址的结构,它在嵌入式系统中是确保中断处理高效、准确的关键组成部分。

2.2、NVIC相关寄存器介绍

在这里插入图片描述 NVIC(Nested Vectored Interrupt Controller,嵌套向量中断控制器)是一种用于管理中断的硬件模块,常见于ARM Cortex-M微控制器架构中。以下是与 NVIC 相关的一些寄存器:

1.中断使能寄存器(ISER): 位数:32 寄存器个数:8 备注:每个位对应一个中断,用于启用相应中断。当某一位被设置为1时,表示相应的中断被使能。

2.中断除能寄存器(ICER): 位数:32 寄存器个数:8 备注:每个位对应一个中断,用于禁用相应中断。当某一位被设置为1时,表示相应的中断被禁用。

3.应用程序中断及复位控制寄存器(AIRCR): 位数:32 寄存器个数:1 备注:AIRCR 寄存器中的位[10:8]用于控制优先级分组,即确定中断优先级的位数。不同的 ARM Cortex-M 架构可能支持不同的分组方式。

4.中断优先级寄存器(IPR): 位数:8 寄存器个数:240 备注:每个中断有一个对应的 8 位寄存器,但在实际应用中,STM32 只使用了高 4 位。这些位用于设置中断的优先级,其中数值越小,优先级越高。

这些寄存器一起协作,允许程序员配置中断的优先级、使能或禁用中断,并对中断进行管理。通过这些寄存器,开发人员可以有效地控制系统对中断的响应,确保对重要事件的及时处理。

2.3、NVIC工作原理

在这里插入图片描述 嵌套向量中断控制器(NVIC)是一种用于管理中断的硬件模块,主要用于 ARM Cortex-M 架构的微控制器。以下是 NVIC 的基本工作原理:

1.中断向量表(Interrupt Vector Table,IVT): 在系统启动时,中断向量表被初始化并加载到内存的固定位置。IVT 存储了每个中断的入口地址,即中断服务函数的地址。

2.中断触发: 当某个外部事件触发了一个中断条件,例如按键被按下、定时器溢出等,相应的中断请求信号被发送到 NVIC。

3.中断请求处理: NVIC 接收到中断请求后,首先检查中断控制寄存器(Interrupt Control Register,ICR)。ICR 存储了当前正在处理的中断以及相关的信息。

4.中断优先级判断: NVIC 根据中断优先级判断是否需要中断嵌套。如果当前没有处理其他中断,或者新中断的优先级高于当前正在处理的中断,那么 NVIC 将接受新中断。

5.中断嵌套处理: 如果中断允许嵌套(Nested Interrupts),NVIC 将保存当前中断的状态,并跳转到相应的中断服务函数。在服务函数执行期间,如果发生了更高优先级的中断,系统可以中断当前服务函数,处理更高优先级的中断。

6.中断服务函数执行: 中断服务函数是用户编写的代码,用于处理特定的中断事件。在服务函数执行完毕后,控制返回到 NVIC。

7.中断结束和状态恢复: NVIC 根据中断处理结束后的状态信息,可能会恢复之前被保存的状态(如果发生了嵌套中断),然后继续执行先前中断被中断的地方。

8.中断清除: 在中断服务函数执行完成后,如果不再需要处理相同的中断,需要清除相应的中断标志。这通常涉及到特定的寄存器或标志位的操作。

总体来说,NVIC 负责协调中断的优先级、中断服务函数的调用和中断嵌套的处理,确保系统对多个中断事件的有效管理和响应。这种嵌套中断的机制允许系统在处理一个中断时能够及时响应更高优先级的中断,提高了系统的实时性。

2.4、STM32中断优先级基本概念

在这里插入图片描述 中断优先级是指在一个系统中,不同中断之间的执行顺序和竞争关系。在许多嵌入式系统中,中断优先级通常包括抢占优先级(Preemption Priority)和响应优先级(Subpriority)。以下是中断优先级的基本概念:

1.抢占优先级(Preemption Priority,pre): 抢占优先级决定了中断在发生时是否可以打断正在执行的其他中断或任务。高抢占优先级的中断可以打断低抢占优先级的中断。在同一抢占优先级下,响应优先级决定执行的顺序。

2.响应优先级(Subpriority,sub): 当两个中断具有相同的抢占优先级时,响应优先级用于决定哪个中断先执行。高响应优先级的中断先执行,但它们不会相互打断。在同一响应优先级下,自然优先级决定执行的顺序。

3.自然优先级: 自然优先级是中断向量表中每个中断对应的优先级。在没有特别设置抢占和响应优先级的情况下,自然优先级越高的中断会先执行。

4.数值越小表示优先级越高: 中断优先级通常使用一个数值表示,数值越小表示优先级越高。例如,在STM32中,优先级值为0表示最高优先级,而值越大表示优先级越低。

总的来说,中断优先级的设置和管理是为了确保系统能够在多个中断事件发生时有序执行,并根据任务的紧急程度和系统需求进行灵活配置。这有助于提高系统的实时性和响应能力。

2.5、STM32中断优先级分组

在这里插入图片描述 在 ARM Cortex-M 架构的微控制器中,中断优先级分组是通过 AIRCR 寄存器的[10:8]位来配置的。这个配置决定了中断向量表中每个中断的抢占优先级和响应优先级的分配方式。下面是各个优先级分组的配置及其分配结果:

1.优先级分组 0: AIRCR[10:8] = 111 IPRx bit[7:4]分配:None(即[7:4]都用于抢占优先级) 分配结果:0位用于抢占优先级,4位用于响应优先级

2.优先级分组 1: AIRCR[10:8] = 110 IPRx bit[7]分配:[6:4](1位用于响应优先级,其余用于抢占优先级) 分配结果:1位用于抢占优先级,3位用于响应优先级

3.优先级分组 2: AIRCR[10:8] = 101 IPRx bit[7:6]分配:[5:4](2位用于响应优先级,其余用于抢占优先级) 分配结果:2位用于抢占优先级,2位用于响应优先级

4.优先级分组 3: AIRCR[10:8] = 100 IPRx bit[7:5]分配:[4](3位用于响应优先级,其余用于抢占优先级) 分配结果:3位用于抢占优先级,1位用于响应优先级

5.优先级分组 4: AIRCR[10:8] = 011 IPRx bit[7:4]分配:None(即[7:4]都用于抢占优先级) 分配结果:4位用于抢占优先级,0位用于响应优先级

这些优先级分组的设置允许开发者根据系统需求和中断的重要性进行灵活的配置,确保中断系统能够满足特定应用场景的实时性和响应性。

STM32中断优先级举例(假设分组是2)

在这里插入图片描述

2.6、STM32 NVIC的使用

在这里插入图片描述 NVIC(嵌套向量中断控制器)的使用通常包括设置中断分组、设置中断优先级和使能中断这几个步骤。在一些嵌入式系统中,特别是使用 HAL(Hardware Abstraction Layer)库的系统中,相关的函数通常被提供以简化这些操作。

以下是使用 NVIC 的一般步骤:

1.设置中断分组(Set Interrupt Priority Grouping):

使用 HAL_NVIC_SetPriorityGrouping 函数或直接设置 AIRCR[10:8] 寄存器来配置中断分组。这确定了抢占优先级和响应优先级的分配方式。 示例:

HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_X); 2.设置中断优先级(Set Interrupt Priority):

使用 HAL_NVIC_SetPriority 函数或直接设置 IPRx bit[7:4] 寄存器来设置中断的抢占优先级和响应优先级。 示例:

HAL_NVIC_SetPriority(IRQn, PreemptionPriority, SubPriority); 3.使能中断(Enable Interrupt):

使用 HAL_NVIC_EnableIRQ 函数或直接设置 ISERx 寄存器来使能特定的中断。 示例:

HAL_NVIC_EnableIRQ(IRQn);

在上述示例中,IRQn 是中断号,PreemptionPriority 和 SubPriority 是抢占优先级和响应优先级的数值。NVIC_PRIORITYGROUP_X 是中断分组的配置选项,可以是 0、1、2、3 或 4,分别对应不同的中断分组方式。

这些函数提供了对 NVIC 寄存器的封装,使得中断的配置和管理更加方便。使用 HAL 库的优势在于它提供了对底层硬件的抽象,简化了硬件相关的操作,使代码更具可移植性。在没有 HAL 的情况下,直接对寄存器进行配置也是一种常见的做法,尤其在对资源更加精细掌控的应用中。

中断相关寄存器

这些寄存器与中断控制和管理相关,属于 ARM Cortex-M 架构的 NVIC 模块。以下是对这些寄存器的简要介绍: 1.SCB_AIRCR(Application Interrupt and Reset Control Register): 作用:控制中断优先级分组。 位域: [10:8]:PRIGROUP,用于设置中断优先级分组。 示例:

SCB->AIRCR = (SCB->AIRCR & ~SCB_AIRCR_VECTKEY_Msk) | SCB_AIRCR_VECTKEY | SCB_AIRCR_PRIGROUP_X;

2.NVIC_IPRx(Interrupt Priority Registers): 作用:存储中断的抢占优先级和响应优先级。 位域: [7:4]:抢占优先级(Preemption Priority)。 [3:0]:响应优先级(Subpriority)。 示例:

NVIC->IP[IRQn] = (PreemptionPriority


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3