Cortext-M3系统:NVIC与中断控制(4)

news2024/11/21 2:39:15

1、NVIC概述

        向量中断控制器,简称NVIC,是Cortex-M3不可分离的一部分,它与CM3内核的逻辑紧密耦合。NVIC的寄存器以存储器映射的方式来访问,除了包含控制寄存器和中断处理的控制逻辑之外,NVIC还包含了MPU、SysTick定时器以及调试控制相关的寄存器。

        NVIC共支持1至240个外部中断输入(通常外部中断写作IRQs)。具体的数值由芯片厂商在设计芯片时决定。此外,NVIC还支持一个不可屏蔽中断(NMI)输入。NVIC的访问地址是0xE000_E000。所有NVIC的中断控制/状态寄存器都只能在特权级下访问。不过有一个例外——软件触发中断寄存器可以在用户级下访问以产生软件中断。

        NVIC的访问地址是0xE000_E000。所有NVIC的中断控制/状态寄存器都只能在特权级下访问。不过有一个例外——软件触发中断寄存器可以在用户级下访问以产生软件中断。所有的中断控制/状态寄存器均可按字/半字/字节的方式访问。此外,还有几个中断掩蔽寄存器也与中断控制密切相关,只能通过MRS/MSR及CPS来访问。

2、中断配置基础

        每个外部中断都在NVIC的下列寄存器中“挂号”: ​

        使能与除能寄存器 ​

        悬起与“解悬”寄存器 ​

        优先级寄存器 ​

        活动状态寄存器 ​ 

        另外,下列寄存器也对中断处理有重大影响

        异常掩蔽寄存器(PRIMASK, FAULTMASK以及BASEPRI) ​

        向量表偏移量寄存器 ​

        软件触发中断寄存器 ​

        优先级分组位段

3、中断的使能与除能

        中断的使能与除能分别使用各自的寄存器来控制,CM3中可以有240对使能位/除能位(SETENA位/CLRENA位),每个中断拥有一对。这240对分布在8对32位寄存器中(最后一对没有用完)。欲使能一个中断,我们需要写1到对应SETENA的位中;欲除能一个中断,你需要写1到对应的CLRENA位中。如果往它们中写0,则不会有任何效果。SETENA/CLRENA寄存器族如图所示。

4、中断的悬起与解悬

        如果中断发生时,正在处理同级或高优先级异常,或者被掩蔽,则中断不能立即得到响应。此时中断被悬起。中断的悬起状态可以通过“中断设置悬起寄存器(SETPEND)”和“中断悬起清除寄存器(CLRPEND)”来读取,还可以写它们来手工悬起中断。

        悬起寄存器和“解悬”寄存器也可以有8对,其用法和用量都与前面介绍的使能/除能寄存器完全相同。SETPEND/CLRPEND寄存器族如图所示。

 4.1 优先级

        每个外部中断都有一个对应的优先级寄存器,每个寄存器占用8位,但是CM3允许在最“粗线条”的情况下,只使用最高3位。4个相临的优先级寄存器拼成一个32位寄存器。

4.2 活动状态

        每个外部中断都有一个活动状态位。在处理器执行了其ISR的第一条指令后,它的活动位就被置1,并且直到ISR返回时才硬件清零。由于支持嵌套,允许高优先级异常抢占某个ISR。然而,哪怕中断被抢占,其活动状态也依然为1。ACTIVE寄存器族如图。

 4.3 特殊功能寄存器PRIMASK和FAULTMASK

        PRIMASK用于除能在NMI和硬fault之外的所有异常,它有效地把当前优先级改为0(可编程优先级中的最高优先级)。该寄存器可以通过MRS和MSR以下例方式访问:

         FAULTMASK更绝,它把当前优先级改为-1。这么一来,连硬fault都被掩蔽了。使用方案与PRIMASK的相似。但要注意的是,FAULTMASK会在异常退出时自动清零。

        掩蔽寄存器不能屏蔽NMI,因为NMI是用在最危急的情况下的。

4.4 BASEPRI

        在更精巧的设计中,需要对中断掩蔽进行更细腻的控制——只掩蔽优先级低于某一阈值的中断——它们的优先级在数字上大于等于某个数。其值存储在BASEPRI中。如果往BASEPRI中写0,BASEPRI将停止掩蔽任何中断。例如,如果我们需要掩蔽所有优先级不高于0x60的中断,则可以如下编程:

        另外,我们还可以使用BASEPRI_MAX这个名字来访问BASEPRI寄存器,它俩其实是同一个寄存器。但是当我们使用这个名字时,会使用一个条件写操作。个中原因如下:尽管它俩在硬件水平上是同一个寄存器,但是生成的机器码不一样,从而硬件的行为也不同:使用BASEPRI时,可以任意设置新的优先级阈值;但是使用BASEPRI_MAX时则“许进不许出”——只允许新的优先级阈值比原来的那个在数值上更小,也就是说,只能一次次地扩大掩蔽范围,反之则不行。就好像绳子打了死结,只会越拉越紧。

        为了把掩蔽阈值降低,或者解除掩蔽,需要使用“BASEPRI”这个名字。在用户级下是不得更改BASEPRI寄存器的。与其它和优先级有关的寄存器一样,系统中表达优先级的位数,也同样影响BASEPRI中有意义的位数。

4.5 其他异常的配置寄存器

        用法fault,总线fault以及存储器管理fault都是特殊的异常,因此给它们开了小灶。其中,它们的使能控制是通过“系统Handler控制及状态寄存器(SHCSR)”(地址:0xE000_ED24)来实现的。各种faults的悬起状态和大多数系统异常的活动状态也都在该寄存器中。

         写这些寄存器时要小心,必须确保对活动位的修改是经过深思熟虑的,决不能粗心修改。否则,如果某个异常的活动位被意外地清零了,其服务例程却不知晓,仍然执行异常返回指令,那么CM3将产生一个fault——在异常服务例程以外做异常返回。

        下段文字改编自《Cortex-M3 Technical Reference Manual》, pg8-29,是给那些骨灰级玩家们看的,因为修改这些位还有更深层次的背景和特效。译文为:上表中的活动位虽然也是可写的,但是改动时必须予以极度的小心,否则这是玩火行为——设置或者清零这些位,会改变处理器中对异常活动的记录,却不会对应地修复堆栈中的数据(不会为了此改动而特意执行一次自动入栈或自动出栈操作),于是埋下了破坏堆栈内容而引起程序跑飞的隐患;另外,其它一些重要的数据结构也得不到清除,后患无穷。事实上,只有操作系统在特殊场合下才会修改它们。例如:在任务执行系统调用的过程中执行上下文切换(大幅提升实时性),或者在使用软件模拟未定义指令的功能期间(在用法fault服务例程中),以及软件模拟协处理器的功能期间,执行上下文切换,同样大幅提升实时性。 ​

        下面开始讲中断控制及状态寄存器ICSR。对于NMI、SysTick定时器以及PendSV,可以通过此寄存器手工悬起它们。另外,在该寄存器中,有好多位段都用于调试目的。在大多数情况下,它们对于应用软件都没有什么用处,只有悬起位对应用程序常常比较有参考价值,如表8.6所示。

 

 5、软件中断

        软件中断,包括手工产生的普通中断,能以多种方式产生。最简单的就是使用相应的SETPEND寄存器;而更专业更快捷的作法,则是通过使用软件触发中断寄存器STIR。

         注意:系统异常(NMI,faults,PendSV等),不能用此法悬起。而且缺省时根本不允许用户程序改动NVIC寄存器的值。如果确实需要,必须先在NVIC的配置和控制寄存器(0xE000_ED14)中,把比特1(USERSETMPEND)置位,才能允许用户级下访问NVIC的STIR。

6、SysTick定时器

        SysTick定时器被捆绑在NVIC中,用于产生SysTick异常(异常号:15)。在以前,操作系统还有所有使用了时基的系统,都必须一个硬件定时器来产生需要的“滴答”中断,作为整个系统的时基。滴答中断对操作系统尤其重要。例如,操作系统可以为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。 ​

        Cortex-M3处理器内部包含了一个简单的定时器。因为所有的CM3芯片都带有这个定时器,软件在不同CM3器件间的移植工作就得以化简。该定时器的时钟源可以是内部时钟(FCLK,CM3上的自由运行时钟),或者是外部时钟(CM3处理器上的STCLK信号)。不过,STCLK的具体来源则由芯片设计者决定,因此不同产品之间的时钟频率可能会大不相同。因此,需要检视芯片的器件手册来决定选择什么作为时钟源。

        SysTick定时器能产生中断,CM3为它专门开出一个异常类型,并且在向量表中有它的一席之地。它使操作系统和其它系统软件在CM3器件间的移植变得简单多了,因为在所有CM3产品间,SysTick的处理方式都是相同的。

         校准值寄存器提供了这样一个解决方案:它使系统即使在不同的CM3产品上运行,也能产生恒定的SysTick中断频率。最简单的作法就是:直接把TENMS的值写入重装载寄存器,这样一来,只要没突破系统的“弹性极限”,就能做到每10ms来一次SysTick异常。如果需要其它的SysTick异常周期,则可以根据TENMS的值加以比例计算。只不过,在少数情况下,CM3芯片可能无法准确地提供TENMS的值(如,CM3的校准输入信号被拉低),所以为保险起见,最好在使用TENMS前检查器件 的参考手册。 ​

        SysTick定时器除了能服务于操作系统之外,还能用于其它目的:如作为一个闹铃,用于测量时间等。要注意的是,当处理器在调试期间被喊停(halt)时,则SysTick定时器亦将暂停运作。

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

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

相关文章

算法分析01--算法的基本概念

1.算法设计与分析的基本概念 1.1算法 算法(Algorithm)是对特定问题求解步骤的一种描述, 它是指令的有限序列, 其中每一条指令表示一个或多个操作。 算法具有以下5个重要特性: 1.有穷性 一个算法必须在有穷步内完成,并且每一步…

Vue2 到 Vue3, 5 个常用API的变化有哪些

Vue3之于Vue2最大的变化,当属composition API了,而除了引入composition API外,一些我们在Vue2上经常使用的东西到了Vue3时也发生了不小的变化,本文将介绍一些有Vue2到Vue3中几个比较重要且常用的知识点,欢迎感兴趣的同…

学习adaboost(一,遍历分类器,c#实现)

我看了很多遍,终于搞懂了,现在编程试一试, 参考文献(十三)通俗易懂理解——Adaboost算法原理 - 知乎 (zhihu.com) 先写一一段代码,把这个数据集里头的所有分类器找出来:一共四种结果&#xff1a…

C++基础(4)——类和对象(2)

前言 本文主要介绍了C中类和对象的基本知识。 4.2.5:深拷贝和浅拷贝 浅拷贝:编译器给我们提供的拷贝函数就是等号复制操作 深拷贝:自己手动重写一个拷贝构造函数,重新new 浅拷贝会出现的问题:如果使用编译器提供的…

CSS3-背景

背景 1 背景颜色 2 背景图片 3 背景平铺 4 背景位置 5 背景相关属性连写 6(拓展)img标签和背景图片的区别 1 背景颜色 属性名:background-color 取值;关键字、rgb表示法、rgba表示法、十六进制 注意: 1 背景颜色默认值…

基于Java中小企业人力资源管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…

CSS查缺补漏之《常用文本属性、列表属性、表格属性、鼠标属性》

文本属性 letter-spacing&#xff1a; 表示字母或汉字间距&#xff1b; word-spacing&#xff1a;表示单词之间或汉字之间空格的间距 <div>Loremip sumdolors itametconsecteturadipisicingelit.Voluptas.</div> <div>这是一首简单的小情歌 唱着我们心肠的曲…

chatgpt赋能python:Python数据归一化:什么是数据归一化及其作用

Python数据归一化&#xff1a;什么是数据归一化及其作用 数据归一化是一个在数据分析中经常出现的术语。其目的是将数据缩放到相同的比例&#xff0c;从而进行更加准确和可靠的分析。在本文中&#xff0c;我们将介绍什么是数据归一化&#xff0c;为什么我们需要它以及如何在Py…

Element-ui 滚动条美化

目录 1、缘起 2、实际示例 3、美化滚动条 4、Element-plus中的滚动条 5、关于实现方式的思考 1、缘起 之前在做项目时&#xff0c;发现一个项目中&#xff0c;各个子应用项目的UI表现不一致&#xff0c;看了下式Vue项目滚动条和其他的子应用项目表现明显不一致。 有时候…

《网络安全0-100》网络安全前沿

1-人工智能和网络安全 人工智能和网络安全是两个不同的领域&#xff0c;但它 们之间存在着千丝万缕的联系和相互影响。下 面是一些人工智能和网络安全的联系和应用&#xff1a; 威胁检测和预测&#xff1a;人工智能可以利用机器学习 和深度学习等技术&#xff0c;对网络数据…

Golang每日一练(leetDay0103) 区域和检索1~3 Range Sum Query

目录 303. 区域和检索 - 数组不可变 Range Sum Query Immutable &#x1f31f; 304. 二维区域和检索 - 矩阵不可变 Range Sum Query 2d Immutable &#x1f31f;&#x1f31f; 307. 区域和检索 - 数组可修改 Range Sum Query Mutable &#x1f31f;&#x1f31f; &#…

kali配置静态IP地址

修改网络配置 执行命令&#xff1a; vim /etc/network/interfaces 文件末尾添加如下内容&#xff1a; auto eth0 iface eth0 inet static address 192.168.133.66 netmask 255.255.255.0 gateway 192.168.133.2其中&#xff0c;iface eth0 inet static 指配置eth0使用静态ip…

chatgpt赋能python:Python数据建模:从数据预处理到机器学习建模

Python数据建模&#xff1a;从数据预处理到机器学习建模 Python已经成为了数据建模与分析的主要工具之一&#xff0c;因为它的语法简单易懂&#xff0c;有许多数据科学库可以使用&#xff0c;支持各种各样的数据预处理和建模技术。在本文中&#xff0c;我们将重点介绍使用Pyth…

十五周算法训练营——普通动态规划(下)

今天是十五周算法训练营的第十二周&#xff0c;主要讲普通动态规划&#xff08;下&#xff09;专题。&#xff08;欢迎加入十五周算法训练营&#xff0c;与小伙伴一起卷算法&#xff09; 最长递增子序列 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。…

基于Java网上医院预约挂号系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

Java:不支持发行版本5

错误 Java&#xff1a;不支持发行版本5 详细错误 同学在github上找到一个微服务项目&#xff08;基于maven进行构建&#xff09;&#xff0c;进行二开&#xff0c;导入项目运行控制台报错 Java&#xff1a;不支持发行版本5&#xff0c;笔者修改项目结构&#xff08; F i l e…

chatgpt赋能python:使用Python自动备份数据库

使用Python自动备份数据库 数据库是企业中非常重要的组成部分&#xff0c;里面存储着大量的数据和业务逻辑。为了避免数据库丢失或损坏可能带来的灾难性后果&#xff0c;我们通常需要定期备份数据库。而使用Python自动备份数据库是一种快捷高效的方式&#xff0c;今天我们将介…

基于Java助学贷款系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

chatgpt赋能python:Python数据库备份脚本

Python数据库备份脚本 数据库备份是保障数据安全的重要手段。Python作为一种简单易学、高效稳定的编程语言&#xff0c;被广泛应用于数据库备份脚本的编写。本文将介绍如何使用Python编写一个简单的数据库备份脚本。 准备工作 在开始编写脚本之前&#xff0c;需要安装Python…

读发布!设计与部署稳定的分布式系统(第2版)笔记07_线程阻塞

1. 通过增加复杂性解决一个问题&#xff0c;会产生全新系统失效方式的风险 2. 多线程技术使应用程序服务器具有足够的容量扩展能力&#xff0c;来满足Web上最大站点的需求 2.1. 产生并发错误的可能性 3. 服务器的进程正在运行 3.1. 并不能帮助用户完成工作 3.2. 模拟客户端…