在STM32上禁用IRQ

问题描述 投票:1回答:2

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

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

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

谢谢你的帮助,

问候

c arm interrupt stm32 cortex-m3
2个回答
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
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.