第一种方法,:操作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);
————————————————
版权声明:本文为CSDN博主「lanzhounoddles2011」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/working24hours/article/details/88323241
网友评论