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