Cortex-M3 异常和中断

2020-03-27 19:05

0.前言

本文想解决的问题有:

? ? ? ? ? ?

如何开启、关闭中断 如何开启、关闭异常

LPC177x/8x支持的中断优先级个数 复位后,异常/中断默认的优先级 如何设置异常/中断的优先级

什么是优先级组,如何设置优先级组,复位后的优先级组

1. Cortex-M3的异常/中断屏蔽寄存器组

注:只有在特权级下,才允许访问这3个寄存器。

名 字 PRIMASK FAULTMASK BASEPRI 功能描述 只有单一比特的寄存器。置为1后,就关掉所有可屏蔽异常,只剩下NMI和硬Fault可以响应。默认值是0,表示没有关闭中断。 只有单一比特的寄存器。置为1后,只有NMI可以响应。默认值为0,表示没有关异常。 该寄存器最多有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(\); 11: __regPriMask = (priMask); 12: }

使用__set_PRIMASK(1)关闭中断;__setPRIMASK(0)开启中断。

一些说明:__INLINE是宏定义,对应__inline,这是keil编译器自定义关键字,表示这个函数是内联函数,但并不是强制性内联,编译器最终决定是否内联。

__ASM(“primask”): __ASM也是一个宏,对应__asm,这是keil编译器自定义关键字,关于这个关键字,有相当多的用法,可以在C中内嵌汇编语言、内嵌汇编函数、指定汇编标号以及本代码中的声明一个已命名寄存器变量。这里,已命名的寄存器是(\),也就是说寄存器变量__regPriMask等同于编译器已命名的primask。语法为:

register type var-name __asm(reg);

keil编译器已命名的寄存器变量为:

寄存器 __asm修饰的字符串 \apsr\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 处理器 APSR CPSR BASEPRI BASEPRI_MAX CONTROL DSP EAPSR EPSR FAULTMASK IAPSR \ \ \ \ \ \ \ \ \ IEPSR IPSR MSP PRIMASK PSP PSR r0 to r12 r14 or lr r13 or sp r15 or pc SPSR XPSR 1: /** \ \ \ \ \ \ \ to \ \ or \ \ or \ \ or \ \ \ 1.2 开/关异常 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 All processors All processors All processors, apart from Cortex-M series processors. Cortex-M0, Cortex-M1, Cortex-M3, Cortex-M4 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(\); 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(\); 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 1 2 3 4 5 6 7~10 11 12 13 14 15 N/A 复位 NMI 硬Fault 存储器管理Fault 总线Fault 用法Fault 保留 SVCall 调试监视器 保留 PendSV SysTick 类型 N/A -3(最高) -2 -1 可编程 可编程 可编程 保留 可编程 可编程 保留 可编程 可编程 优先级 无 复位 不可屏蔽中断(来自外部NMI输入脚) 只要FAULTMASK没有置位,硬Fault服务例程会被强制执行 MPU访问违例以及访问非法位置均可引发。企图在“非执行区”取址也会引发此Fault。 总线收到了错误响应,原因可以使预取流产或数据流产,企图访问协处理器也会引发此Fault 由于程序错误导致的异常。通常是使用了一条无效指令,或者是非法的状态转换,例如尝试切换到ARM状态 保留 执行系统服务调用指令(SVC)引发的异常 调试器(断点、数据观察点,或者是外部调试请求) 保留 为系统设备而设的“可挂起请求” 系统节拍时钟定时器(SysTick) 简介 表2-2:外设中断

编号 16 17 ... 255 IRQ #0 IRQ #1 ... 类型 优先级 可编程 可编程 可编程 可编程 外设中断#0 外设中断#1 ... 外设中断#239 简介 IRQ #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] [23:16] [15:8] [7:0] 名称 PRI_7 PRI_6 PRI_5 PRI_4 保留 系统处理程序6的优先级,用法Fault 系统处理程序5的优先级,总线Fault 系统处理程序4的优先级,存储器管理Fault 功能 表2-3:SHPR2寄存器的位分配

位 名称 功能


Cortex-M3 异常和中断.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:人教版七年级数学下册期末考试题(1)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: