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

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

EXTI0至 EXTI15用于 GPIO,通過編程控制可以實現(xiàn)任意一個 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口產(chǎn)生外部中斷,不支持三個同為外部中斷模式。
各系列 EXTI 功能差異
GD32系列MCU有關(guān)SPI外設(shè)各系列功能差異如 GD32 MCU 各系列 EXTI 功能差異表所示。

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

4.3.軟件配置說明
本小節(jié)講解EXTI_Example歷程中EXTI模塊的配置說明,主要包括外設(shè)時鐘配置、GPIO引腳配置、EXTI外設(shè)配置、主函數(shù)介紹以及運行結(jié)果。本例程主要介紹GD32 MCU各系列EXTI外部中斷的使用。
外設(shè)時鐘配置
外設(shè)時鐘配置如代碼清單EXTI例程時鐘配置代碼所示,在該歷程中使用PA0作為EXTI輸入檢測引腳,因而,在GD32全系列MCU中均需打開GPIOA的時鐘,另外,在GD32F1X0、GD32F3X0和GD32E23X中需要打開CFGCMP時鐘,以及在GD32F4XX中需要打開SYSCFG時鐘,主要由于 EXTI源選擇控制位在系統(tǒng)配置寄存器中。
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引腳需要配置為浮空輸入狀態(tài)。
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 外設(shè)配置
EXTI外設(shè)配置代碼如代碼清單EXTI例程EXTI外設(shè)配置代碼所示,在該代碼中,首先使能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 }
主函數(shù)說明及中斷處理函數(shù)說明
主函數(shù)配置十分簡單,如代碼清單EXTI例程主函數(shù)所示,主要包括外設(shè)時鐘初始化調(diào)用、GPIO初始化調(diào)用以及EXTI配置函數(shù)。
int main(void) { /* peripheral clock enable */ rcu_config(); /* GPIO config */ gpio_config(); /* SPI config */ exti_config(); while(1) { } }
中斷處理函數(shù)如代碼清單EXTI中斷處理函數(shù)所示。在中斷處理函數(shù)中,首先判斷產(chǎn)生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); } }
運行結(jié)果
將EXTI_Example例程按照對應(yīng)的芯片工程編譯完成后,下載到對應(yīng)芯片中,在中斷處理函數(shù)中加斷點,可以發(fā)現(xiàn),當PA0有下降沿發(fā)生時,會產(chǎn)生EXTI中斷,進入EXTI中斷處理函數(shù)。
本教程由GD32 MCU方案商聚沃科技原創(chuàng)發(fā)布,了解更多GD32 MCU教程,關(guān)注聚沃科技官網(wǎng)
-
單片機
+關(guān)注
關(guān)注
6076文章
45495瀏覽量
670342 -
mcu
+關(guān)注
關(guān)注
147文章
18925瀏覽量
398141 -
嵌入式
+關(guān)注
關(guān)注
5198文章
20449瀏覽量
334032 -
GD32
+關(guān)注
關(guān)注
7文章
432瀏覽量
27344 -
EXTI
+關(guān)注
關(guān)注
0文章
27瀏覽量
4169
發(fā)布評論請先 登錄
GD32 MCU 入門教程】GD32 MCU 常見外設(shè)介紹(12)FMC 模塊介紹
GD32的外部中斷介紹
GD32的MCU介紹
《GD32 MCU原理及固件庫開發(fā)指南》 + 初讀感悟
《GD32 MCU原理及固件庫開發(fā)指南》+讀后感
兆易創(chuàng)新GD32 MCU選型手冊,適用于GD32全系列MCU
不同型號的GD32 MCU如何區(qū)分?
【GD32 MCU 入門教程】一、GD32 MCU 開發(fā)環(huán)境搭建(1)使用Keil開發(fā)GD32
【GD32 MCU 入門教程】一、GD32 MCU 開發(fā)環(huán)境搭建(2)使用 IAR 開發(fā) GD32
【GD32 MCU 入門教程】一、GD32 MCU 開發(fā)環(huán)境搭建(3)使用 Embedded Builder 開發(fā) GD32
【GD32 MCU 入門教程】GD32 MCU 常見外設(shè)介紹(14)RTC 模塊介紹
【GD32 MCU入門教程】GD32 MCU GPIO 結(jié)構(gòu)與使用注意事項
【GD32 MCU 入門教程】GD32 MCU 常見外設(shè)介紹(4)EXTI 中斷介紹
評論