有没有办法禁用Cortex M3 MCU中的所有irq,除了一个?
我的问题是我有一个系统运行几种具有不同优先级的irq,我想禁用所有irq,除了特定状态的irq。
我知道我可以通过使用“__disable_irq()”指令来禁用所有irq,但是如果我之前没有调用“__enable_irq()”,则在调用此指令后我无法启用一个irq。
谢谢你的帮助,
问候
使用BASEPRI
寄存器禁用低于指定优先级的所有中断。
这是一个核心寄存器,在Cortex-M3 Programming Manual中有描述。
CMSIS提供__get_BASEPRI()
和__set_BASEPRI()
函数来操纵它的值。
请注意,使用位7-4,优先级值必须向左移动4.要禁用优先级为1或更低的所有中断,请使用
__set_BASEPRI(1 << 4);
并启用all,将其设置为0
__set_BASEPRI(0);
您当然应该相应地设置中断优先级,确保没有其他中断优先级为0。
除了禁用所有你不想要的启用中断之外,没有。
__disable_irq()
实现为CPSID I
,它关闭所有可以设置优先级的异常(在NVIC中配置的异常),它通过更改CPU内的PRIMASK
寄存器(设置位0)来实现。没有办法告诉它只启用特定的中断。