【问题标题】:Disable IRQ on STM32在 STM32 上禁用 IRQ
【发布时间】:2018-08-14 13:45:10
【问题描述】:

有什么方法可以禁用 Cortex M3 MCU 的所有 irq,除了一个?

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

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

感谢您的帮助,

问候

【问题讨论】:

    标签: c arm interrupt stm32 cortex-m3


    【解决方案1】:

    使用BASEPRI 寄存器禁用低于指定优先级的所有中断。

    这是一个核心寄存器,在Cortex-M3 Programming Manual 中有描述。

    CMSIS 提供__get_BASEPRI()__set_BASEPRI() 函数来操纵其值。

    注意使用位 7-4,优先级值必须左移 4。要禁用所有优先级为 1 或更低的中断,请使用

    __set_BASEPRI(1 << 4);
    

    要全部启用,请将其设置为 0

    __set_BASEPRI(0);
    

    您当然应该相应地设置中断优先级,确保没有其他中断具有优先级 0。

    【讨论】:

    • 仅供参考:当 cpu 为 CM4 时,您不会移位 4。
    • @FelipeLavratti ST 在其 Cortex-M4 MCU(F3、F4、L3)上仅实现位 7-4,即 16 个优先级。其他制造商可能会采取不同的做法。
    • 我的朋友,不是真的。这是 ARM 实现,而不是制造商。并且 CM4 规范说这些位是 0-7 而不是 CM4 上的 4-7。 infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0553a/…
    • 问题是关于STM32的,ST手册说只实现了7-4位。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-11
      • 1970-01-01
      • 2021-10-23
      • 2012-02-16
      • 1970-01-01
      相关资源
      最近更新 更多