有没有办法从Cortex M3单片机禁用除一个以外的所有irq?
我的问题是,我有一个系统运行几种具有不同优先级的irq,我想禁用所有irq,除了一个处于特定状态的irq。
我知道我可以通过"__disable_irq()“指令禁用所有的irq,但是如果我之前没有调用"__enable_irq()”,我就不能在调用这个指令后启用一个irq。
谢谢你的帮忙,
问候
发布于 2018-03-06 20:15:40
使用 BASEPRI
寄存器禁用低于指定优先级的所有中断。
这是一个核心寄存器,如Cortex-M3 Programming Manual所述。
CMSIS提供了__get_BASEPRI()
和__set_BASEPRI()
函数来操作它的值。
请注意,使用的是位7-4,优先级值必须左移4。
__set_BASEPRI(1 << 4);
要启用all,请将其设置为0
__set_BASEPRI(0);
当然,您应该相应地设置中断优先级,确保没有其他中断的优先级为0。
发布于 2018-03-06 16:18:33
除了禁用所有您不想要的已启用中断之外,否。
__disable_irq()
作为CPSID I
实现,它关闭所有可以设置优先级的异常(那些在NVIC中配置的异常),它通过更改PRIMASK
寄存器(设置位0)来实现这一点。没有办法告诉它只启用特定的中断。
https://stackoverflow.com/questions/49135275
复制