STM32管理全局中断的三种方式

文章目录

  • 1.使用PRIMASK寄存器屏蔽中断
  • 2.使用FAULTMASK寄存器屏蔽中断
  • 3.使用BASEPRI寄存器屏蔽中断

1.使用PRIMASK寄存器屏蔽中断

用法:PRIMASK寄存器可以屏蔽除NMI和HardFault这两个中断外的所有异常和中断。
程序实现:
<1>使用汇编的时候,可以使用CPS(修改处理器状态)指令修改PRIMASK寄存器的数值:

	CPSIE I;    			//清除PRIMASK(使能中断)
	CPSID I;    			//设置PRIMASK(禁止中断)

<2>PRIMASK寄存器还可以通过MRS和MSR指令访问,如下:

	MOVS R0,	#1
	MSR PRIMASK,R0 ;	//将1写入PRIMASK禁止所有中断
以及:
	MOVS R0,	#0
	MSR PRIMASK,R0 ;	//将0写入PRIMASK以使能所有中断

2.使用FAULTMASK寄存器屏蔽中断

用法:FAULTMASK比PRIMASK更强,它会把当前异常的优先级提升到-1,这样就可以连HardFault都屏蔽掉。FAULTMASK的使用方法和PRIMASK类似,FAULTMASK会在退出时自动清零。
程序实现:
<1>使用汇编的时候,可以使用CPS(修改处理器状态)指令修改PRIMASK寄存器的数值:

	CPSIE F;    		//清除FAULTMASK(使能中断)
	CPSID F;    		//设置FAULTMASK(禁止中断)

<2>FAULTMASK寄存器还可以通过MRS和MSR指令访问,如下:

	MOVS R0,	#1
	MSR FAULTMASK,R0 ;	//将1写入FAULTMASK禁止所有中断
以及:
	MOVS R0, 	#0
	MSR FAULTMASK,R0 ;	//将0写入FAULTMASK以使能所有中断

3.使用BASEPRI寄存器屏蔽中断

用法:FAULTMASK和PRIMASK寄存器直接关闭除复位,NMI,HardFault以外的所有其他中断,但是在有些场合需要对中断屏蔽进行更细腻的控制,比如只屏蔽优先级低于某一阈值的中断。这个阈值优先级存储在寄存器BASEPRI中,向BASEPRI写0就会停止屏蔽中断。
比如,要屏蔽优先级不高于0x50的中断,则可以使用如下汇编指令:

	MOVS R0,	#0x50
	MSR BASEPRI,R0 

如果需要取消BASEPRI对中断的屏蔽,则可以使用如下代码:

	MOVS R0,	#0
	MSR BASEPRI,R0

你可能感兴趣的:(stm32,stm32,嵌入式,c语言)