對於 STM32 講(
還是以Timer2例),外部中斷通道位置 28(35 號優先級)是給外部設備 TIME2 的,但 TIME2本身能夠引起中斷的中斷源或事件有好多個,比如更新事件(上溢/下溢) 、輸入捕獲、輸出匹配、DMA 申請等。所有TIME2 的中斷事件都是通過一個 TIME2 的中斷通道向 STM32 內核提出中斷申請,那么 STM32 中如何處理和控制 TIME2 和它眾多的、不同的、中斷申請呢?
1.因為cortex_m3 內核對於每一個外部中斷通道都有相應的控制字和控制位,用於單獨的和總的控制該中斷通道。它們包括有:
- 中斷優先級控制字:PRI_n(前面有提到過)
- 中斷允許設置位:在 ISER 寄存器中
- 中斷允許清除位:在 ICER 寄存器中
- 中斷懸掛 Pending(排隊等待)位置位:在 ISPR 寄存器中(類似於置中斷通道標志位)
- 中斷懸掛 Pending(排隊等待)位清除:在 ICPR 寄存器中(用於清除中斷通道標志位)
- 正在被服務(活動)的中斷(Active)標志位:在 IABR 寄存器中, (只讀,可以知道當前內核正在處理哪個中斷通道)
2.作為外圍設備 TIME2 本身也包括更具體的,管理自己不同中斷的中斷控制器(位) ,它們主要是自身各個不同類型中斷的允許控制位, 和各自相應的中斷標志位 (STM32 的手冊中有詳細的說明) 。
理解上面兩點之后,我們可以全程、全面和綜合的來了解 TIME2 的中斷過程,以及如何控制的。
①初始化過程
- 首先要設置寄存器 AIRC 中 PRIGROUP 的值, 規定系統中的搶先優先級和子優先級的個數(在 4 個 bits 中占用的位數) ;
- 設置 TIME2 本身的寄存器,允許相應的中斷,如允許 UIE(TIME2_DIER 的第[0]位)
- 設置 TIME2 中斷通道的搶先優先級和子優先級(IP[28],在 NVIC 寄存器組中)
- 設置允許 TIME2 中斷通道。在 NVIC 寄存器組的 ISER 寄存器中的一位。
②中斷響應過程
- 當 TIME2 的 UIE 條件成立(更新,上溢或下溢) ,硬件將 TIME2 本身寄存器中 UIE 中斷標志置位,然后通過 TIME2 中斷通道向內核申請中斷服務。
- 此時內核硬件將 TIME2 中斷通道的 Pending 標志置位(相當與中斷通道標志置位) ,表示 TIME2 有中斷申請。
- 如果當前有中斷在處理,TIME2 的中斷級別不夠高,那么就保持 Pending 標志,當然用戶可以在軟件中通過寫 ICPR 寄存器中相應的位把本次中斷清除掉。
- 當內核有空,開始響應 TIME2 的中斷,進入 TIME2 的中斷服務。此時硬件將 IABR 寄存器中相應的標志位置位, 表示 TIME2 中斷正在被處理。 同時硬件清除 TIME2 的 Pending 標志位。
③ 執行 TIME2 的中斷服務程序
- 所有 TIME2 的中斷事件, 都是在一個 TIME2 中斷服務程序中完成的, 所以進入中斷程序后, 中斷程序需要首先判斷是哪個 TIME2 的具體事件的中斷, 然后轉移到相應的服務代碼段去。
- 注意不要忘了把該具體中斷事件的中斷標志位清除掉, 硬件是不會自動清除 TIME2 寄存器中具體的中斷標志位的。
- 如果 TIME2 本身的中斷事件多於 2 個, 那么它們服務的先后次序就由用戶編寫的中斷服務決定了。換句話說,對於 TIME2 本身的多個中斷的優先級,系統是不能設置的。所以用戶在編寫服務程序時,應該根據實際的情況和要求,通過軟件的方式,將重要的中斷優先處理掉。
- 當然你也可以每次中斷服務只處理其中的一個,然后再次進入中斷,處理下一個。
④中斷返回內核執行完中斷服務后,便進入中斷返回過程,在這個過程中需要:
- 硬件將 IABR 寄存器中相應的標志位清另,表示該中斷處理完成如果 TIME2 本身還有中斷標志位置位,表示 TIME2 還有中斷在申請,則重新將 TIME2的 Pending 標志置為 1,等待再次進入 TIME2 的中斷服務。
- 以上中斷過程在《ARM Cortex-M3 權威指南》中有詳細描述,並配合時序圖說明,可以參考。
- 然后,就可以在 ST 提供的函數庫的幫助下,正確的設置和使用 STM32 的中斷系統了。