关于ARM的向量中断控制器NVIC

news2024/9/26 3:20:38

学习或者了解过ARM的朋友应该都会知道NVIC这么个东西,这个东西也是ARM中非常重要的东西,它是ARM不可分离的部分,搭配着内核共同完成着对中断的响应。

1、那到底NVIC是个啥东西呢?

NVIC:简称嵌套向量中断控制器。它管理着包括内核、外部异常等的所有中断的响应和处理。

为了可以方便说明NVIC的原理和使用方法,本文以STM32F103作为参照说明NVIC的基本组成和使用原理。

STM32F103的内核使用的是Cortex-M3,是32bit的微处理器。它有专门的异常响应系统(NVIC)用于支持系统异常和外部异常中断。

Cortex-M3的异常响应系统支持16个系统异常、240个外部异常中断,总共256个异常响应,可以支持的异常数量可谓是很多了。

内核中对每种异常都有一个编号用于表示对应的中断,其中编号0-15表示系统异常,这部分属于内核的,不可更改,另外的16之后的是外部中断,除了少数不支持编程外,其他的都支持编程控制。

在 Cortex-M3 中有3个系统异常是固定优先级的,它们高于其他所有的异常,以确保它们能及时得到响应。

系统异常编号如下所示:

 注意:上图的系统异常的编号,0是不存在的,不是异常。

外部异常的编号如下所示:

 

2、ARM Cortex-M 的优先级的定义

NVIC可以支持240个外部中断,也就是说最多有240个中断优先级。

虽然外部可以支持的中断异常可以高达240个,但是往往在设计芯片的时候都会做精简,不会完全用上,这个主要跟芯片设计时所考虑的应用场景有关吧。比如说有些芯片所支持的优先级数有可能是8级、16级、32级、48级等等的。

ARM公司对于中断优先级的管理提供了8个位给芯片厂商设置中断的优先级,芯片厂商可以根据需要自己裁剪,达到最终到底使用级优先级的目的。

但是,芯片厂商不一定都完全使用这8个位,可能只使用几个位。

STM32F103是ST公司开发的,中断优先级就只使用了这8个位中的高4位 ,所以最多可设置16个中断优先级。

这个是怎么理解呢?

假如我现在有一款芯片,它是用4个位表达优先级的,那么优先级配置寄存器的划分如下图:

[0:3]没有被使用到,你去读它们也是返回零,写它们就直接忽略写入的值。所以3个位的情况下,能够使用的 16 个优先级为:0x00(最高) ~ 0xE0。

注意:中断优先级使用数值来表示。数值越小,优先级越高。

 

3、抢占优先级 & 响应优先级

Cortex-M3 支持中断嵌套,可以让优先级高的中断抢占优先级低的中断,从而确保高优先级的中断异常能及时得到响应,而被打断了的低优先级中断异常先进入等待,等待高优先级的中断执行完毕之后再执行。

在NVIC中有一个寄存器:应用程序中断及复位控制寄存器(AIRCR),它里面有 一个位段名为“优先级组”,如下:

 这个优先级组的作用是很大的,它将每个优先级可配置的异常中断都能进行分组配置,意思就是可以将一个中断进行设置,分为抢占优先级和响应优先级。

首先,我们要知道,每一个外部中断它都有一个相对应的优先级寄存器,这个寄存器也是8Bit的长度,同样是使用高四位表示中断的优先级的。然后在这四位中再继续进行划分,分出了用多少个Bit表示抢占优先级和多少个Bit表示响应优先级。

根据这4个Bit的划分,抢占优先级和响应优先级(子优先级、亚优先级)的组合可以有如下的结果:

 

抢占优先级和响应优先级怎么理解呢?

简单来说就是,当一个系统中有很多的外部中断时,假如某些中断同时发生,那到底应该先响应哪个呢?如果设置了抢占优先级和响应优先级,那就会先比较抢占优先级,谁高就先执行谁;如果抢占优先级一样,就比较响应优先级,谁高就先执行谁;如果没有设置抢占优先级,而响应优先级又是一样,那就按照系统默认的中断优先级,谁高先响应谁。

4、中断优先级分组的寄存器设置

前面介绍NVIC、中断优先级的一些基本特性,对NVIC应该有一定的认识了。那怎么去配置中断的优先级呢?

首先,通过应用程序中断及复位控制寄存器AIRCR 的第8位至第10位设置优先级的分组,寄存器如下图:

 

特别注意:想要直接使用位操作更改10:8位是无效的!!!

比如:

AIRCR |= 5<<8;   //这么写是无效。

直接位操作对这个寄存器的内容更改是不生效的,如果想要修改这个寄存器需要同时操作31:16位才能生效。在寄存器中是有相关的说明的,如下:

 

打个比方:如果我要设置中断为分组2,抢占优先级(0--3)、响应优先级(0--3),那么有效的操作方式可以按照如下:

SCB->AIRCR = 0X05FA<<16 |5<<8; //设置为分组2.  抢占优先级(0--3)、响应优先级(0--3) 
或   
SCB->AIRCR = 0x05FA0500  ; //设置为分组2.  抢占优先级(0--3)、响应优先级(0--3)

5、抢占优先级和响应优先级的寄存器设置

设置好了优先级的分组之后,如果你想要使用某一个异常中断并且希望设置它的抢占优先级和响应优先级,那你需要了解相关可能用到的寄存器,相关的寄存器可以到内核文件中查阅,如下:

上面的寄存器分别如下:

5.1、中断设置启用寄存器 ISER

 

5.2、中断清除启用寄存器 ICER

 

5.3、中断设置挂起寄存器 ISPR

 

5.4、中断清除挂起寄存器 ICPR

 

5.5、中断活动位寄存器 IABR

 

5.6、中断优先级寄存器 IP

 

IPR0-IPR16寄存器为每个中断提供4位优先级字段。这些寄存器是字节可访问。每个寄存器包含四个优先级字段,它们映射到CMSIS中断优先级数组IP[0]到IP[67]。

每个优先级字段保存一个优先级值0-255。值越低,相应中断的优先级越高。处理器只实现每个字段的位[7:4],位[3:0]读取为零并忽略写入。

5.7、软件触发中断寄存器 STIR

当SCR中的USERSETMPEND位设置为1时,无权限软件可以访问STIR,只有特权软件才能启用对STIR的非特权访问。

6、中断设置的操作示例

中断的设置的步骤:

1、设置中断分组。抢占优先级是多少,子优先级是多少

SCB->AIRCR = 0X05FA << 16 | 0X05 << 8;

2、开总中断

NVIC->ISER[1] |= 1<<(37 -32);

7、举例:设置串口中断

如果要使用串口的中断,需要完成两部分操作:

(1)设置中断优先级分组

配置串口中断的优先级,如果不手动配置而有启用串口中断,会默认为自然优先级。

外部中断的优先级是通过 IP[n] (n=0~239) 进行设置的,这个n值可以通过查阅中断向量号即可以得到,如下:

 

比如:我要设置串口中断的抢占优先级为1,响应优先级为2。那么示意图如下:

 

操作示例如下:

NVIC->IP[37] = 0X60;

(2)开启串口1中断

串口1的中断向量表如下:

 

开启串口1的总中断的示例如下:

NVIC->ISER[1] |= 1<<(37-32);

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【new操作符做了什么 —— js】

&#x1f9c1;个人主页&#xff1a;个人主页 ✌支持我 &#xff1a;点赞&#x1f44d;收藏&#x1f33c;关注&#x1f9e1; 文章目录new操作符具体做了什么&#xff1f;&#x1f388;创建了一个空的对象✨将空对象的原型&#xff0c;指向于构造函数的原型&#x1f367;将空对象…

【操作系统】—— Windows卸载与清除工具“ Geek 与 CCleaner ” (带你快速了解)

&#x1f4dc; “作者 久绊A” 专注记录自己所整理的Java、web、sql等&#xff0c;IT技术干货、学习经验、面试资料、刷题记录&#xff0c;以及遇到的问题和解决方案&#xff0c;记录自己成长的点滴。 &#x1f341; 操作系统【带你快速了解】对于电脑来说&#xff0c;如果说…

day23-网络编程01

1.网络编程入门 1.1 网络编程概述【理解】 计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统&#xff0c;网络管理软件及网络通信协议的管理和协调下&#xff0c;实现资源共享和信息传递的计…

微服务框架需要处理哪些问题?

文章目录简述架构选择统一版本管理基础框架包管理业务框架包管理模型分层全局上下文管理数据结构定义上下文的传播前后端数据格式协定统一数据格式字段规范协定异常处理orm配置公共字段处理分页处理字段加解密缓存key的序列化哪些数据进行缓存消息队列key的规范队列的管理注册中…

34.Isaac教程--操作示例应用程序

操作示例应用程序 ISAAC教程合集地址文章目录操作示例应用程序与 Jupyter Notebook 的简单联合控制Shuffle Box with Simulator与 Jupyter Notebook 的简单联合控制 此示例使用 Jupyter Notebook 提供交互式联合控制。 这是处理用于操作组件&#xff08;包括 LQR 规划器&#…

PowerShell 执行策略

在使用 SAPIEN 的PowerShell Studio时出现如下错误&#xff1a;无法在当前系统上运行该脚本。有关运行脚本和设置执行策略的详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。 ERROR: 所在位置 行:1 字符: 2 ERROR: …

python基础——函数编程

python基础——函数编程 文章目录python基础——函数编程一、实验目的二、实验原理三、实验环境四、实验内容五、实验步骤一、实验目的 掌握函数编程 二、实验原理 在Python中&#xff0c;定义函数的语法如下&#xff1a; def 函数名([参数列表])&#xff1a; ‘’‘注解’…

【人人都是算法专家】一文搞定AI算法竞赛(全网最详细)

Rocky Ding公众号&#xff1a;WeThinkIn写在前面 【人人都是算法专家】栏目专注于分享Rocky在AI行业中业务/竞赛/研究/产品维度的思考与感悟。欢迎大家一起交流学习&#x1f4aa; 大家好&#xff0c;我是Rocky。 之前Rocky总结过很多关于AI算法竞赛的方法论、经验思考以及细节…

分享123个ASP源码,总有一款适合您

ASP源码 分享123个ASP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 123个ASP源码下载链接&#xff1a;https://pan.baidu.com/s/17G9rpRpCJX_D-6DV0j4uFg?pwd3rx8 提取码&#x…

qt json tree 读取json树状结构并显示

1.介绍 用qt的相关的几个类处理json格式的信息 json内容&#xff1a; { "root":{"sites": [{ "name":"菜鸟教程" , "url":"www.runoob.com" }, { "name":"google" , "url":&quo…

QT环境的搭建安装:VsCode及Qt Creator

前言&#xff1a; vscode的界面美观&#xff0c;并且和QT一样的跨平台&#xff0c;所以可以选择vscode作为开发环境。   QT5.9.X版本成熟&#xff0c;相应教程丰富&#xff0c;并且5.9.9版本具有生成CMake功能&#xff0c;所以本文以QT5.9.9版本为例&#xff0c;给出QT环境的…

美团出品 | YOLOv6 v3.0 is coming(性能超越YOLOv7、v8)

&#x1f680;&#x1f680;&#x1f680;美团出品 | YOLOv6 v3.0 is coming &#xff01;&#xff01;✨✨✨ 一、前言简介 &#x1f384;&#x1f388; &#x1f4da; 代码地址&#xff1a;美团出品 | YOLOv6 3.0代码下载地址 &#x1f4da; 文章地址&#xff1a;https://a…

仿写Dubbo-Java反射

概念 反射是Java的一个特性&#xff0c;反射允许程序运行时动态获取类的所有信息以及对其进行操作。反射在框架(spring&#xff0c;springboot&#xff0c;mybatis等)中的使用非常的广发&#xff0c;可谓是框架的灵魂。 获取Class对象 在使用反射之前&#xff0c;需要获取到Cla…

工欲善其事必先利其器——Elasticsearch安装

安装使用说明 首先在elasticsearch官网下载你想要安装的版本&#xff0c;我这里使用的是7.12.1版本 上传到你想要安装的目录&#xff08;/user/search/&#xff09; 然后解压&#xff0c;解压命令如下&#xff1a; tar -zxvf elasticsearch-7.12.1-linux-x86_64.tar.gz 解压后…

创建保存字符串的数组numpy.char以及用于处理字符串数组的函数

【小白从小学Python、C、Java】【计算机等级考试500强双证书】【Python-数据分析】创建字符串数组numpy.char.array()修改字符串数组大小写capitalize()&#xff1b;title()&#xff1b;lower()&#xff1b;upper()[太阳]选择题对于以下python代码title()方法输出的结果是?imp…

【并发编程十二】c++20线程同步——信号量(semaphore)

【并发编程十二】c20线程同步——信号量&#xff08;semaphore&#xff09;一、互斥二、条件变量三、future四、信号量1、信号量原理2、c 20 信号量3、demo简介&#xff1a; 本篇文章&#xff0c;是线程同步的最后一篇。我们详细的介绍下c标准库提供的线程同步方法——信号量&a…

嵌入式Linux-线程创建与终止

1. 线程的创建 1.1 创建线程 启动程序时&#xff0c;创建的进程只是一个单线程的进程&#xff0c;称之为初始线程或主线程&#xff0c;本小节我们讨论如何创建一个新的线程。 创建线程与创建进程的方法是一样的&#xff0c;让我们来看一下创建线程的函数&#xff1a; #incl…

Linux基本功系列之chown命令实战

文章目录一. 前言&#x1f680;&#x1f680;&#x1f680;二. chown命令介绍三. 语法格式及常用选项四. 参考案例3.1 改变指定文件的属组和属主3.2 改变指定文件的所属主与所属组&#xff0c;并显示过程3.3 改变指定目录及其内所有子文件的所属主与所属组3.4 只修改文件所属组…

P问题、NP问题、NP-Complete问题、NP-Hard问题分别代表什么含义?

绪论 在了解P、NP、NP-Complete、NP-Hard问题之前,先感性地感受一下这几个问题之间的区别和联系👇: 上图分为左右两个版本,推荐记住左边的比较通用。这是因为NP=P这个数学问题曾经被列为7大数学难题之一,而且是之首,甚至美国还悬赏100W美金,但是比较认可的结果是暂时…

Python数据可视化之条形图和热力图

Python数据可视化之条形图和热力图 提示&#xff1a;介绍 简单介绍Pthon可视化的图表使用 提示&#xff1a;热力图和条形图 文章目录Python数据可视化之条形图和热力图前言一、导入数据包二、选择数据集2.加载数据2.读入数据总结前言 提示&#xff1a;这里可以添加本文要记录的…