函数 NVIC_EnableIRQ 和 NVIC_DisableIRQ 用于启用和禁用给定 IRQ 编号的中断。为什么没有函数可以获取该 IRQ 的当前启用/禁用状态?
该用例是需要在继续之前禁用模块中断 (IRQ) 的典型功能。该功能完成后,它将再次启用 IRQ。但要确保首先需要阅读在调用函数时是否启用了 IRQ。
鉴于 CMSIS 不提供该功能,那么我假设我上面的用例存在某种缺陷。但我不明白怎么做。
有什么提示吗?
谢谢
(使用 CMSIS 4.1)
函数 NVIC_EnableIRQ 和 NVIC_DisableIRQ 用于启用和禁用给定 IRQ 编号的中断。为什么没有函数可以获取该 IRQ 的当前启用/禁用状态?
该用例是需要在继续之前禁用模块中断 (IRQ) 的典型功能。该功能完成后,它将再次启用 IRQ。但要确保首先需要阅读在调用函数时是否启用了 IRQ。
鉴于 CMSIS 不提供该功能,那么我假设我上面的用例存在某种缺陷。但我不明白怎么做。
有什么提示吗?
谢谢
(使用 CMSIS 4.1)
您可以使用此功能。它工作正常...
inline bool IsIRQEnabled (IRQn_Type IRQn)
{
return (0 != (NVIC->ISER[(uint32_t)((int32_t)IRQn) >> 5] & (uint32_t)(1 << ((uint32_t)((int32_t)IRQn) & (uint32_t)0x1F))));
}
我认为您的用例在某些情况下可能有意义。
您必须自己创建函数来读取 IRQ 的启用状态。
您只需要确保在读取启用状态和实际禁用之间没有中断更改启用状态。在这种情况下,您最终会在执行函数后设置错误的启用状态。
您可以使用__disable_irq();
全局禁用所有 irq(Keil 语法):
bool isEnabled;
__disable_irq();
isEnabled = ReadIrqEnabledState(irqNr);
__enable_irq();
yourFunction();
if(isEnabled)
NVIC_EnableIrq(irqNr);
else
NVIC_DisableIrq(irqNr);