- PRIMASK 和FAULTMASK寄存器
在很多应用中需要暂时屏蔽所有的中断进行一些对时序要求较高的任务,不然容易发生bug,例如I2C通讯。此时可以使用PRIMASK寄存器。PRIMASK可以屏蔽除NMI和HardFalut外的所有异常和中断。修改PRIMASK寄存器的值的方法有两种
汇编使用CPS指令修改PRIMASK
CPSIE I; //清除PRIMASK(使能中断)
CPSID I; //设置PRIMASK(禁止中断)
或者 通过MRS和MSR指令访问
MOVS R0,#1
MSR PRIMASK, R0;//将1写入PRIMASK禁止所有中断
MOVS R0,#0
MSR PRIMASK, R0;//将0写入PRIMASK使能中断
不懂这两种指令直接照代码使用即可,FAULTMASK与PRIMASK的区别是FAULTMASK可以把HardFalut也屏蔽掉。修改寄存器的方法与PRIMASK一致。
CPSIE F; //清除FAULTMASK(使能中断)
CPSID F; //设置FAULTMASK(禁止中断)
或
MOVS R0,#1
MSR FAULTMASK, R0;//将1写入FAULTMASK禁止所有中断
MOVS R0,#0
MSR FAULTMASK, R0;//将0写入FAULTMASK使能中断
- BASEPRI寄存器
PRIMASK 和FAULTMASK寄存器的屏蔽方法比较粗暴,有些场合需要细致的对中断进行屏蔽,当我们需要屏蔽优先级低于某一阈值的中断我们可以往 BASEPRI中写入该阈值例如要屏蔽优先级不高于0X40的中断(注意 stm32是高四位控制优先级,低四位默认为0)
MOVS R0,#0X40
MSR BASEPRI,R0;
在FreeRTOS中开关中断就是通过 BASEPRI寄存器实现的。
**补充:**NMI指不可屏蔽中断,当系统发生致命故障时,使用NMI。当发生NMI的因素时,不接受任何其他中断,启动紧急情况中断处理程序,并运行紧急情况处理程序软件。HardFalut指硬件故障带来的异常中断。