今天把之前自己的一些在中斷方面所產生的疑惑把具體的解決辦法給大家分享一下,希望能夠幫到大家。
STM32在使用時有時需要禁用全局中斷,比如MCU在升級過程中需禁用外部中斷,防止升級過程中外部中斷觸發導致升級失敗。
ARM MDK中提供了如下兩個接口來禁用和開啟總中斷:
__disable_irq(); // 關閉總中斷
__enable_irq(); // 開啟總中斷 但測試發現這樣一個問題,在關閉總中斷后,如果有中斷觸發,雖然此時不會引發中斷,但在調用__enable_irq()開啟總中斷后,MCU會立即處理之前觸發的中斷。
這說明__disable_irq()只是禁止CPU去響應中斷,沒有真正的去屏蔽中斷的觸發,中斷發生后,相應的寄存器會將中斷標志置位,在__enable_irq()開啟中斷后,由於相應的中斷標志沒有清空,因而還會觸發中斷。
所以要想禁止所有中斷,必須對逐個模塊的中斷進行 Disable操作,由於每個模塊中斷源有很多,對逐個中斷Disable的話比較復雜,較為簡單的方法是通過 XXX_ClearITPendingBit()清除中斷標志或者直接通過XXX_DeInit()來清除寄存器的狀態。這樣在 __enable_irq()開啟總中斷后,MCU就不會響應之前觸發的中斷了。
最后也提供一些中斷這方面的資料供學習參考用