函数NVIC_EnableIRQ和NVIC_DisableIRQ用于在给定的IRQ编号上启用和禁用中断。为什么没有函数来获取该IRQ的当前启用/禁用状态?为什么CMSIS不提供读取IRQ启用/禁用状态的功能?
用例是在继续之前需要禁用模块中断(IRQ)的典型功能。功能完成后,它将再次启用IRQ。但要确定需要先读取在调用函数时是否启用了IRQ。
鉴于该功能不是由CMSIS提供的,那么我假设我的上面的用例有点不对。但我不知道如何。
任何提示?
感谢
(CMSIS使用4.1)
函数NVIC_EnableIRQ和NVIC_DisableIRQ用于在给定的IRQ编号上启用和禁用中断。为什么没有函数来获取该IRQ的当前启用/禁用状态?为什么CMSIS不提供读取IRQ启用/禁用状态的功能?
用例是在继续之前需要禁用模块中断(IRQ)的典型功能。功能完成后,它将再次启用IRQ。但要确定需要先读取在调用函数时是否启用了IRQ。
鉴于该功能不是由CMSIS提供的,那么我假设我的上面的用例有点不对。但我不知道如何。
任何提示?
感谢
(CMSIS使用4.1)
我觉得你的使用情况可能是有意义的一些情况。
您必须创建函数来自己读取IRQ的启用状态。
您只需确保在读取启用状态和实际禁用之间没有中断更改启用状态。在这种情况下,您最终会在执行功能后设置错误的启用状态。
您可以使用__disable_irq();
在全球范围内禁止所有IRQ(凯尔语法):
bool isEnabled;
__disable_irq();
isEnabled = ReadIrqEnabledState(irqNr);
__enable_irq();
yourFunction();
if(isEnabled)
NVIC_EnableIrq(irqNr);
else
NVIC_DisableIrq(irqNr);
您可以使用此功能。它工作正常...
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))));
}