STM32关全局中断开全局中断多种方式

STM32关全局中断和开全局中断有多种方法,分别操作PRIMASK、FAULTMASK和BASEPRI寄存器。

注:完整资料请查看Cortex-M3权威指南中的NVIC与中断控制一节。

中断相关寄存器(注:以下表格为安富莱STM32 FreeRTOS里文档的)
寄存器名字 寄存器功能描述
primask 这是个只有 1 个 bit 的寄存器。 在它被置 1 后,就关掉所有可屏蔽的异常,只剩下NMI 和硬 fault 可以响应。它的缺省值是 0,表示没有关中断。
faultmask 这是个只有 1 个 bit 的寄存器。当它置 1 时,只有 NMI 才能响应,所有其它的异常,甚至是硬 fault,也通通闭嘴。它的缺省值也是 0,表示没有关异常。
basepri 这个寄存器最多有 9 位(由表达优先级的位数决定)。它定义了被屏蔽优先级的阈值。当它被设成某个值后,所有优先级号大于等于此值的中断都被关(优先级号越大,优先级越低)。但若被设成 0,则不关闭任何中断, 0 也是缺省值

第一种方法,:操作PRIMASK寄存器

__set_PRIMASK(0)  /*  使能全局中断 */

__set_PRIMASK(1)  /* 禁止全局中断*/

或者

__enable_irq();    /*  使能全局中断 */

__disable_irq();  /* 禁止全局中断*/

(在core_cm3.h和core_cmFunc.h)

该函数操作的是PRIMASK寄存器,PRIMASK 用于除能在 NMI 和硬 fault 之外的所有异常,它有效地把当前优先级改为 0 (可编程优先级中的最高优先级)。该寄存器可以通过 MRS 和 MSR 以下例方式访问

1. 关中断
MOV R0, #1
MSR PRIMASK, R0
2. 开中断
MOV R0, #0
MSR PRIMASK, R0  

第二种方法:操作FAULTMASK寄存器

__set_FAULTMASK(0); /* 使能全局中断*/

__set_FAULTMASK(1)  /* 禁止全局中断*/

该函数操作FAULTMASK寄存器,FAULTMASK更绝,它把当前优先级改为‐1。这么一来,连硬fault都被掩蔽了。使用方案
与PRIMASK的相似。但要注意的是, FAULTMASK会在异常退出时自动清零。

第三种方法:操作BASEPRI寄存器

__STATIC_INLINE void __set_BASEPRI(uint32_t basePri)

该函数操作的是BASEPRI寄存器,在更精巧的设计中,需要对中断掩蔽进行更细腻的控制——只掩蔽优先级低于某一阈值的中断——它们的优先级在数字上大于等于某个数。那么这个数存储在哪里?就存储在BASEPRI中。不过,如果往BASEPRI中写0,则另当别论——BASEPRI将停止掩蔽任何中断。例如,如果你需要掩蔽所有优先级不高于0x60的中断,则可以如下编程:

__set_BASEPRI(0x60);

你可能感兴趣的:(STM32关全局中断开全局中断多种方式)