外界中斷/事件控制器(External interrupt/event controller EXTI)
它是由24個邊緣檢知器組成(edge detectors for generating event/interrupt requests),有三種觸發模式:上升緣、下降緣、或只要上升緣下降緣任一種,可以產生24個中斷請求 ( Cat.1 和 Cat.2 器件只有23個) ,硬體架構如下圖:
GPIO當中斷源使用時,屬於外界中斷,共佔用了7個向量資源,如上表中粉紅色框框所示,標示為: EXTI0,EXTI1,EXTI2,EXTI3,EXTI4 ,EXTI9_5,EXTI15_10共7個。其中GPIO5~GPIO9共用同一個中斷,GPIO10~GPIO15共用同一個中斷,其硬體架構如下圖所示:
EXTI16~EXTI23的配置如下:
• EXTI line 16 連接 PVD 輸出
• EXTI line 17 連接 RTC Alarm 事件
• EXTI line 18 連接USB Device FS wakeup事件
• EXTI line 19 連接 RTC Tamper and TimeStamp 事件
• EXTI line 20 連接 RTC Wakeup 事件
• EXTI line 21 連接 Comparator 1 wakeup 事件
• EXTI line 22 連接Comparator 2 wakeup 事件
• EXTI line 23 連接 channel acquisition 中斷
和以上外界中斷相關的暫存器(EXTI registers)如下:
由以上的MAP圖表,可知GPIO5~9,GPIO10~15各共用一個中斷,可由暫存器的4個BIT以決定是那一個GPIO PORT使用該PIN用來做中斷源,以避免混淆。
中斷服務流程
當EXTI
產生外部中斷事件,主程式會中斷執行,先去執行中斷服務函式,完成中斷服務函式後,再回主程式繼續執行。以EXTI15_10為例說明:
1.
EXTI15_10_IRQHandler函式為外部中斷10~15號線的中斷服務函式,當外部中斷10~15號線產生外部中斷時會呼叫EXTI15_10_IRQHandler函式,中斷當前執行的程式,處理器開始執行中斷服務函式內的程式,執行完之後繼續執行中斷前的程式。
3. 實際上,EXTI15_10_IRQHandler函式是在stm32l1xx_it.c的程式中定義,並呼叫了HAL_GPIO_EXTI_IRQHandler(GPIO_PIN)。
4.
HAL_GPIO_EXTI_IRQHandler( )是在stm32l1xx_hal_gpio.c中定義。該函式判斷外部中斷是由哪一號外部中斷線產生的,並且清除中斷掛起暫存器中的對應位,然後呼叫外部中斷回撥函式HAL_GPIO_EXTI_Callback(),並將產生外部中斷的中斷線(GPIO_PIN)作為引數傳遞給外部中斷回撥函式HAL_GPIO_EXTI_Callback()。
5. 而上面的所有工作都由STM32CubeMX幫我們做好了,我們只需要在main.c檔案中重定義 HAL_GPIO_EXTI_Callback()函式就行了。
6. 因為所有外部中斷都會呼叫HAL_GPIO_EXTI_Callback()函式,所以我們需要在 HAL_GPIO_EXTI_Callback()函式內部根據輸入的GPIO_PIN引數判斷是哪一號外部中斷線 產生了外部中斷,然後根據不同的外部中斷執行不同的程式碼。
7. 因此我們使用語句
if(
GPIO_PIN == GPIO_PIN_No)
的方式判斷該外部中斷是否是由外部中斷GPIO_PIN_No號線產生的,然後執行後面程式碼。
註:中斷優先順序(不僅限於外部中斷), 可以在STM32CubeMX中的NVIC Configuration中設定。
沒有留言:
張貼留言