函數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))));
}