首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Cortex-M3 异常和中断---基于NXP LPC177x/8x

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);
继承事业,薪火相传
返回列表