EXTI --外部中斷/事件控制器

一、EXTI簡介

EXTI(External interrupt/event controller) – 外部中斷/事件控制器,管理了控制器的20箇中斷/事件線。每個中斷/事件線都對應由一個邊沿檢測器,可以實現輸入信號的上升沿檢測或下降沿檢測。EXTI可以實現對每個中斷/事件線進行單獨配置,可以單獨配置爲中斷或者事件,以及觸發時間的屬性。

EXTI功能框圖

EXTI 的功能框圖包含了 EXTI 最核心內容,掌握了功能框圖,對 EXTI 就有一個整體
的把握,在編程時思路就非常清晰。 EXTI 功能框圖見圖 18-1。
在圖 18-1 可以看到很多在信號線上打一個斜槓並標註“20”字樣,這個表示在控制器內部類似的信號線路有 20 個,這與 EXTI 總共有 20 箇中斷/事件線是吻合的。所以我們只要明白其中一個的原理,那其他 19 個線路原理也就知道了。
EXTI功能框圖
EXTI 可分爲兩大部分功能,一個是產生中斷,另一個是產生事件,這兩個功能從硬件
上就有所不同。
首先我們來看圖 18-1 中紅色虛線指示的電路流程。它是一個產生中斷的線路,最終信
號流入到 NVIC 控制器內。
編號 1 是輸入線, EXTI 控制器有 19 箇中斷/事件輸入線,這些輸入線可以通過寄存器
設置爲任意一個 GPIO,也可以是一些外設的事件,這部分內容我們將在後面專門講解。輸
入線一般是存在電平變化的信號。
編號 2 是一個邊沿檢測電路,它會根據上升沿觸發選擇寄存器(EXTI_RTSR)和下降沿
觸發選擇寄存器(EXTI_FTSR)對應位的設置來控制信號觸發。邊沿檢測電路以輸入線作爲
信號輸入端,如果檢測到有邊沿跳變就輸出有效信號 1 給編號 3 電路,否則輸出無效信號
0。而 EXTI_RTSR 和 EXTI_FTSR 兩個寄存器可以控制器需要檢測哪些類型的電平跳變過
程,可以是隻有上升沿觸發、只有下降沿觸發或者上升沿和下降沿都觸發。
編號 3 電路實際就是一個或門電路,它一個輸入來自編號 2 電路,另外一個輸入來自
軟件中斷事件寄存器(EXTI_SWIER)。 EXTI_SWIER允許我們通過程序控制就可以啓動中斷
/事件線,這在某些地方非常有用。我們知道或門的作用就是有 1 就爲 1,所以這兩個輸入
隨便一個有有效信號 1 就可以輸出 1 給編號 4 和編號 6 電路。
編號 4 電路是一個與門電路,它一個輸入是編號 3 電路,另外一個輸入來自中斷屏蔽
寄存器(EXTI_IMR)。與門電路要求輸入都爲 1 才輸出 1,導致的結果是如果 EXTI_IMR 設
置爲 0 時,那不管編號 3 電路的輸出信號是 1 還是 0,最終編號 4 電路輸出的信號都爲 0;
如果 EXTI_IMR設置爲 1時,最終編號 4電路輸出的信號才由編號 3電路的輸出信號決定,
這樣我們可以簡單的控制 EXTI_IMR 來實現是否產生中斷的目的。編號 4 電路輸出的信號
會被保存到掛起寄存器(EXTI_PR)內,如果確定編號 4 電路輸出爲 1 就會把 EXTI_PR 對應
位置 1。
編號 5 是將 EXTI_PR 寄存器內容輸出到 NVIC 內,從而實現系統中斷事件控制。
接下來我們來看看綠色虛線指示的電路流程。它是一個產生事件的線路,最終輸出一
個脈衝信號。
產生事件線路是在編號 3電路之後與中斷線路有所不同,之前電路都是共用的。編號 6
電路是一個與門,它一個輸入來自編號 3 電路,另外一個輸入來自事件屏蔽寄存器
(EXTI_EMR)。如果 EXTI_EMR 設置爲 0 時,那不管編號 3 電路的輸出信號是 1 還是 0,最
終編號 6 電路輸出的信號都爲 0;如果 EXTI_EMR 設置爲 1 時,最終編號 6 電路輸出的信
號才由編號 3 電路的輸出信號決定,這樣我們可以簡單的控制 EXTI_EMR 來實現是否產生
事件的目的。
編號 7 是一個脈衝發生器電路,當它的輸入端,即編號 6 電路的輸出端,是一個有效
信號 1 時就會產生一個脈衝;如果輸入端是無效信號就不會輸出脈衝。
編號 8 是一個脈衝信號,就是產生事件的線路最終的產物,這個脈衝信號可以給其他
外設電路使用,比如定時器 TIM、模擬數字轉換器 ADC等等,這樣的脈衝信號一般用來觸
發 TIM 或者 ADC 開始轉換。
產生中斷線路目的是把輸入信號輸入到 NVIC,進一步會運行中斷服務函數,實現功
能,這樣是軟件級的。而產生事件線路目的就是傳輸一個脈衝信號給其他外設使用,並且
是電路級別的信號傳輸,屬於硬件級的。
另外, EXTI 是在 APB2 總線上的,在編程時候需要注意到這點。

三、中斷/事件線

EXTI 有 20 箇中斷/事件線,每個 GPIO 都可以被設置爲輸入線,佔用 EXTI0 至 EXTI15,
還有另外七根用於特定的外設事件,見表 18-1。
4根特定外設中斷/事件線由外設觸發,具體用法參考《STM32F10X-中文參考手冊》中
對外設的具體說明。
這裏寫圖片描述
EXTI0 至 EXTI15 用於 GPIO,通過編程控制可以實現任意一個 GPIO作爲 EXTI的輸入源。由表 18-1 可知, EXTI0 可以通過 AFIO 的外部中斷配置寄存器 1(AFIO_EXTICR1)的EXTI0[3:0]位選擇配置爲 PA0、 PB0、 PC0、 PD0、 PE0、 PF0、 PG0、 PH0 或者 PI0,見圖18-2。其他 EXTI 線(EXTI 中斷/事件線)使用配置都是類似的。
這裏寫圖片描述

四、EXTI初始化結構體詳解

標準庫函數對每個外設都建立了一個初始化結構體,比如 EXTI_InitTypeDef,結構體成員用於設置外設工作參數,並由外設初始化配置函數,比如 EXTI_Init()調用,這些設定參數將會設置外設相應的寄存器,達到配置外設工作環境的目的。
初始化結構體和初始化庫函數配合使用是標準庫精髓所在,理解了初始化結構體每個成員意義基本上就可以對該外設運用自如了。初始化結構體定義在 stm32f10x_exti.h 文件中,初始化庫函數定義在 stm32f10x_exti.c 文件中,編程時我們可以結合這兩個文件內註釋使用。
這裏寫圖片描述
1) EXTI_Line: EXTI 中斷/事件線選擇,可選 EXTI0 至 EXTI19,可參考表 18-1 選擇。
2) EXTI_Mode: EXTI 模式選擇,可選爲產生中斷(EXTI_Mode_Interrupt)或者產生事件(EXTI_Mode_Event)。
3) EXTI_Trigger: EXTI 邊沿觸發事件,可選上升沿觸發(EXTI_Trigger_Rising)、下降沿觸發(EXTI_Trigger_Falling)或者上升沿和下降沿都觸發(EXTI_Trigger_Rising_Falling)。
4) EXTI_LineCmd:控制是否使能 EXTI 線,可選使能 EXTI 線(ENABLE)或禁用
(DISABLE)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章