1. 程式人生 > >EXTI—外部中斷/事件控制器

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

wid 似的 開始 模擬 虛線 play str 可選 配置寄存器

EXTI 簡介

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

EXTI 功能框圖

EXTI 的功能框圖包含了 EXTI 最核心內容,掌握了功能框圖,對 EXTI 就有一個整體的把握,在編程時思路就非常清晰。可以看到很多在信號線上打一個斜杠並標註“20”字樣,這個表示在控制器內部類似的信號線路有 20 個,這與 EXTI 總共有 20 個中斷/事件線是吻合的.

技術分享圖片

EXTI 可分為兩大部分功能,一個是產生中斷,另一個是產生事件,這兩個功能從硬件上就有所不同。

首先我們來看圖中紅色虛線指示的電路流程。它是一個產生中斷的線路,最終信號流入到 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,還有另外七根用於特定的外設事件,見表 1。

4 根特定外設中斷/事件線由外設觸發,具體用法參考《STM32F10X-中文參考手冊》中對外設的具體說明。

技術分享圖片

EXTI0 至 EXTI15 用於 GPIO,通過編程控制可以實現任意一個 GPIO 作為 EXTI 的輸入源。由表 1 可知, EXTI0 可以通過 AFIO 的外部中斷配置寄存器 1(AFIO_EXTICR1)的EXTI0[3:0]位選擇配置為 PA0、 PB0、 PC0、 PD0、 PE0、 PF0、 PG0、 PH0 或者 PI0,見圖2。其他 EXTI 線(EXTI 中斷/事件線)使用配置都是類似的。

技術分享圖片

EXTI 初始化結構體詳解

初始化結構體定義在 stm32f4xx_exti.h 文件中,初始化庫函數定義在 stm32f4xx_exti.c 文件中,編程時我們可以結合這兩個文件內註釋使用。

 typedef struct {
 uint32_t EXTI_Line; // 中斷/事件線
 EXTIMode_TypeDef EXTI_Mode; // EXTI 模式
 EXTITrigger_TypeDef EXTI_Trigger; // 觸發類型
 FunctionalState EXTI_LineCmd; // EXTI 使能
 } EXTI_InitTypeDef

1) EXTI_Line: EXTI 中斷/事件線選擇,可選 EXTI0 至 EXTI19,可參考表 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)。

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