STM32HAL(四)中断与NVIC解析

目录

中断

中断作用与意义

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,开发者可以轻松设置中断服务程序的入口点,使得中断处理逻辑清晰且易于维护。

中断处理流程

  1. 中断请求:外设或软件发出中断请求。
  2. 优先级判断:NVIC判断是否有更高优先级中断正在处理,如果没有,则响应中断。
  3. 保存上下文:CPU自动或手动保存当前任务的上下文。
  4. 跳转至ISR:根据向量表跳转到中断服务例程。
  5. 中断处理:执行中断处理逻辑。
  6. 恢复上下文:中断服务结束,恢复上下文,返回原任务。
  7. 虚拟中断线:允许多个外设共享同一条中断线,通过软件进一步区分具体是哪个外设产生的中断,提高了中断资源的利用率。

中断向量表

中断向量表是系统中用于管理中断处理流程的一个重要数据结构,它存储了所有中断或异常服务例程(ISR)的入口地址。中断向量表的设计目的是为了使处理器能够快速定位并执行相应的中断处理程序,以响应外部设备或内部事件的请求。

定义一块固定的内存,以4字节对齐,存放各个中断服务函数程序的首地址

中断向量表定义在启动文件,当发生中断,CPU会自动执行对应的中断服务函数

基本概念

  • 中断向量:每个中断或异常在中断向量表中都有一个对应的条目,这个条目被称为中断向量。它本质上是一个内存地址,指向了中断服务例程的起始指令。
  • 向量表地址:处理器在复位后会从一个预定义的地址开始执行,这个地址通常是中断向量表的起始位置。在某些系统中,中断向量表的位置可以通过特定寄存器(例如ARM Cortex-M系列的VTOR寄存器)动态配置。

功能和作用

  1. 快速响应:当一个中断发生时,处理器不需要遍历复杂的查找表,而是直接根据中断类型号从向量表中取出中断服务程序的入口地址,迅速跳转执行,减少了中断延迟。
  2. 中断服务程序入口:中断向量表中的每个条目都对应一个中断或异常的处理程序,使得系统能够精确地识别并处理不同类型的中断事件。
  3. 优先级管理:虽然优先级本身不直接存储在中断向量表中,但中断向量表的组织方式和中断处理流程与系统中断优先级管理紧密相关。某些高级架构的中断控制器(如NVIC)会根据中断向量表中的顺序和配置来决定中断的优先级和嵌套规则。
  4. 初始化与配置:在系统启动阶段,操作系统或引导加载程序会初始化中断向量表,设置每个中断向量指向正确的中断服务例程。
  5. 重定位:在一些系统中,特别是支持动态加载程序或固件升级的系统,中断向量表可以在运行时被重新定位到不同的内存地址,以适应程序代码或数据段的变动。

实现细节

  • 硬件支持:处理器硬件包含逻辑来自动读取中断向量表并执行中断服务例程。这通常涉及到硬件自动加载程序计数器(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()函数,传入相应的中断编号。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/636788.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue使用driver.js引导并自定义样式和按钮

参考网址https://driverjs.com/docs/installation 安装 npm install driver.js 以下是1.3.1版本的基本使用方法 import { driver } from driver.js import driver.js/dist/driver.css mounted() {// 实例化driver对象const driverObj driver({showProgress: true,steps: …

【mysql】【docker】mysql8-互为主从

🌸🌸 Linux/docker-compose/mysql8 互为主从 优雅部署 🌸🌸 记录下两台Linux的mysql需要热备份,互为主从,后期加上keepalived实现高可用切换 参考博客:答 案 🌸 一、准备文件 这里…

一文了解基于ITIL的运维管理体系框架

本文来自腾讯蓝鲸智云社区用户:CanWay ITIL(Information Technology Infrastructure Library)是全球最广泛使用的 IT 服务管理方法,旨在帮助组织充分利用其技术基础设施和云服务来实现增长和转型。优化IT运维,作为企业…

k8s node NotReady后会发生什么?

K8s 是一种强大的容器编排和管理平台,能够高效地调度、管理和监控容器化应用程序;其本身使用声明式语义管理着集群内所有资源模型、应用程序、存储、网络等多种资源,Node 本身又属于 K8s 计算资源,上面承载运行着各种类型的应用程…

141.字符串:重复的字符串(力扣)

题目描述 代码解决 class Solution { public:// 计算字符串s的next数组&#xff0c;用于KMP算法void getNext(int *next, const string& s){int j 0; // j是前缀的长度next[0] 0; // 初始化next数组&#xff0c;第一个字符的next值为0for (int i 1; i < s.size(); …

TAS5711带EQ和DRC支持2.1声道的20W立体声8V-26V数字输入开环D类数字功放音频放大器

前言 数字功放很难搞&#xff0c;寄存器很多&#xff0c;要配置正确才有声音&#xff0c;要想声音好&#xff0c;要好好调整。 TAS5711出道很多年了&#xff0c;现在仍然在不少功放、音箱中能看到。 TAS5711特征 音频输入/输出 从 18V 电源向 8Q 负载提供 20W 功率 宽 PVDD…

深度学习之Tensorflow卷积神经网络手势识别

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 手势识别是计算机视觉和人工智能领域的重要应用之一&#xff0c;具有广泛的应用前景&#xff…

常用生物信息学服务器推荐

1、超强性能&#xff0c;AMD 256核心&#xff0c;512线程&#xff0c;2.5TB满通道内存&#xff0c;200T硬盘 CPU&#xff1a;2颗128核心 2.25GHz AMD EPYC 9754 内存&#xff1a;24根96GB DDR5 4800MHz ECC REG 硬盘&#xff1a;1块1TB U.2 SSD系统盘1块15.36TB U.2热数据盘…

2024 年 电工杯(A题)大学生数学建模挑战赛 | 园区微电网风光储协调| 数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 CS团队倾注了大量时间和心血&#xff0c;深入挖掘解决方案。通…

pip换源ubuntu

到THU网站上有给定的教程 https://mirrors.tuna.tsinghua.edu.cn/help/pypi/ 方法1 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package然后在https://pypi.org/project/nvidia-cublas-cu12/#files 里面搜索你的包名 方法2 python -m pip install --upg…

计算机毕业设计python+django医院住院挂号登记收费系统7ui9s

在该医院信息管理系统中&#xff0c;python技术可以给用户带来极大方便&#xff0c;其主要特点就是可以使用户学习起来方便、快捷&#xff0c;另一方面就是信息储存量也是非常大的&#xff0c;该功能主要被应用为数据库中进行查询和编程。并且该功能的数据应用比较灵活&#xf…

JVM优化之使用Jstack命令查找JVM死锁

JVM优化之使用Jstack命令查找JVM死锁 示例代码 public class DeadLockDemo {private static Object lock1 new Object();private static Object lock2 new Object();public static void main(String[] args) {new Thread(() -> {synchronized (lock1) {try {System.out.p…

新品 | Forge® 1GigE IP67工业相机助力智能农业、食品和饮料行业

近日&#xff0c;51camera的合作伙伴Teledyne FLIR IIS推出Forge 1GigE IP67,它是Forge系列的最新工业相机&#xff0c;旨在在恶劣的工业环境中运行&#xff0c;同时确保高效的生产能力。Forge 1GigE IP67致力于为工厂自动化提供先进成像系统的最新产品。 Forge 1GigE IP67相机…

Spring Cloud整合Sentinel

1、引入依赖 链接: 点击查看依赖关系 父pom <spring.cloud.version>Hoxton.SR12</spring.cloud.version> <spring.cloud.alibaba.version>2.2.10-RC1</spring.cloud.alibaba.version>Sentinel应用直接引用starter <dependency><groupId&…

IDEA软件和插件安装

安装IDEA版本&#xff1a;IDEA windows 2021.1.3 使用该版本的IDEA&#xff0c;并且安装下面插件后&#xff0c;个人认为非常好用&#xff0c;并且可以不用破解&#xff0c;无限使用企业版&#xff0c;了解具体方法可以留言或私信。 记录几个好用的IDEA插件&#xff0c;后续持…

Linux实验五:进程间通信(一)

目录 一、实验目的二、实验内容三、实验环境四、参考代码五、实验步骤步骤1. 编辑源代码test5.c步骤2. 编译源代码test5.c步骤3. 运行可执行程序test5步骤4. 进一步调试源代码test5.c 六、实验结果七、实验总结 一、实验目的 1、理解Linux进程通信的基本原理和方法&#xff1b…

刷题之从前序遍历与中序遍历序列构造二叉树(leetcode)

从前序遍历与中序遍历序列构造二叉树 前序遍历&#xff1a;中左右 中序遍历&#xff1a;左中右 前序遍历的第一个数必定为根节点&#xff0c;再到中序遍历中找到该数&#xff0c;数的左边是左子树&#xff0c;右边是右子树&#xff0c;进行递归即可。 #include<vector>…

基于微信的家庭理财管理小程序的设计与实现(论文+源码)_kaic

摘 要 随着中国经济的飞速发展&#xff0c;家庭收入不断增高&#xff0c;人们的消费除了简单的维持日常生活之外&#xff0c;还有其他的消费方式&#xff0c;比如旅游、电商购物等&#xff0c;层出不穷的消费方式带给人快乐的同时&#xff0c;也常常让一些人逐渐无法把握住自…

【算法】栈算法——最小栈

题解&#xff1a;最小栈(栈算法) 目录 1.题目2.题解3.总结 1.题目 题目链接&#xff1a;LINK 这个题目题意说的有点绕&#xff0c;说白了让你在常数时间内检索到最小元素就是O(1)时间复杂度下找到栈中最小的元素。 2.题解 思路&#xff1a;这个栈可以内嵌套两个库栈来进行…

了解区块链基础设施,共同构建安全且强大的Sui网络

区块链基础设施的范畴很广&#xff0c;但其核心是那些直接与网络互动的计算机。这些实体通常被称为节点&#xff0c;分为不同的类型&#xff0c;例如维护完整区块链副本的全节点&#xff0c;以及作为共识决定者的验证节点。除了这两种类型之外&#xff0c;还有其他类型的节点&a…