在STM32上禁用IRQ

时间:2018-03-06 16:08:01

标签: c arm interrupt stm32 cortex-m3

有没有办法禁用Cortex M3 MCU中的所有irq,除了一个?

我的问题是我有一个系统运行几种具有不同优先级的irq,我想要禁用除特定状态下的所有irq之外的所有irq。

我知道我可以通过使用“__disable_irq()”指令来禁用所有irq,但如果我之前没有调用“__enable_irq()”,则在调用此指令后我无法启用一个irq。

感谢您的帮助,

此致

2 个答案:

答案 0 :(得分:6)

使用BASEPRI寄存器禁用低于指定优先级的所有中断。

这是核心寄存器,在Cortex-M3 Programming Manual中描述。

enter image description here

CMSIS提供__get_BASEPRI()__set_BASEPRI()函数来操纵其值。

请注意,使用位7-4,优先级值必须向左移动4.要禁用优先级为1或更低的所有中断,请使用

__set_BASEPRI(1 << 4);

并启用all,将其设置为0

__set_BASEPRI(0);

当然,您应该相应地设置中断优先级,确保没有其他中断具有优先级0。

答案 1 :(得分:1)

除了禁用所有你不想要的启用中断之外,没有。

__disable_irq()实现为CPSID I,关闭所有可以设置优先级的异常(在NVIC中配置的异常),它通过更改PRIMASK寄存器(设置)实现此目的位0)在CPU内。没有办法告诉它只启用特定的中断。