目录
中断
中断作用与意义
NVIC
中断向量表
基本概念
功能和作用
NVIC工作原理
STM32中断优先级
1. 优先级分组
2. 优先级设置
3. 中断服务程序执行顺序
4. 配置方法
STM32 NVIC的使用
1,设置中断分组
2,设置中断优先级
3,使能中断
4. 编写中断服务函数
5. 禁用中断
今天我们来讲中断和NVIC
中断
打断CPU执行正常的程序,转而处理紧急程序,然后返回原暂停的程序继续运行
中断作用与意义
- 提高效率和实时性:中断机制使得处理器无需持续轮询(即不断检查)外部设备状态,而是当设备准备好数据或需要服务时,通过中断请求告知CPU。这样,CPU可以在执行其他任务的同时等待事件发生,大大减少了等待时间,提高了系统整体的效率和对外部事件的响应速度,这对于实时系统尤为重要。
- 任务切换与多任务处理:在多任务操作系统中,中断是实现任务切换的关键机制。例如,时钟中断被用来触发时间片轮转,使得操作系统能够在不同任务间公平分配处理器时间,实现多任务并发执行。中断还可以用于响应紧急任务,中断当前任务,处理更高优先级的任务,然后恢复原任务的执行。
- 异常和错误处理:软件中断用于报告程序运行时的异常情况,如除零错误、非法内存访问等,允许系统执行特定的错误处理代码,而不至于导致整个程序崩溃。这是系统稳定性的重要保障。
- 硬件交互:硬件中断允许外部设备与处理器通信,例如键盘按键按下、网络数据到达、磁盘读写完成等事件,都能通过中断机制通知CPU,进而进行相应的处理,实现了硬件与软件的无缝对接。
- 资源管理:中断可以用来管理共享资源,如DMA传输完成、内存管理中的页错误等,通过中断通知CPU进行资源的重新分配或错误处理,优化系统资源的使用。
- 简化编程模型:软件中断通过系统调用机制,为应用程序提供了与操作系统交互的接口,使得开发者无需了解底层硬件细节,就能方便地使用操作系统提供的服务,如文件操作、进程通信等,极大简化了编程复杂度。
NVIC
NVIC,全称为 Nested Vectored Interrupt Controller(嵌套向量中断控制器),是 ARM Cortex-M 系列处理器中的一个关键组件,负责管理系统中的中断处理
嵌套能力
嵌套是NVIC的一个重要特性。它允许处理器基于中断的优先级来决定是否中断当前正在执行的中断服务例程(ISR)去处理更高优先级的中断。这意味着,如果有更高优先级的中断发生,当前较低优先级的中断会被挂起,待高优先级中断处理完毕后再恢复执行。
向量中断
NVIC使用向量中断机制,每个中断或异常都有一个唯一的向量号,对应内存中的一个向量表项。这个表项存储了中断服务例程(ISR)的入口地址。当一个中断发生时,NVIC会立即获取向量表中的地址并跳转到相应的ISR执行,无需软件判断中断来源。
优先级管理
NVIC支持灵活的优先级配置,允许用户根据应用需求对中断进行优先级分组。优先级分组可以将优先级分为抢占优先级和子优先级,从而实现更精细的中断控制策略。优先级的高低决定了中断的响应顺序和是否能中断其他中断。
中断使能与屏蔽
每个中断都可以独立地被软件使能或屏蔽。通过NVIC的控制寄存器,可以开启或关闭特定中断源,也可以通过全局中断屏蔽寄存器(如PRIMASK)来暂时禁止所有可屏蔽中断,仅允许不可屏蔽中断(如硬件故障)的响应。
中断挂起与解挂
在处理中断时,NVIC能够挂起(暂停)当前中断,以便处理更紧急的中断。一旦高优先级中断处理完成,被挂起的中断会被解挂并继续执行。
中断状态和控制寄存器
NVIC有一系列的寄存器,用于控制中断的使能、挂起状态、优先级以及处理状态。这些寄存器是内存映射的,可以通过指针直接访问,方便编程控制。
系统异常处理
除了外部中断,NVIC还负责处理系统异常,如复位、未定义指令、总线错误、内存管理错误、用法错误等。这些异常也拥有自己的向量和优先级,确保系统能够对错误和特殊情况做出响应。
中断服务程序入口
通过NVIC,开发者可以轻松设置中断服务程序的入口点,使得中断处理逻辑清晰且易于维护。
中断处理流程
- 中断请求:外设或软件发出中断请求。
- 优先级判断:NVIC判断是否有更高优先级中断正在处理,如果没有,则响应中断。
- 保存上下文:CPU自动或手动保存当前任务的上下文。
- 跳转至ISR:根据向量表跳转到中断服务例程。
- 中断处理:执行中断处理逻辑。
- 恢复上下文:中断服务结束,恢复上下文,返回原任务。
- 虚拟中断线:允许多个外设共享同一条中断线,通过软件进一步区分具体是哪个外设产生的中断,提高了中断资源的利用率。
中断向量表
中断向量表是系统中用于管理中断处理流程的一个重要数据结构,它存储了所有中断或异常服务例程(ISR)的入口地址。中断向量表的设计目的是为了使处理器能够快速定位并执行相应的中断处理程序,以响应外部设备或内部事件的请求。
定义一块固定的内存,以4字节对齐,存放各个中断服务函数程序的首地址
中断向量表定义在启动文件,当发生中断,CPU会自动执行对应的中断服务函数
基本概念
- 中断向量:每个中断或异常在中断向量表中都有一个对应的条目,这个条目被称为中断向量。它本质上是一个内存地址,指向了中断服务例程的起始指令。
- 向量表地址:处理器在复位后会从一个预定义的地址开始执行,这个地址通常是中断向量表的起始位置。在某些系统中,中断向量表的位置可以通过特定寄存器(例如ARM Cortex-M系列的VTOR寄存器)动态配置。
功能和作用
- 快速响应:当一个中断发生时,处理器不需要遍历复杂的查找表,而是直接根据中断类型号从向量表中取出中断服务程序的入口地址,迅速跳转执行,减少了中断延迟。
- 中断服务程序入口:中断向量表中的每个条目都对应一个中断或异常的处理程序,使得系统能够精确地识别并处理不同类型的中断事件。
- 优先级管理:虽然优先级本身不直接存储在中断向量表中,但中断向量表的组织方式和中断处理流程与系统中断优先级管理紧密相关。某些高级架构的中断控制器(如NVIC)会根据中断向量表中的顺序和配置来决定中断的优先级和嵌套规则。
- 初始化与配置:在系统启动阶段,操作系统或引导加载程序会初始化中断向量表,设置每个中断向量指向正确的中断服务例程。
- 重定位:在一些系统中,特别是支持动态加载程序或固件升级的系统,中断向量表可以在运行时被重新定位到不同的内存地址,以适应程序代码或数据段的变动。
实现细节
- 硬件支持:处理器硬件包含逻辑来自动读取中断向量表并执行中断服务例程。这通常涉及到硬件自动加载程序计数器(PC)来跳转到中断服务例程的入口点。
- 软件配置:软件层面上,开发人员需要为每个中断或异常编写相应的服务例程,并在中断向量表中正确设置这些服务例程的地址。在一些现代的开发环境中,如使用STM32CubeMX或Keil等工具,这些配置可以通过图形界面完成。
- 中断处理流程:中断发生时,处理器首先保存当前状态(如寄存器值),然后根据中断类型从向量表获取ISR地址,执行ISR,处理完中断后恢复现场,最后返回到中断前的执行点。
NVIC工作原理
1. 中断请求与检测
- 中断源:外部设备或内部事件通过中断线向NVIC发送中断请求。
- 优先级评估:NVIC接收到中断请求后,首先根据中断源的优先级进行评估。优先级高的中断可以打断正在处理的低优先级中断,这就是所谓的中断嵌套。
2. 中断响应
- 保存上下文:当一个中断被接受处理时,处理器硬件自动保存当前执行状态的一部分到堆栈,包括程序状态寄存器(PSR)、通用寄存器(如R0-R3, R12)等,以保证中断处理结束后能恢复到中断前的状态。
- 跳转向量:NVIC根据中断的类型号(中断向量号)从中断向量表中取出中断服务例程(ISR)的入口地址,然后将程序计数器(PC)设置为此地址,从而跳转到ISR执行。
3. 中断处理
- 执行ISR:处理器开始执行ISR,处理中断事件。
- 中断清除:ISR中通常需要包含清除中断标志的操作,以防止中断服务完成后再次无谓地进入同一ISR。
4. 中断返回
- 恢复上下文:ISR执行完毕后,处理器恢复之前保存的上下文,包括恢复寄存器值和程序状态。
- 中断嵌套处理:如果在处理当前中断期间有更高优先级的中断发生,处理器会在当前ISR中止后直接响应并处理更高优先级的中断,之后再逐级返回到最初中断的地方继续执行。
5. 优先级管理
- 优先级分组:NVIC允许优先级分组,即将优先级分为抢占优先级和响应优先级,这样可以更细粒度地控制中断的嵌套和响应顺序。
- 动态优先级调整:在某些应用中,NVIC还支持动态更改中断源的优先级,这为实时系统提供了更高的灵活性。
6. 中断控制与配置
- 使能与失能:NVIC允许通过特定的寄存器来单独使能或失能每个中断源。
- 中断挂起与解挂:可以挂起某个中断,使其暂时不响应,直到被显式地解挂。
- 中断屏蔽:可以临时屏蔽所有中断或特定中断,以保护关键代码段不受中断干扰。
STM32中断优先级
1. 优先级分组
STM32允许用户通过编程NVIC的优先级分组寄存器来设置优先级分组。优先级分为抢占优先级(Preemption Priority)和响应优先级(Subpriority 或称副优先级)。分组的目的在于决定中断优先级管理的粒度。STM32一般支持4种或更多优先级分组模式,具体取决于具体的STM32系列和型号。例如,在某些STM32系列中,可以设置以下分组模式:
- 分组0:所有中断只有抢占优先级,没有响应优先级。
- 分组1-3:部分位用于抢占优先级,剩余位用于响应优先级,分组越高,用于响应优先级的位数越多。
2. 优先级设置
- 抢占优先级:决定中断能否打断另一个中断的处理。具有较高抢占优先级的中断可以打断正在执行的较低抢占优先级中断。
- 响应优先级:当多个中断同时到达或者具有相同的抢占优先级时,响应优先级较高的中断将优先得到服务。
- 抢占和响应都相同的情况下,自然优先级越高的,先执行
- 自然优先级:中断向量表的优先级
- 数值越小,表示优先级越高
特别提示:一个工程中,一般只设置一次中断优先级分组
3. 中断服务程序执行顺序
- 如果一个中断的抢占优先级高于当前正在执行的中断,那么新中断会立即打断当前中断,执行新的中断服务程序。
- 若抢占优先级相同,则比较响应优先级,响应优先级高的中断先被服务。
- 如果抢占优先级和响应优先级都相同,根据中断的自然优先级决定,通常由中断向量表的排列顺序决定。
4. 配置方法
- 通过编程NVIC的相关寄存器,如中断使能寄存器(ISER)、中断优先级寄存器(IPRx)等,来设置中断的使能、优先级等属性。
- 在程序中,可以使用CMSIS(Cortex Microcontroller Software Interface Standard)提供的API,如NVIC_Init()函数,来进行中断优先级的配置。
STM32 NVIC的使用
1,设置中断分组
AIRCR[10:8],HAL_NVIC_SetPriorityGrouping
此函数允许您设置抢占优先级和响应优先级的位数分配,决定了中断优先级管理的策略。例如,调用HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2)
将设置分组
2,设置中断优先级
IPRx bit[7:4],HAL_NVIC_SetPriority
该函数接受三个参数:中断编号(如USART1_IRQn
)、抢占优先级和响应优先级。优先级值的范围和含义取决于已设置的优先级分组。
3,使能中断
ISERx,HAL_NVIC_EnableIRQ
使用该
函数来使能特定的中断,以便NVIC可以响应它。这个函数需要中断编号作为参数,如HAL_NVIC_EnableIRQ(USART1_IRQn)
。
4. 编写中断服务函数
尽管中断服务函数(ISR)的声明和定义不直接属于HAL库的一部分,但它们是中断处理不可或缺的。ISRs通常需要在对应的.c文件或汇编文件中定义,并且名称必须与中断向量表中的名称匹配,如void USART1_IRQHandler(void)。在ISR中,应处理中断相关的任务,并清除中断标志。
5. 禁用中断
如果需要临时禁止某个中断,可以使用HAL_NVIC_DisableIRQ()函数,传入相应的中断编号。