有没有办法禁用Cortex M3 MCU中的所有irq,除了一个?
我的问题是我有一个系统运行几种具有不同优先级的irq,我想要禁用除特定状态下的所有irq之外的所有irq。
我知道我可以通过使用“__disable_irq()”指令来禁用所有irq,但如果我之前没有调用“__enable_irq()”,则在调用此指令后我无法启用一个irq。
感谢您的帮助,
此致
答案 0 :(得分:6)
使用BASEPRI
寄存器禁用低于指定优先级的所有中断。
这是核心寄存器,在Cortex-M3 Programming Manual中描述。
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内。没有办法告诉它只启用特定的中断。