在上一篇中我簡單介紹了 STM32 的中斷,而中斷又分成很多種,由於我們的最終目標是需要讀取按鈕狀態,所以要使用的是外部中斷(External Interrupt,EXTI)功能。
在這一篇文章中,我將簡單介紹 STM32 的 EXTI。
基本上 STM32 大部分甚至所有的 GPIO 都可以分配爲 EXTI(即可當作 EXTI 使用),但實際上的 EXTI 線路(EXTI Line)數量並沒有像 GPIO 一樣多,所以有些 GPIO 們會共用一個 EXTI。
▲ EXTI 與 GPIO 的對應關係圖。取自 RM0390 Rev6 P.246。
上圖是 STM32F446xx 系列的 EXTI-GPIO 對應圖,可以看到 Port-A ~ Port-H 的 0
號腳都被分配並共用 EXTI0,所有 Port 的 1
號腳都被分配並共用 EXTI1,以此類推。
但是即便有 EXTI 線路分配,NVIC 的中斷向量也還是不夠分配所有的 EXTI 線路,因此有些 EXTI 也要共用一個中斷向量。通常是 EXTI5~9 會共用一個,而 EXTI10~15 再共用一個,EXTI0~4 則是各自分配一個自己獨立的 ISR。
▲ 中斷向量表。取自 RM0390 Rev6 P.240。
但是中斷向量共用的話要如何分辨現在觸發的到底是哪一個 EXTI 呢?
檔案是靠讀取 EXTI_PR (Pending Register) 暫存器。若此暫存器的對應位元爲 1
的話,代表有中斷請求發送。
例如 EXTI10~15 都會觸發相同的 ISR(因爲其中斷向量共用/相同,都是 0x0000 00E0
),但只要進入 EXTI10~15 的 ISR 後,再讀取 EXTI_PR 並查看第 10 到 15 位元哪個是 1
就知道實際被觸發的到底是 10~15 的哪一個了。
▲ EXTI_PR 暫存器。取自 RM0390 Rev6 P.249。
這次介紹了STM32 的 EXTI。一開始用 STM32 的 EXTI 時因爲分配與共用的關係,可能會有點搞混,但我想把 EXTI Line 的分配圖多一下應該就可以瞭解了。
下一篇文章將會正式介紹要如何寫程式。
本文同步發表於我的 Blog。