4. 异常屏蔽寄存器PRIMASK
有些对时间敏感的应用,需要在短时间内禁止响应所有的中断,对于这种应用,处理器不是直接使用中断使能、禁止控制寄存器来禁止所有中断再恢复,而是一个单独的特殊寄存器 - PRIMASK,通过它可以屏蔽掉除了NMI和HardFault异常的其他的所有的中断和系统异常。 PRIMASK寄存器只有1位有效,并且在复位后默认为0。该寄存器为0时,所有的中断和异常都处于允许状态,设置为1后,只有NMI和HardFault处于使能状态。 MOVS R0, #0x1 ; //中断#2
MSR PRIMASK , R0 ; //将R0的值送到PRIMASK
NVIC编程提示软件使用CPSIE i和CPSID i指令来启用和禁用中断。 CPSIE i ; //清除 PRIMASK(使能中断)
CPSID i ; //设置 PRIMASK(不响应中断)
CMSIS设备驱动库提供了C语言的实现函数,用户可以直接使用函数来设置和清除PRIMASK寄存器: void __disable_irq(void) //不响应中断
void __enable_irq(void) //启用中断
在对时间敏感的程序完成后,应该清除PRIMASK。要不然即使在中断处理中使用\_\_disable\_irq()函数,处理器将停止接受新的中断请求。主要原因是PRIMASK寄存器和Xpsr是相互独立的,因此异常返回不会影响中断屏蔽状态。
|