EXTI(中斷/事件控制器)包含多個(gè)相互獨(dú)立的邊沿檢測電路并且能夠向處理器內(nèi)核產(chǎn)生中斷請求或喚醒事件。 EXTI 有三種觸發(fā)類型:上升沿觸發(fā)、下降沿觸發(fā)和任意沿觸發(fā)。 EXTI中的每一個(gè)邊沿檢測電路都可以獨(dú)立配置和屏蔽。
4.1.GD32 EXTI 外設(shè)原理簡介
GD32 EXTI 主要特性(以 GD32F30x 為例)
? 高效的中斷處理;
? 支持異常搶占和咬尾中斷;
? 將系統(tǒng)從省電模式喚醒;
? 3 種觸發(fā)類型:上升沿觸發(fā),下降沿觸發(fā)和任意沿觸發(fā);
? 軟件中斷或事件觸發(fā);
? 可配置的觸發(fā)源;
? Cortex-M4系統(tǒng)異常;
? 多達(dá)68種可屏蔽的外設(shè)中斷;
? 4位中斷優(yōu)先級配置位,可配置16個(gè)中斷優(yōu)先級;
? EXTI中有多達(dá)20個(gè)相互獨(dú)立的邊沿檢測電路;
EXTI 框圖
如圖所示,EXTI 可分為兩大部分功能,一個(gè)是產(chǎn)生中斷,另一個(gè)是產(chǎn)生事件。EXTI的輸入線可以通過寄存器設(shè)置為任意GPIO,也可以是一些外設(shè)的事件,輸入線是存在電平變化的信號。
EXTI包含一個(gè)邊沿檢測電路,它會(huì)根據(jù)上升沿觸發(fā)選擇寄存器和下降沿觸發(fā)選擇寄存器對應(yīng)位的設(shè)置來控制信號觸發(fā)。邊沿檢測電路以輸入線作為信號輸入端,如果檢測到有邊沿跳變就輸出有效信號給邊沿檢測電路,否則輸出無效信號,而通過配置寄存器,可設(shè)置邊沿檢測電路響應(yīng)跳變過程,如設(shè)置為上升沿觸發(fā)、下降沿觸發(fā)和雙邊沿觸發(fā)。
EXTI還包含一個(gè)或門電路,它一個(gè)輸入來自邊沿檢測電路,另外一個(gè)輸入來自軟件中斷事件寄存器。軟件中斷事件寄存器允許我們通過程序控制就可以啟動(dòng)中斷/事件線,這在某些地方非常有用。
中斷/事件線
不同系列的MCU對應(yīng)有不同數(shù)量、不同種類的中斷/事件線,以GD32F10x系列為例,如EXTI中斷線圖所示它有20個(gè)中斷/事件線,每個(gè) GPIO都可以被設(shè)置為輸入線,占用 EXTI0至EXTI15,另外 4根特定外設(shè)中斷/事件線由外設(shè)觸發(fā),比如EXTI16代表低壓檢測LVD中斷、EXTI17代表RTC鬧鐘中斷、EXTI18代表USB喚醒中斷、EXTI19代表以太網(wǎng)喚醒中斷。
EXTI 中斷線
EXTI0至 EXTI15用于 GPIO,通過編程控制可以實(shí)現(xiàn)任意一個(gè) GPIO作為 EXTI的輸入源。由表可知,EXTI0 可以通過 EXTI源選擇寄存器0寄存器(AFIO_EXTISS0)的EXTI0_SS[3:0]位選擇配置為 PA0、PB0、PC0、PD0、PE0、PF0、PG0,其他 EXTI線(EXTI中斷/事件線)使用配置都是類似的。
注意:多組中同一標(biāo)號PIN僅可配置一個(gè)IO口為外部中斷,例: PA0、 PB0、 PC0僅支持三個(gè)中的其中一個(gè)IO口產(chǎn)生外部中斷,不支持三個(gè)同為外部中斷模式。
各系列 EXTI 功能差異
GD32系列MCU有關(guān)SPI外設(shè)各系列功能差異如 GD32 MCU 各系列 EXTI 功能差異表所示。
4.2.硬件連接說明
外部中斷輸入檢測可以通過配置上升沿、下降沿或者任意沿觸發(fā),讀者可根據(jù)輸入信號的初始狀態(tài)進(jìn)行配置。如按鍵設(shè)計(jì)原理圖所示,該圖為GD32 開發(fā)板按鍵設(shè)計(jì)原理圖,在按鍵未按下時(shí)KEY引腳狀態(tài)為高電平,按下后,引腳電平狀態(tài)為低電平,因而可以配置為下降沿(按鍵按下時(shí))觸發(fā)EXTI、上升沿(按鍵松開后)觸發(fā)EXTI或任意沿(按鍵按下和松開后)觸發(fā)EXTI。
4.3.軟件配置說明
本小節(jié)講解EXTI_Example歷程中EXTI模塊的配置說明,主要包括外設(shè)時(shí)鐘配置、GPIO引腳配置、EXTI外設(shè)配置、主函數(shù)介紹以及運(yùn)行結(jié)果。本例程主要介紹GD32 MCU各系列EXTI外部中斷的使用。
外設(shè)時(shí)鐘配置
外設(shè)時(shí)鐘配置如代碼清單EXTI例程時(shí)鐘配置代碼所示,在該歷程中使用PA0作為EXTI輸入檢測引腳,因而,在GD32全系列MCU中均需打開GPIOA的時(shí)鐘,另外,在GD32F1X0、GD32F3X0和GD32E23X中需要打開CFGCMP時(shí)鐘,以及在GD32F4XX中需要打開SYSCFG時(shí)鐘,主要由于 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中斷標(biāo)志。
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è)時(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的中斷標(biāo)志,如果是,則進(jìn)入EXTI_0的中斷處理,處理完成后,清除EXTI_0的中斷標(biāo)志。
void EXTI0_IRQHandler(void) { if(exti_interrupt_flag_get(EXTI_0) == SET) { exti_interrupt_flag_clear(EXTI_0); } }
運(yùn)行結(jié)果
將EXTI_Example例程按照對應(yīng)的芯片工程編譯完成后,下載到對應(yīng)芯片中,在中斷處理函數(shù)中加斷點(diǎn),可以發(fā)現(xiàn),當(dāng)PA0有下降沿發(fā)生時(shí),會(huì)產(chǎn)生EXTI中斷,進(jìn)入EXTI中斷處理函數(shù)。
本教程由GD32 MCU方案商聚沃科技原創(chuàng)發(fā)布,了解更多GD32 MCU教程,關(guān)注聚沃科技官網(wǎng)
-
單片機(jī)
+關(guān)注
關(guān)注
6035文章
44554瀏覽量
634621 -
mcu
+關(guān)注
關(guān)注
146文章
17123瀏覽量
350978 -
嵌入式
+關(guān)注
關(guān)注
5082文章
19104瀏覽量
304794 -
GD32
+關(guān)注
關(guān)注
7文章
403瀏覽量
24326 -
EXTI
+關(guān)注
關(guān)注
0文章
27瀏覽量
3686
發(fā)布評論請先 登錄
相關(guān)推薦
評論