簡體   English   中英

STM32L011:無法在中斷處理程序中清除中斷標志

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM