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微控制器中,全局中断(Global Interrupt)是一种机制,用于控制和管理所有中断的使能和优先级。全局中断的使能状态决定了是否允许中断请求触发对应的中断服务程序(Interrupt Service Routine,简称ISR)的执行。 通常情况下,全局中断的使能是通过设置处理器的特殊寄存器来控制的。在STM32微控制器中,常用的是`PRIMASK`寄存器和`BASEPRI`寄存器。 - `PRIMASK`寄存器是一个单位位(bit)寄存器,用于控制处理器是否响应可屏蔽中断。当`PRIMASK`寄存器的值为0时,处理器将响应可屏蔽中断,即全局中断使能;当`PRIMASK`寄存器的值为1时,处理器将不响应可屏蔽中断,即全局中断禁止。 - `BASEPRI`寄存器是一个多位寄存器,用于设置系统的基础优先级。在基础优先级的设置中,低于或等于该基础优先级的中断请求将被屏蔽,而高于该基础优先级的中断请求将继续被响应。通过设置`BASEPRI`寄存器可以实现对低优先级中断的屏蔽,而对高优先级中断的响应。 在使用STM32中断机制时,我们通常会根据需要对全局中断进行使能或禁止。启用全局中断时,我们确保中断请求可以被接受并触发相应的ISR执行;禁用全局中断时,我们可以防止中断请求的响应,以防止在某些特定情况下发生不希望的中断干预。 以下是启用和禁用全局中断的示例代码: ```c #include "stm32f4xx.h" int main(void) { // 启用全局中断 __enable_irq(); // 禁用全局中断 __disable_irq(); while (1) { // 主循环 } } ``` 在上述示例中,`__enable_irq()`函数用于启用全局中断,而`__disable_irq()`函数用于禁用全局中断。在主循环中,可以根据需要选择是否启用或禁用全局中断。 请注意,在编写实际的STM32应用程序时,需要根据具体的微控制器型号和发环境来使用相应的头文件和函数。以上示例代码仅供参考。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值