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的版 ...
随机推荐
- Elasticsearch之index_closed_exception
索引的打开与关闭 关闭索引 POST /index_name/_close 尝试插入数据 PUT /shakespeare/_doc/ { "title":"kibana ...
- LUOGU P2408 不同子串个数(后缀数组)
传送门 解题思路 后缀数组求本质不同串的裸题.\(ans=\dfrac{n(n+1)}{2} -\sum height[i]\). 代码 #include<iostream> #inclu ...
- jmeter测试之-脚本制作
一.脚本录制 1.遇见的问题,回放的时候总是登录失败 解决方式:设置HTTP请求为—跟随重定向 2.新增一个用户的时候,脚本参数里面输入汉字,在浏览器查看的时候显示问号 解决方式:脚本编码方式增加u ...
- Android 读取<meta-data>元素的数据
在AndroidManifest.xml中,<meta-data>元素可以作为子元素,被包含在<activity>.<application> .<servi ...
- 牛客网暑期ACM多校训练营(第五场) Agpa (最大化平均值)
题目大意: 给定 n 门课以及它们的学分和绩点,定义总绩点是所有课的加权平均数,给定一个数 k, 你可以删除最多 k 门课,求你的总绩点最大能到多少 分析: 上面是牛客的官方题解,其实就是移项, 然后 ...
- Spellchecker inspection helps locate typos and misspelling in your code, comments and literals, and fix them in one click
Pycharm设置 Pycharm总是很多的拼写检查波拉线 Spellchecker inspection helps locate typos and misspelling in your cod ...
- 9. DMA
9.1 介绍 Direct memory access(DMA) 直接存储器访问. 这两个DMA控制器总共有16个流(每个控制器8个),每个流用于管理来自一个或多个外围设备的内存访问请求.每个流总共可 ...
- node 创建静态web服务器(上)
声明:本文仅用来做学习记录. 本文将使用node创建一个简单的静态web服务器. 准备工作: 首先,准备好一个类似图片中这样的页面 第一步: 创建 http 服务: const http = requ ...
- 剑指offer——74求1+2+3+n
题目描述 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 题解: 利用类的构造和析构 //利用类的构 ...
- Lambda表达式演变历史
/// <summary> /// 爬虫委托 /// </summary> /// <param name="crawlerCode">爬虫编码 ...