ARM Cortex-M3中断简介

news/2025/3/11 0:41:52/文章来源:https://www.cnblogs.com/RAM-YAO/p/18345988

目录
  • 中断优先级分组
  • 三个系统中断优先级配置寄存器
    • SHPR1
    • SHPR2
    • SHPR3
  • 三个中断屏蔽寄存器
    • PRIMASK
    • FAULTMASK
    • BASEPRI

中断优先级分组

ARM Cortex-M 内核的 MCU 具有一个用于中断管理的嵌套向量中断控制器(NVIC,全称:Nested vectored interrupt controller)。ARM Cortex-M 的 NVIC 最大可支持 256 个中断源,其中包括 16 个系统中断和 240 个外部中断,然而芯片厂商一般情况下都用不完这些资源。以下为Cortex-M3的异常类型表:

ARM Cortex-M 使用 NVIC 对不同优先级的中断进行管理,在 core_cm3.h中可以找到如下的结构体定义:

typedef struct
{
    __IOM uint32_t ISER[8U]; /* 中断使能寄存器 */
    uint32_t RESERVED0[24U];
    __IOM uint32_t ICER[8U]; /* 中断除能寄存器 */
    uint32_t RSERVED1[24U];
    __IOM uint32_t ISPR[8U]; /* 中断使能挂起寄存器 */
    uint32_t RESERVED2[24U];
    __IOM uint32_t ICPR[8U]; /* 中断除能挂起寄存器 */
    uint32_t RESERVED3[24U];
    __IOM uint32_t IABR[8U]; /* 中断有效位寄存器 */
    uint32_t RESERVED4[56U];
    __IOM uint8_t IP[240U]; /* 中断优先级寄存器 */
    uint32_t RESERVED5[644U];
    __OM uint32_t STIR; 	/* 软件触发中断寄存器 */
} NVIC_Type;

其中比较重要的是成员变量 IP,该成员变量是一个uint8_t类型的数组,数组内有240个元素,每一个8bit的元素就用来配置对应的外部中断的优先级,所以最大中断的优先级配置范围应该是0-255。但是芯片厂商一般并不会用完所有的位来配置中断,对于STM32只用到了其高4位[7:4],低四位[3:0]取零处理,因此STM32提供了16级的中断优先等级。

STM32将中断分为了5个组,组0~4,该组是由SCB->AIRCR 寄存器的 bit10~8 来定义的。

根据写入的值不同以配置不同的优先级分组,对应的值在库函数中有如下定义:

#define NVIC_PriorityGroup_0         ((uint32_t)0x700) /*!< 0 bits for pre-emption priority4 bits for subpriority */
#define NVIC_PriorityGroup_1         ((uint32_t)0x600) /*!< 1 bits for pre-emption priority3 bits for subpriority */
#define NVIC_PriorityGroup_2         ((uint32_t)0x500) /*!< 2 bits for pre-emption priority2 bits for subpriority */
#define NVIC_PriorityGroup_3         ((uint32_t)0x400) /*!< 3 bits for pre-emption priority1 bits for subpriority */
#define NVIC_PriorityGroup_4         ((uint32_t)0x300) /*!< 4 bits for pre-emption priority

不同分组对应的抢占优先级与子优先级的分配如下:

对于FreeRTOS,官方建议使用中断优先级分组4,即高4位全部用于抢占优先级,不使用子优先级,这样做是为了使得任务调度与中断屏蔽更加简单与清晰。

除了外部中断,系统中断有独立的中断优先级配置寄存器,分别为 SHPR1SHPR2SHPR3系统处理程序优先级寄存器。

三个系统中断优先级配置寄存器

SHPR1

SHPR1 寄存器的地址为 0xE000ED18,用于配置 MemManage、BusFault、UsageFault 的中断优先级,各比特位的功能描述如下所示:


寄存器描述如下

SHPR2

SHPR2 寄存器的地址为 0xE000ED1C,用于配置 SVCall(系统服务调用中断) 的中断优先级。


寄存器描述如下

SHPR3

SHPR3 寄存器的地址为 0xE000ED20,用于配置 PendSV(可悬挂请求)、SysTick 的中断优先级。


寄存器描述如下

FreeRTOS 在配置 PendSV 和 SysTick中断优先级的时候,就使用到了 SHPR3 寄存器。

其他的系统中断如NMI(不可屏蔽中断)、hard fault(硬fault)是不可编程的,所以无法进行配置。

NMI(Non-Maskable Interrupt):NMI(不可屏蔽中断)是一种特殊类型的中断,其优先级高于大多数其他中断,包括硬件错误中断(HardFault)。它通常用于处理一些关键的系统级事件,如存储器校验错误或外部事件。NMI中断在优先级上位于硬件故障(HardFault)之上,这意味着即使系统发生了HardFault,NMI中断也可能得到处理。

HardFault(硬件故障)中断:HardFault是指发生在CPU执行期间的硬件故障,例如访问无效地址或未对齐的存储器访问。在STM32中,HardFault中断由CPU自动生成,当出现严重的硬件错误或不可恢复的软件错误时触发。它通常表示系统进入了无法继续正常执行的状态。HardFault中断处理程序允许开发者检测和记录发生的错误,并在可能的情况下采取某些修复措施,尽管在大多数情况下,这个中断处理程序主要用于诊断和记录故障状态,而不是尝试继续执行。

三个中断屏蔽寄存器

ARM Cortex-M 有三个用于屏蔽中断的寄存器,分别为 PRIMASK、FAULTMASK 和BASEPRI。

PRIMASK

作用:PRIMASK 寄存器有 32bit,但只有 bit0 有效,是可读可写的,将 PRIMASK 寄存器设置为 1 用于屏蔽除 了NMI(不可屏蔽中断)和 HardFault(硬件错误中断)外的所有异常和中断,将 PRIMASK 寄存器清 0 用于使能中断。

FAULTMASK

作用:FAULTMASK 寄存器有 32bit,但只有 bit0 有效,也是可读可写的,将 FAULTMASK寄存器设置为 1 用于屏蔽除NMI(不可屏蔽中断)外的所有异常和中断,也就是说连同 hard fault 也会被屏蔽掉。将 FAULTMASK 寄存器清零用于使能中断。

BASEPRI

作用:BASEPRI 有 32bit,但只有低 8 位[7:0]有效,也是可读可写的。BASEPRI 寄存器比起 PRIMASK 和 FAULTMASK 寄存器直接屏蔽掉大部分中断的方式,BASEPRI 寄存器的功能显得更加细腻BASEPRI 用于设置一个中断屏蔽的阈值,设置好 BASEPRI 后,中断优先级低于等于 BASEPRI 的中断就都会被屏蔽掉,FreeRTOS 就是使用 BASEPRI 寄存器来管理和屏蔽中断的,而不受 BASEPRI 设置的值管理的中断,则不受影响。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python、R银行信用卡客户流失机器学习预测热门文章合集

原文链接:https://tecdat.cn/?p=37244 原文出处:拓端数据部落公众号 分析师: Cengjun Wang 目前,众多银行由于服务质量的降低、同业竞争的日益激烈等因素,面临着信用卡客户流失的棘手难题,这给银行经理施加了沉重的压力。而且,获取新的信用卡用户所需成本通常高于维持…

AntDesignVue的a-tree实现selectable和checkable同步

无论是点击勾选框还是点击树中的title名称 选中逻辑同步<a-treecheckableselectablev-model:tree-data="treeData"v-model:selectedKeys="selectedKeys"v-model:checkedKeys="checkedKeys"@select="handleTreeSelect"></a-tr…

存储系统基本概念

存储器的层次化结构存储系统的分类 存储器的种类繁多,我们可以从不同的角度对存储器进行分类

线性丢番图方程

线性丢番图方程定理 设 \(a,b\) 是整数且 \(gcd(a,b) = d\). 如果 \(d\) 不能整除 \(c\) , 那么方程 \(ax+by=c\) 没有整数解, 如果\(d\) 可以整除 \(c\), 则存在无穷个解. 另外, 如果 \((x_0,y_0)\) 是方程的一个特解, 那么所有解都可以表示为 : \[x = x_0 + (\frac{b}{d})n, …

DFJX[2024] 游记

暑假第二次集训的记录……备战CSP-S ing…… 谨以此记,记录我们共同热爱的OI!洛谷食用 博客食用 这七天没什么事的话都会更新的(8.4-8.11) Day 0 集训, 因为在自己学校,总有种开学的感觉 也是提前住上九年级的新宿舍楼了,喜提一床+班长 下午到学校,食堂没给我们准备饭…

七层网络协议

应用层  应用层的作用是为应用程序提供服务并规定应用程序中通讯相关的细节,也就是为应用提供服务。常见的协议有 HTTP,FTP,TELNET、SMTP 等。 是用户与应用程序之间的接口。 相当于收件员。当客户(应用)打电话(发起请求)给收件员(应用层)时,收件员可以根据客户的不…

Qt/C++最新地图组件发布/历时半年重构/同时支持各种地图内核/包括百度高德腾讯天地图

一、前言说明 最近花了半年时间,专门重构了整个地图组件,之前写的比较粗糙,有点为了完成功能而做的,没有考虑太多拓展性和易用性。这套地图自检这几年大量的实际项目和用户使用下来,反馈了不少很好的建议和意见,经过这几年的整理,刚好趁着近期经济下行严重,抽出时间把整…

[WACV2022]Addressing out-of-distribution label noise in webly-labelled data

该论文考虑了一个现实的场景:数据集来自网络爬虫,即存在开集噪声OOD样本和闭集噪声ID样本。作者提出了一个简单但有效的策略:通过新设计的指标区分OOD样本,并对OOD样本软化(soften)弥补与干净样本的差距,该方法称为:Dynamic Softening of Out-of-distribution Samples …

异常处理

异常概述 程序中的异常: 在Java语言中,异常是指程序在运行期间发生的事件,它是导致程序中断运行的正常指令流。 例如,在算术运算中除数为0、数组越界、空指针异常等,这些事件的发生都会阻止程序的正常运行。 *示例:**演示除法运算*** public class MathCalc {public stat…

Matlab第一章

Matlab第一章 1.命令行窗口里写的命令,当文件关闭时命令行窗口和工作区内容消失。 2.想要保存代码,方法是: 新建脚本->写代码->保存->运行 3.脚本语言 (1)clear;清空工作区 clc;清空命令行窗口 x=20; y=30; x+y(2)clear; clc; x=20; y=30; x+y;如果x+y有分号则…