Cortex-M3 异常和中断---基于NXP LPC177x/8x
 
- UID
- 1029342
- 性别
- 男
|

Cortex-M3 异常和中断---基于NXP LPC177x/8x
0.前言本文想解决的问题有:
- 如何开启、关闭中断
- 如何开启、关闭异常
- LPC177x/8x支持的中断优先级个数
- 复位后,异常/中断默认的优先级
- 如何设置异常/中断的优先级
- 什么是优先级组,如何设置优先级组,复位后的优先级组
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); |
|
|
|
|
|