Cortex-M3的异常/中断屏蔽寄存器组
转自
1. Cortex-M3的异常/中断屏蔽寄存器组
注:只有在特权级下,才允许访问这3个寄存器。
名 字 |
功能描述 |
PRIMASK |
只有单一比特的寄存器。置为1后,就关掉所有可屏蔽异常,只剩下NMI和硬Fault可以响应。默认值是0,表示没有关闭中断。 |
FAULTMASK |
只有单一比特的寄存器。置为1后,只有NMI可以响应。默认值为0,表示没有关异常。 |
BASEPRI |
该寄存器最多有9位(由表达优先级的位数决定)。定义了被屏蔽优先级的阈值。当它被设置为某个值后,所有优先级号大于等于此值的中断都被关。若设置成0,则不关断任何中断,0为默认值。 |
注:寄存器BASEPRI的有效位数受系统中表达优先级的位数影响,如果系统中只使用3个位来表达优先级,则BASEPRI有意义的值仅为0x00、0x20、0x40、0x60、0x80、0xA0、0xC0和0xE0
使用MRS/MSR指令访问这三个寄存器,比如:
MRS R0, BASEPRI ;读取BASEPRI到R0中
MSR BASEPRI, R0 ;将R0数据写入到BASEPRI中
为了快速的开关中断,CM3还专门设置了一条CPS指令,有四种用法:
CPSID I ;PRIMASK=1,关中断
CPSIE I ;PRIMASK=0,开中断
CPSID F ;FAULTMASK=1,关异常
CPSIE F ;FAULTMASK=0,开异常
CMSIS-M3微控制器软件接口标准中的core_cm3.h给出了开关中断或异常的函数:
1.1 开/关中断
1: /**
2: * @brief Set the Priority Mask value
3: *
4: * @param priMask PriMask
5: *
6: * Set the priority mask bit in the priority mask register
7: */
8: static __INLINE void __set_PRIMASK(uint32_t priMask)
9: {
10: register uint32_t __regPriMask __ASM("primask");
11: __regPriMask = (priMask);
12: }
使用__set_PRIMASK(1)关闭中断;__setPRIMASK(0)开启中断。
一些说明:__INLINE是宏定义,对应__inline,这是keil编译器自定义关键字,表示这个函数是内联函数,但并不是强制性内联,编译器最终决定是否内联。
__ASM(“primask”): __ASM也是一个宏,对应__asm,这是keil编译器自定义关键字,关于这个关键字,有相当多的用法,可以在C中内嵌汇编语言、内嵌汇编函数、指定汇编标号以及本代码中的声明一个已命名寄存器变量。这里,已命名的寄存器是("primask"),也就是说寄存器变量__regPriMask等同于编译器已命名的primask。语法为:
register type var-name __asm(reg);
keil编译器已命名的寄存器变量为:
寄存器 |
__asm修饰的字符串 |
处理器 |
|
" |
All processors |
|
|
All processors |
|
|
Cortex-M3, Cortex-M4 |
|
|
Cortex-M3, Cortex-M4 |
|
|
Cortex-M0, Cortex-M1, Cortex-M3, Cortex-M4 |
|
|
Cortex-M0, Cortex-M1, Cortex-M3, Cortex-M4 |
|
|
Cortex-M0, Cortex-M1, Cortex-M3, Cortex-M4 |
|
|
Cortex-M0, Cortex-M1, Cortex-M3, Cortex-M4 |
|
|
Cortex-M3, Cortex-M4 |
|
|
Cortex-M0, Cortex-M1, Cortex-M3, Cortex-M4 |
|
|
Cortex-M0, Cortex-M1, Cortex-M3, Cortex-M4 |
|
|
Cortex-M0, Cortex-M1, Cortex-M3, Cortex-M4 |
|
|
Cortex-M0, Cortex-M1, Cortex-M3, Cortex-M4 |
|
|
Cortex-M0, Cortex-M1, Cortex-M3, Cortex-M4 |
|
|
Cortex-M0, Cortex-M1, Cortex-M3, Cortex-M4 |
|
|
Cortex-M0, Cortex-M1, Cortex-M3, Cortex-M4 |
|
|
All processors |
|
|
All processors |
|
"r13" or "sp" |
All processors |
|
"r15" or "pc" |
All processors |
|
|
All processors, apart from Cortex-M series processors. |
|
|
Cortex-M0, Cortex-M1, Cortex-M3, Cortex-M4 |
1.2 开/关异常
1: /**
2: * @brief Set the Fault Mask value
3: *
4: * @param faultMask faultMask value
5: *
6: * Set the fault mask register
7: */
8: static __INLINE void __set_FAULTMASK(uint32_t faultMask)
9: {
10: register uint32_t __regFaultMask __ASM("faultmask");
11: __regFaultMask = (faultMask & 1);
12: }
使用__set_FAULTMASK(1)来关闭中断和异常;使用__set_FAULTMASK(0)开启中断和异常.
1.3 更精确的优先级屏蔽
1: /**
2: * @brief Set the Base Priority value
3: *
4: * @param basePri BasePriority
5: *
6: * Set the base priority register
7: */
8: static __INLINE void __set_BASEPRI(uint32_t basePri)
9: {
10: register uint32_t __regBasePri __ASM("basepri");
11: __regBasePri = (basePri & 0xff);
12: }
比如想屏蔽优先级不高于0x60的中断,则使用代码:__set_BASEPRI(0x60);如果想取消中断屏蔽,则使用__set_BASEPRI(0)即可。
2.异常/中断和优先级
Cortex-M3的异常包括系统异常和外设中断,系统异常是Cortex-M3内核自带的一些异常,比如复位、总线Fault和SysTick等等(见表2-1),外设中断是指制造CPU的厂家加入的,比如串口、定时器中断等等(见表2-2)。
注:关于异常和中断,想要分个清清楚楚实在有点困难。异常和中断都可以“中断”正常执行的代码流,区别在于,异常是Cortex-M3内核产生的“中断”信号,而中断是Cortex-M3内核外部(片上外设或外部中断信号)产生的“中断”信号。希望你看懂了,有时候你心里明白,但要讲的清清楚楚着实难!
表2-1:系统异常
编号 |
类型 |
优先级 |
简介 |
0 |
N/A |
N/A |
无 |
1 |
复位 |
-3(最高) |
复位 |
2 |
NMI |
-2 |
不可屏蔽中断(来自外部NMI输入脚) |
3 |
硬Fault |
-1 |
只要FAULTMASK没有置位,硬Fault服务例程会被强制执行 |
4 |
存储器管理Fault |
可编程 |
MPU访问违例以及访问非法位置均可引发。企图在“非执行区”取址也会引发此Fault。 |
5 |
总线Fault |
可编程 |
总线收到了错误响应,原因可以使预取流产或数据流产,企图访问协处理器也会引发此Fault |
6 |
用法Fault |
可编程 |
由于程序错误导致的异常。通常是使用了一条无效指令,或者是非法的状态转换,例如尝试切换到ARM状态 |
7~10 |
保留 |
保留 |
保留 |
11 |
SVCall |
可编程 |
执行系统服务调用指令(SVC)引发的异常 |
12 |
调试监视器 |
可编程 |
调试器(断点、数据观察点,或者是外部调试请求) |
13 |
保留 |
保留 |
保留 |
14 |
PendSV |
可编程 |
为系统设备而设的“可挂起请求” |
15 |
SysTick |
可编程 |
系统节拍时钟定时器(SysTick) |
表2-2:外设中断
编号 | 类型 | 优先级 | 简介 |
16 |
IRQ #0 |
可编程 |
外设中断#0 |
17 |
IRQ #1 |
可编程 |
外设中断#1 |
... |
... |
可编程 |
... |
255 |
IRQ #239 |
可编程 |
外设中断#239 |
注:表2-1和2-2中的“编号”有着特殊的意义,一是特殊功能寄存器IPSR中会记录当前正在服务的异常并给出了它的编号;二是优先级完全相同的多个异常同时挂起时,则先响应异常编号最小的那一个。
一个发生的异常如果不能被立即响应,就称它被“挂起”,值得一提的是,对于被挂起的中断/异常,中断/异常信号不必由其产生者保持,NVIC的挂起状态寄存器会来保持这个信号。所以哪怕后来挂起的中断源释放了中断请求信号,曾经的中断请求也不会丢失。
除了复位、NMI和硬Fault三个异常具有固定的优先级外,其它所有异常和中断的优先级都是可以编程的。这就涉及到优先级配置寄存器。Cortex-M3优先级配置寄存器共8位,所以可以有256级的可编程优先级。但是大多数Cortex-M3芯片都会精简设计。
LPC177x/8x使用了优先级配置寄存器的5位,所以有32级可编程优先级。复位后,对于所有优先级可编程的异常,其优先级都被初始化为0(最高优先级)
2.1 设置异常/中断的优先级
2.1.1 系统异常优先级设置
SHPR1-SHPR3寄存器用于设置有可编程优先级的系统异常,可设置的优先级为0到31。SHPR1-SHPR3可按字节访问。为了提高软件效率,CMSIS简化了SCB寄存器的表述。在CMSIS中,字节数组SHP[0] 到SHP[12]对应于寄存器SHPR1至SHPR3。
表2-3:SHPR1寄存器的位分配
位 |
名称 |
功能 |
[31:24] |
PRI_7 |
保留 |
[23:16] |
PRI_6 |
系统处理程序6的优先级,用法Fault |
[15:8] |
PRI_5 |
系统处理程序5的优先级,总线Fault |
[7:0] |
PRI_4 |
系统处理程序4的优先级,存储器管理Fault |
表2-3:SHPR2寄存器的位分配
位 |
名称 |
功能 |
[31:24] |
PRI_11 |
系统处理程序11的优先级,SVCall |
[23:0] |
- |
保留 |
表2-4:SHPR3寄存器的位分配
位 |
名称 |
功能 |
[31:24] |
PRI_15 |
系统处理程序15的优先级,SysTick 异常 |
[23:16] |
PRI_14 |
系统处理程序14的优先级,PendSV |
[15:0] |
- |
保留 |
注:每个PRI_N域为8位宽,但是处理器仅实现每个域的位[7:3],位[2:0]读取值为零并忽略写入值。
Cortex-M3的异常/中断屏蔽寄存器组的更多相关文章
- Cortex-M3 R0~R15寄存器组 & 特殊功能寄存器组
[R0~R15寄存器组] Cortex-M3处理器拥有R0~R15的寄存器组,如: [R0~R12通用寄存器]R0~R12都是32位通用寄存器,用于数据操作.其中: R0~R7为低组寄存器,所有的指令 ...
- 【freertos】002-posix模拟器设计与cortex m3异常处理
目录 前言 posix 标准接口层设计 模拟器的系统心跳 模拟器的task底层实质 模拟器的任务切换原理 cortex M3/M4异常处理 双堆栈指针 双操作模式 栈帧 EXC_RETURN 前言 如 ...
- stm32和cortex M3学习内核简单总结
1.stm32综述 2.寄存器组 3.操作模式和特权级别 4.存储器映射 5.中断和异常 6.其他 Stm32综述 这可以说是我第一款认真学习的单片机了,学完这个就要开启我通往arm9的大门了,接下来 ...
- ARM Cortex M3系列GPIO口介绍(工作方式探讨)
一.Cortex M3的GPIO口特性 在介绍GPIO口功能前,有必要先说明一下M3的结构框图,这样能够更好理解总线结构和GPIO所处的位置. Cortex M3结构框图 从图中可以看出 ...
- STM32学习之路入门篇之指令集及cortex——m3的存储系统
STM32学习之路入门篇之指令集及cortex——m3的存储系统 一.汇编语言基础 一).汇编语言:基本语法 1.汇编指令最典型的书写模式: 标号 操作码 操作数1, 操作数2,... ...
- ARM Cortex M3(V7-M架构)硬件启动程序 一
Cortex-m3启动代码分析笔记 启动代码文件名是STM32F10X.S,它的作用先总结下,然后再分析. 启动代码作用一般是: 1)堆和栈的初始化: 2)中断向量表定义: 3)地址重映射及中断向量表 ...
- ARM 架构、ARM7、ARM9、STM32、Cortex M3 M4 、51、AVR 之间有什么区别和联系?(转载自知乎)
ARM架构: 由英国ARM公司设计的一系列32位的RISC微处理器架构总称,现有ARMv1~ARMv8种类. ARM7: 一类采用ARMv3或ARMv4架构的,使用冯诺依曼结构的内核. ...
- Implementation of Serial Wire JTAG flash programming in ARM Cortex M3 Processors
Implementation of Serial Wire JTAG flash programming in ARM Cortex M3 Processors The goal of the pro ...
- 【ARM-Linux开发】ARM7 ARM9 ARM Cortex M3 M4 有什么区别
ARM7 ARM9 ARM Cortex M3 M4 区别 arm7 arm9 可以类比386和奔腾, 不同代,arm9相比arm7指令集和性能都有所增强,arm7和arm9都有带mmu和无mmu的版 ...
随机推荐
- APUE线程控制
一.线程的限制 sysconf可以查看的值 PTHREAD_DESTRUCTOR_ITERATIONS 线程退出时操作系统实现试图销毁线程特定数据的最大次数 _SC_THREAD_DESTRUCTOR ...
- Java中遍历数组的三种方式复习
1 for循环遍历 通常遍历数组都是使用for循环来实现.遍历一维数组很简单,遍历二维数组需要使用双层for循环,通过数组的length属性可获得数组的长度. 程序示例: package captai ...
- RobotFramework 切换窗口控制的用法小结
一:滚动条控制 应用场景:通过滚动条的上下,左右移动,才能让定位的元素可见.
- Neo4j原生语句cc
Cypher语句 Cypher语句是Neo4j的图查询语言.以下例子来自Neo4j Browser,启动后在命令栏输入:play cypher即可1. 创建一个节点: 语法:CREATE (node- ...
- 2、Locust压力测试 实战
创建测试脚本 创建Test()类继承TaskSet类 创建beigong() 方法表示一个行为,访问北弓官网首页.用@task() 装饰该方法为一个任务.1表示一个Locust实例被挑选执行的权重,数 ...
- Jenkins和Docker
由于采用了Docker版的Jenkins,导致在Jenkins里无法调用Docker命令行工具进行Docker镜像构建 有三种解决方案: 1. 安装Docker插件,利用Jenkins插件进行构建 2 ...
- git 强制取消本地修改
本地的项目中修改不做保存操作,可以用到Git pull的强制覆盖,具体代码如下: git fetch --allgit reset --hard origin/master git fetch 指令是 ...
- swagger使用详解
1:认识Swagger Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法 ...
- 如果通过cookies和localStorage取值?
1. getCook : 设定setCookie值 let setCookie = setCookie('wan',data,7); function setCookie(c_name,value,e ...
- python--hmac
检测一下客户端是否合法,不依靠登录认证.这样即使知道服务端ip和端口,客户端也不能随便就连接服务端实现机制是在服务端中设置了密钥,借用了hmac os 两个模块 import socket impor ...