工程师在开发程序时,时序要求比较高时不能有中断来打断程序的执行,这就需要把所有中断全部关闭掉。有些工程师反应不清楚如何来关闭全局中断。大家知道华大单片机使用的是ARM内核,全局中断在ARM内核中已经有相关的定义,具体说明如下图
更多信息咨询请联系angel.qi:13827489351(微信与手机号码同步)
PRIMASK是1bit寄存器,复位时设置为0。设置为0时,允许中断和系统异常。设置为1时,仅允许NMI和HardFault异常。实际上,当设置为1时,它将当前优先级更改为0(最高可编程级别),相当于屏蔽掉了其它的中断,也就关闭全局中断。我们可以使用多种方式来操作这个寄存器。
在汇编语言中,可以使用MSR指令设置或清除PRIMASK寄存器。例如,可以使用以下代码设置PRIMASK(禁用中断):MOVS R0, #1 ; 需要写入PRIMASK的值放入通用寄存器R0 MSR PRIMASK, R0 ; 把R0的值写入PRIMASK
通过将R0值更改为0,可以以相同的方式启用中断。或者,可以使用CPI伪指令设置或清除PRIMASK:CPSIE i ; 清除 PRIMASK (开启全局中断)CPSID i ; 设置 PRIMASK (关闭全局中断)
在C语言中,符合CMSIS的设备驱动程序的用户可以使用以下函数设置并清除PRIMASK。即使不使用CMSIS,大多数C编译器都支持ARM。处理器将这两个函数作为内在函数自动处理:void __enable_irq(void); // 清除 PRIMASK (开启全局中断)void __disable_irq(void); // 设置 PRIMASK (关闭全局中断) |