在许多应用中,可能都需要暂时禁止所有中断以执行一些时序关键的任务,此时可以使用PRIMASK寄存器。PRIMASK寄存器只能在特权状态访问。PRIMASK 用于禁止除NMI和 HardFault 外的所有异常它实际上是将当前优先级改为0(最高的可编程等级)。如用 C编程可以使用CMSIS-Core 提供的函数来设置和清除PRIMASK:
void enable irq(); //清除PRIMASK
void disable irq(); //设置PRIMASK
void set PRIMASK(uint32 tpriMask);//设置PRIMASK为特定值
uint32t get PRIMASK(void);//读取PRIMASK的数值
对于汇编编程可以利用CPS(修改处理器状态)指令修改PRIMASK寄存器的数值
CPSIEI;清除PRIMASK(使能中断)
CPSIDI;设置PRIMASK(禁止中断)
PRIMASK寄存器还可通过MRS和MSR指令访问。例如;
MOVSRO,#1
MSR PRIMASK,RO;将1写人PRIMASK禁止所有中断
以及
MOVSRO,#0
MSR PRIMASK,RO;将0写人PRIMASK以使能中断
当PRIMASK 置位时,所有的错误事件都会触发 HardFault 异常,而不论相应的可配置错误异常(如MemManage、总线错误和使用错误)是否使能。
从行为来说,FAULTMASK 和 PRIMASK 很类似,只是它实际上会将当前优先级修改为-1,这样甚至是 HardFault处理也会被屏蔽。当FAULTMASK 置位时,只有NMI异常处理才能执行。
从用法来说FAULTMASK 用于将配置的错误处理如MemManage 总线错误和使用错误)的优先级提升到-1,这样这些处理就可以使用 HardFault 的一些特殊特性。其中包括:
1、旁路MPU
2、忽略用于设备/存储器探测的数据总线错误将当前优先级提升到-1后,FAULTMASK 可在可配置的错误处理执行期间,止其他异常或中断处理的执行。
FAULTMASK寄存器只能在特权状态访问,不过不能在 NMI和HardFault处理中设置。若在C编程中使用符合 CMSIS 的设备驱动则可以使用下面的CMSIS-Core 函数来设置和清除FAULTMASK:
void enable fault irq(void); //清除 FAULTMASK
void disable fault irq(void); //设置FAULTMASK 以禁止中断
void set FAULTMASK(uint32 t faultMask);
uint32 t_get FAULTMASK(void);
对于汇编语言用户,可以利用CPS 指令修改 FAULTMASK 的当前状态:
CPSIE F;清除 FAULTMASK
CPSID F;设置FAULTMASK
还可以利用MRS和MSR指令访问FAULTMASK寄存器
MOVS RO,#1
MSR FAULTMASK,RO;将1写FAULTMASK禁止所有中断
以及:
MOVS RO,#0
MSR FAULTMASK,RO;将0写FAULTMASK使能中断
FAULTMASK会在退出异常处理时被自动清除,从NMI处理中退出时除外。由于这个特点FAULTMASK 就有了一个很有趣的用法:若要在低优先级的异常处理中触发一个高优先级的异常(NMI 除外),但想在低优先级处理完成后再进行高优先级的处理,可以:
。设置FAULTMASK禁止所有中断和异常(NMI异常除外)
。设置高优先级中断或异常的挂起状态
。退出处理
由于在 FAULTMASK 置位时,挂起的高优先级异常处理无法执行,高优先级的异常就会在 FAULTMASK 被清除前继续保持挂起状态,低优先级处理完成后才会将其清除。因此,可以强制让高优先级处理在低优先级处理结束后开始执行。
在main函数初始化外设和参数时,取消使能中断,保证不出错误。