在STM32上禁用IRQ

5
有没有办法在Cortex M3 MCU上禁用除一个之外的所有中断请求(irq)?
我的问题是,我有一个系统运行多种优先级的中断请求,并且我想在特定状态下禁用除一个之外的所有中断请求。
我知道可以使用“__disable_irq()”指令来禁用所有中断请求,但如果在调用此指令之前没有调用“__enable_irq()”,则无法启用一个中断请求。
谢谢您的帮助,
祝好。
2个回答

9
使用BASEPRI寄存器来禁用低于指定优先级级别的所有中断。
这是一个核心寄存器,在Cortex-M3编程手册中有描述。

enter image description here

CMSIS提供__get_BASEPRI()__set_BASEPRI()函数以操纵其值。
请注意,使用位7-4,优先级值必须左移4位。要禁用所有优先级为1或更低的中断,请使用
__set_BASEPRI(1 << 4);

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

__set_BASEPRI(0);

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


请注意:当 CPU 为 CM4 时,不要进行 4 位移操作。 - Felipe Lavratti
1
@FelipeLavratti ST在其Cortex-M4 MCUs(F3,F4,L3)上仅实现位7-4,即16个优先级级别。其他制造商可能会有所不同。 - followed Monica to Codidact
我的朋友,不是这样的。这是ARM实现,而不是制造商。而且CM4规范表明,位是0-7,而不是CM4上的4-7。http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0553a/CHDBIBGJ.html - Felipe Lavratti
4
这个问题涉及到STM32,而ST手册中说只有7-4位被实现。 - followed Monica to Codidact

3

除非禁用所有您不想要的已启用中断,否则没有其他方法。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接