[英]STM32L011: Interrupt flag cannot be cleared in Interrupt Handler
使用 LPTIM1 中斷處理程序,我的代碼設置為在進入處理程序后立即清除中斷標志,但在調試期間“中斷清除寄存器”(ICR)中的標志未設置為 0,因此程序直接跳轉到中斷處理程序由於在“中斷和狀態寄存器”(ISR)中設置的掛起中斷位而離開它之后
這是代碼:
extern "C" void LPTIM1_IRQHandler()
{
if(LPTIM1->ISR && LPTIM_ISR_ARRM){ //check if Interrupt flag is set
// __disable_irq();
LPTIM1->ICR |= LPTIM_ICR_ARRMCF; //reset Interrupt flag in the "Clear"-Register
flag_TimerInterrupt = true; //set flag for enabling next LED-cycle
}
我在互聯網搜索中沒有發現有關類似問題的提示。
STM32L0x1參考手冊中LPTIM ICR寄存器中ARRMCF位的描述說:
向該位寫入 1 會清除 LPT_ISR 寄存器中的 ARRM 標志。
ARRMCF 位本身——以及 ICR 寄存器中的所有其他位——是不可讀的,因此在讀取它們時不應期望獲得任何特定值。 事實上,您使用|=
代碼是可疑的,因為您隱式地告訴編譯器從該寄存器中讀取。 我認為您應該將其更改為使用正常分配。
此外,您使用了錯誤的 C 運算符來檢查是否設置了中斷標志。
另外,我不確定位宏是如何在您的環境中定義的,所以我會安全起見,不在我將要展示的代碼中使用它們。
將所有這些放在一起,我建議將您的代碼更改為:
extern "C" void LPTIM1_IRQHandler()
{
if (LPTIM1->ISR & (1 << 1))
{
// ARRM interrupt flag is set, so clear it.
LPTIM1->ICR = (1 << 1);
flag_TimerInterrupt = true;
}
}
此外,如果您使用的是調試器,則在調試器等待您的下一個操作時,計時器可能會每秒觸發此中斷數千次。 如果是這樣,您將永遠無法真正執行主循環代碼(任何中斷之外的代碼)。 您可能只需要在真實硬件上調試它,直到它工作。 您可以使用 GPIO 獲取有關程序狀態的信息,並在示波器上查看 GPIO 信號。 我沒有經常使用 STM32 調試器,所以也許可以在調試器等待您時凍結計時器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.