EXTI(中斷/事件控制器)包含多個相互獨立的邊沿檢測電路并且能夠向處理器內核產生中斷請求或喚醒事件。 EXTI 有三種觸發類型:上升沿觸發、下降沿觸發和任意沿觸發。 EXTI中的每一個邊沿檢測電路都可以獨立配置和屏蔽。
4.1.GD32 EXTI 外設原理簡介
GD32 EXTI 主要特性(以 GD32F30x 為例)
? 高效的中斷處理;
? 支持異常搶占和咬尾中斷;
? 將系統從省電模式喚醒;
? 3 種觸發類型:上升沿觸發,下降沿觸發和任意沿觸發;
? 軟件中斷或事件觸發;
? 可配置的觸發源;
? Cortex-M4系統異常;
? 多達68種可屏蔽的外設中斷;
? 4位中斷優先級配置位,可配置16個中斷優先級;
? EXTI中有多達20個相互獨立的邊沿檢測電路;
EXTI 框圖

如圖所示,EXTI 可分為兩大部分功能,一個是產生中斷,另一個是產生事件。EXTI的輸入線可以通過寄存器設置為任意GPIO,也可以是一些外設的事件,輸入線是存在電平變化的信號。
EXTI包含一個邊沿檢測電路,它會根據上升沿觸發選擇寄存器和下降沿觸發選擇寄存器對應位的設置來控制信號觸發。邊沿檢測電路以輸入線作為信號輸入端,如果檢測到有邊沿跳變就輸出有效信號給邊沿檢測電路,否則輸出無效信號,而通過配置寄存器,可設置邊沿檢測電路響應跳變過程,如設置為上升沿觸發、下降沿觸發和雙邊沿觸發。
EXTI還包含一個或門電路,它一個輸入來自邊沿檢測電路,另外一個輸入來自軟件中斷事件寄存器。軟件中斷事件寄存器允許我們通過程序控制就可以啟動中斷/事件線,這在某些地方非常有用。
中斷/事件線
不同系列的MCU對應有不同數量、不同種類的中斷/事件線,以GD32F10x系列為例,如EXTI中斷線圖所示它有20個中斷/事件線,每個 GPIO都可以被設置為輸入線,占用 EXTI0至EXTI15,另外 4根特定外設中斷/事件線由外設觸發,比如EXTI16代表低壓檢測LVD中斷、EXTI17代表RTC鬧鐘中斷、EXTI18代表USB喚醒中斷、EXTI19代表以太網喚醒中斷。
EXTI 中斷線

EXTI0至 EXTI15用于 GPIO,通過編程控制可以實現任意一個 GPIO作為 EXTI的輸入源。由表可知,EXTI0 可以通過 EXTI源選擇寄存器0寄存器(AFIO_EXTISS0)的EXTI0_SS[3:0]位選擇配置為 PA0、PB0、PC0、PD0、PE0、PF0、PG0,其他 EXTI線(EXTI中斷/事件線)使用配置都是類似的。
注意:多組中同一標號PIN僅可配置一個IO口為外部中斷,例: PA0、 PB0、 PC0僅支持三個中的其中一個IO口產生外部中斷,不支持三個同為外部中斷模式。
各系列 EXTI 功能差異
GD32系列MCU有關SPI外設各系列功能差異如 GD32 MCU 各系列 EXTI 功能差異表所示。

4.2.硬件連接說明
外部中斷輸入檢測可以通過配置上升沿、下降沿或者任意沿觸發,讀者可根據輸入信號的初始狀態進行配置。如按鍵設計原理圖所示,該圖為GD32 開發板按鍵設計原理圖,在按鍵未按下時KEY引腳狀態為高電平,按下后,引腳電平狀態為低電平,因而可以配置為下降沿(按鍵按下時)觸發EXTI、上升沿(按鍵松開后)觸發EXTI或任意沿(按鍵按下和松開后)觸發EXTI。

4.3.軟件配置說明
本小節講解EXTI_Example歷程中EXTI模塊的配置說明,主要包括外設時鐘配置、GPIO引腳配置、EXTI外設配置、主函數介紹以及運行結果。本例程主要介紹GD32 MCU各系列EXTI外部中斷的使用。
外設時鐘配置
外設時鐘配置如代碼清單EXTI例程時鐘配置代碼所示,在該歷程中使用PA0作為EXTI輸入檢測引腳,因而,在GD32全系列MCU中均需打開GPIOA的時鐘,另外,在GD32F1X0、GD32F3X0和GD32E23X中需要打開CFGCMP時鐘,以及在GD32F4XX中需要打開SYSCFG時鐘,主要由于 EXTI源選擇控制位在系統配置寄存器中。
void rcu_config(void) { #if defined GD32F10X_HD || GD32F30X_HD || GD32F20X_CL || GD32E10X rcu_periph_clock_enable(RCU_GPIOA); #elif defined GD32F1X0 || GD32F4XX || GD32F3X0 || GD32E23X rcu_periph_clock_enable(RCU_GPIOA); #if defined GD32F1X0 || GD32F3X0 || GD32E23X rcu_periph_clock_enable(RCU_CFGCMP); #elif defined GD32F4XX rcu_periph_clock_enable(RCU_SYSCFG); #endif #endif }
GPIO 引腳配置
GPIO引腳配置如代碼清單EXTI例程GPIO引腳配置代碼所示,PA0引腳需要配置為浮空輸入狀態。
void gpio_config(void) { #if defined GD32F10X_HD || GD32F30X_HD || GD32F20X_CL || GD32E10X gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_0); #elif defined GD32F1X0 || GD32F4XX || GD32F3X0 || GD32E23X gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_0); #endif }
EXTI 外設配置
EXTI外設配置代碼如代碼清單EXTI例程EXTI外設配置代碼所示,在該代碼中,首先使能EXTI中斷,之后配置EXTI源以及所需要的邊沿,最后清除EXTI中斷標志。
void exti_config(void) { #if defined GD32F10X_HD|| GD32F30X_HD || GD32F1X0 || GD32F20X_CL || GD32F4XX || GD32F3X0 || GD32E10X || GD32E23X #if defined GD32F1X0 || GD32F3X0 || GD32E23X || GD32F4XX #if defined GD32E23X /* enable and set key EXTI interrupt to the lowest priority */ nvic_irq_enable(EXTI0_1_IRQn, 2U); #elif defined GD32F4XX nvic_irq_enable(EXTI0_IRQn, 2U,0U); #elif defined GD32F1X0 || GD32F3X0 nvic_irq_enable(EXTI0_1_IRQn, 2U,0U); #endif /* connect key EXTI line to key GPIO pin */ syscfg_exti_line_config(EXTI_SOURCE_GPIOA, EXTI_SOURCE_PIN0); /* configure key EXTI line */ exti_init(EXTI_0, EXTI_INTERRUPT, EXTI_TRIG_FALLING); exti_interrupt_flag_clear(EXTI_0); #else nvic_irq_enable(EXTI0_IRQn, 2U,0U); gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA, GPIO_PIN_SOURCE_0); /* configure key EXTI line */ exti_init(EXTI_0, EXTI_INTERRUPT, EXTI_TRIG_FALLING); exti_interrupt_flag_clear(EXTI_0); #endif #endif }
主函數說明及中斷處理函數說明
主函數配置十分簡單,如代碼清單EXTI例程主函數所示,主要包括外設時鐘初始化調用、GPIO初始化調用以及EXTI配置函數。
int main(void) { /* peripheral clock enable */ rcu_config(); /* GPIO config */ gpio_config(); /* SPI config */ exti_config(); while(1) { } }
中斷處理函數如代碼清單EXTI中斷處理函數所示。在中斷處理函數中,首先判斷產生EXTI的中斷是否為EXTI_0的中斷標志,如果是,則進入EXTI_0的中斷處理,處理完成后,清除EXTI_0的中斷標志。
void EXTI0_IRQHandler(void) { if(exti_interrupt_flag_get(EXTI_0) == SET) { exti_interrupt_flag_clear(EXTI_0); } }
運行結果
將EXTI_Example例程按照對應的芯片工程編譯完成后,下載到對應芯片中,在中斷處理函數中加斷點,可以發現,當PA0有下降沿發生時,會產生EXTI中斷,進入EXTI中斷處理函數。
-
單片機
+關注
關注
6050文章
44685瀏覽量
641145 -
mcu
+關注
關注
146文章
17458瀏覽量
354413 -
嵌入式
+關注
關注
5103文章
19265瀏覽量
309979 -
GD32
+關注
關注
7文章
416瀏覽量
24660 -
EXTI
+關注
關注
0文章
27瀏覽量
3752
發布評論請先 登錄
相關推薦
GD32 MCU 入門教程】GD32 MCU 常見外設介紹(12)FMC 模塊介紹

GD32的外部中斷介紹
《GD32 MCU原理及固件庫開發指南》 + 初讀感悟
兆易創新GD32 MCU選型手冊,適用于GD32全系列MCU
【GD32 MCU 入門教程】一、GD32 MCU 開發環境搭建(1)使用Keil開發GD32

【GD32 MCU 入門教程】一、GD32 MCU 開發環境搭建(2)使用 IAR 開發 GD32

【GD32 MCU 入門教程】一、GD32 MCU 開發環境搭建(3)使用 Embedded Builder 開發 GD32

【GD32 MCU 入門教程】GD32 MCU 常見外設介紹(14)RTC 模塊介紹

【GD32 MCU入門教程】GD32 MCU GPIO 結構與使用注意事項

評論