EXTI簡(jiǎn)介
EXTI是外部中斷/事件控制器,包含多個(gè)邊沿檢測(cè)器,通過(guò)檢測(cè)I/O端口的電平變化判斷是否產(chǎn)生中斷/事件請(qǐng)求。
MM32F0140的EXTI包含19個(gè)外部中斷線,其中外部中斷線EXTI0 ~ EXTI15用于I/O映射,EXTI16連接到PVD輸出,EXTI19連接到比較器1輸出,EXTI24連接到IWDG中斷。可通過(guò)軟件控制任意一個(gè)I/O端口作為EXTI的輸入源,EXTI檢測(cè)對(duì)應(yīng)端口是否產(chǎn)生邊沿觸發(fā),若檢測(cè)到邊沿觸發(fā)則產(chǎn)生中斷/事件請(qǐng)求,GPIO對(duì)應(yīng)的16個(gè)外部中斷/事件映射關(guān)系如圖1所示。
圖1 MM32F0140 GPIO對(duì)應(yīng)外部中斷/事件映射
EXTI進(jìn)行邊沿檢測(cè)時(shí)包含三種觸發(fā)類型:
上升沿觸發(fā)
電平由低到高時(shí)的一瞬間稱為上升沿,由上升沿的產(chǎn)生觸發(fā)輸出變化就稱作上升沿觸發(fā)。
下降沿觸發(fā)
電平由高到低時(shí)的一瞬間稱為下降沿,由下降沿的產(chǎn)生觸發(fā)輸出變化則稱為下降沿觸發(fā)。
任意邊沿觸發(fā)
電平由上升沿或下降沿的產(chǎn)生而觸發(fā)輸出變化被稱作任意邊沿觸發(fā)。
中斷/事件產(chǎn)生過(guò)程如圖2所示,EXTI邊沿檢測(cè)引腳的外部輸入電平,若由于外部因素導(dǎo)致引腳電平變化并產(chǎn)生邊沿觸發(fā),則邊沿檢測(cè)電路輸出有效信號(hào)?;蜷T電路接收邊沿檢測(cè)電路輸出的信號(hào)與軟件事件中斷寄存器(EXTI_SWIER)的輸出,軟件事件中斷寄存器能夠通過(guò)軟件啟動(dòng)中斷/事件線。當(dāng)外部中斷線上觸發(fā)邊沿事件時(shí),掛起寄存器(EXTI_PR)的對(duì)應(yīng)位被置1,可通過(guò)讀EXTI_PR寄存器獲取當(dāng)前中斷/事件狀態(tài)?;蜷T電路的輸出與中斷屏蔽寄存器(EXTI_IMR)的輸出相與,在使能對(duì)應(yīng)線中斷位且邊沿觸發(fā)有效信號(hào)時(shí),輸出有效信號(hào)到內(nèi)核的NVIC中,NVIC進(jìn)行中斷處理?;蜷T電路的輸出與事件屏蔽寄存器(EXTI_EMR)的輸出結(jié)果相與,當(dāng)使能對(duì)應(yīng)事件線位且邊沿觸發(fā)有效信號(hào)時(shí),輸出有效信號(hào)1,即脈沖信號(hào),該脈沖信號(hào)可用于其他外設(shè),例如觸發(fā)TIM。
圖2 EXTI模塊框圖
EXTI的配置
配置中斷
配置并使能中斷線,根據(jù)圖1判斷指定I/O端口對(duì)應(yīng)的外部中斷線與SYSCFG_EXTICRx寄存器中的控制位,(EXTI0~EXTI3使用SYSCFG_EXTICR1寄存器,EXTI4~EXTI7使用SYSCFG_EXTICR2寄存器,EXTI8~EXTI11使用SYSCFG_EXTICR3寄存器,EXTI12~EXTI15使用SYSCFG_EXTICR4寄存器)向SYSCFG_EXTICRx寄存器中外部中斷線的對(duì)應(yīng)位賦值,若使用PA管腳則對(duì)應(yīng)位賦值為0000,PB管腳對(duì)應(yīng)位賦值為0001,PC管腳對(duì)應(yīng)位賦值為0010,PD管腳對(duì)應(yīng)位賦值為0011。
配置邊緣檢測(cè)觸發(fā)器的觸發(fā)類型,若使用上升沿觸發(fā),則對(duì)上升沿觸發(fā)選擇寄存器(EXTI_RTSR)的外部中斷線對(duì)應(yīng)位置1;若使用下降沿觸發(fā),則對(duì)下降沿觸發(fā)選擇寄存器(EXTI_FTSR)的外部中斷線對(duì)應(yīng)位置1;若使用任意邊沿觸發(fā),則EXTI_RTSR寄存器與EXTI_FTSR寄存器的外部中斷線對(duì)應(yīng)位均置1。
中斷屏蔽寄存器(EXTI_IMR)的外部中斷線對(duì)應(yīng)位置1,允許中斷請(qǐng)求。當(dāng)指定的外部中斷線檢測(cè)到配置的觸發(fā)條件時(shí),產(chǎn)生一個(gè)中斷請(qǐng)求,掛起寄存器(EXTI_PR)的對(duì)應(yīng)位置1。通過(guò)軟件對(duì)掛起寄存器中對(duì)應(yīng)位寫入1,使中斷被清除。
配置軟件中斷事件寄存器(EXTI_SWIER)的外部中斷線對(duì)應(yīng)位為1并置1 EXTI_IMR寄存器的外部中斷線對(duì)應(yīng)位,也能產(chǎn)生中斷。
配置事件
配置并使能事件線,對(duì)SYSCFG_EXTICRx寄存器中外部事件線的對(duì)應(yīng)位賦值;配置邊緣檢測(cè)觸發(fā)寄存器為需要的觸發(fā)類型,對(duì)EXTI_RTSR寄存器與EXTI_FTSR寄存器賦值;事件屏蔽寄存器(EXTI_EMR)的對(duì)應(yīng)位置1,允許事件請(qǐng)求。當(dāng)檢測(cè)到配置的觸發(fā)條件時(shí),產(chǎn)生一個(gè)事件請(qǐng)求,掛起寄存器對(duì)應(yīng)位置 1;通過(guò)對(duì)掛起寄存器對(duì)應(yīng)位寫1清除事件。
配置軟件中斷事件寄存器(EXTI_SWIER)的外部中斷/事件線對(duì)應(yīng)位為1并置1 EXTI_EMR寄存器的對(duì)應(yīng)位,也能產(chǎn)生事件。
實(shí)驗(yàn)
本實(shí)驗(yàn)在靈動(dòng)官方開(kāi)發(fā)板MB-023上進(jìn)行,通過(guò)配置EXTI下降沿觸發(fā)中斷,按下按鍵后產(chǎn)生邊沿觸發(fā),進(jìn)行中斷處理,LED電平轉(zhuǎn)換。配置按鍵所使用的I/O端口的對(duì)應(yīng)外部中斷線,對(duì)SYSCFG_EXTICRx寄存器的EXTIx位賦值,對(duì)EXTI_RTSR寄存器和EXTI_FTSR寄存器賦值配置觸發(fā)類型,使用EXTI_IMR寄存器使能中斷,EXTI_PR寄存器對(duì)應(yīng)位置1清除中斷。具體實(shí)驗(yàn)內(nèi)容為配置按鍵K2的對(duì)應(yīng)引腳PB2與LED2對(duì)應(yīng)的PB3引腳(如圖3所示),配置PB2對(duì)應(yīng)的外部中斷線為下降沿觸發(fā),若按下K2,按鍵對(duì)應(yīng)的端口輸入低電平,下降沿觸發(fā),產(chǎn)生中斷。實(shí)驗(yàn)現(xiàn)象為按下按鍵K2,LED2電平反轉(zhuǎn)一次。
圖3 MCU原理圖中的EXTI引腳
初始化外設(shè)時(shí)鐘
SYSCFG在APB2線上,GPIO在AHB線上,實(shí)驗(yàn)使用SYSCFG配置外部中斷,按鍵K2與LED2的引腳均為GPIOB組的引腳。因此對(duì)RCC_APB2ENR寄存器的SYSCFGEN位置1,對(duì)RCC_AHBENR寄存器的GPIOB對(duì)應(yīng)位置1,從而初始化外設(shè)時(shí)鐘。
// Enable SYSCFG clock. RCC->APB2ENR |= (1u << 0u); // Enable GPIOB clock. RCC->AHB1ENR |= (1u << 18u);
初始化按鍵
實(shí)驗(yàn)使用引腳為PB2的K2按鍵,按鍵原理圖如圖4所示,若K2按鍵按下則與GND導(dǎo)通,因此在初始化按鍵時(shí)需配置該端口的工作模式為上拉輸入。
圖4 原理圖中的按鍵
GPIOx_CRL寄存器為端口配置低寄存器,用于配置指定端口的速度與工作模式;GPIOx_BSRR寄存器用于設(shè)置/清除對(duì)應(yīng)端口,該寄存器低16位的對(duì)應(yīng)端口位置1會(huì)產(chǎn)生高電平。由圖5所示,K2所使用的端口PB2為GPIOx_CRL寄存器內(nèi)第8 ~ 11位。
圖5 GPIOx_CRL寄存器
// Clear the configuration bit of port 2. GPIOB->CRL = ~(0xf << 8u); // Configure pull-up input mode. GPIOB->CRL |= (0x8 << 8u); // Configure PB2 pin to high level. GPIOB->BSRR |= (1u << 2u);
初始化LED
實(shí)驗(yàn)使用PB3引腳,使用GPIOx_CRL寄存器對(duì)LED進(jìn)行初始化配置,如圖5所示,端口3為GPIOx_CRL寄存器內(nèi)第12 ~ 15位。
// Clear the configuration bit of port 3. GPIOB->CRL = ~(0xf << 12u); // Configure push-pull output mode. GPIOB->CRL |= (0x1 << 12u);
配置中斷線
由圖1可知,PB2使用的外部中斷線為EXTI2,配置SYSCFG_EXTICR1寄存器的EXTI2對(duì)應(yīng)位為0001,如圖6所示,EXTI2處于SYSCFG_EXTICR1寄存器的8~ 11位。
圖6 GPIOx_EXTICR1
// Clear EXTI2 and assign value, the corresponding value of PB is 0001. SYSCFG->EXTICR1 = ( ( SYSCFG->EXTICR1 ~(0xf << 8u) ) | (0x1 << 8u) );
配置觸發(fā)類型
在按鍵初始化中配置按鍵未按下時(shí)處于高電平,因此,對(duì)上升沿觸發(fā)選擇寄存器(EXTI_RTSR)與下降沿觸發(fā)選擇寄存器(EXTI_FTSR)賦值時(shí)配置觸發(fā)類型為下降沿觸發(fā)。
// Clear the corresponding bit of EXTI2 triggered by rising edge. EXTI->RTSR = ~ (1u << 2u); // Configure falling edge trigger. EXTI->FTSR |= (1u << 2u);
使能中斷
配置EXTI_IMR寄存器的EXTI2對(duì)應(yīng)位,使能中斷。
// Enable EXTI interrupt. EXTI->IMR |= (1u << 2u);
配置NVIC
EXTI控制中斷,NVIC處理中斷,使用Cortex-M0 core_cm0.h頭文件中的NVIC_EnableIRQ使能中斷線,EXTI2對(duì)應(yīng)中斷為EXTI2_3_IRQn。
// Setup NVIC. NVIC_EnableIRQ (EXTI2_3_IRQn);
編寫中斷服務(wù)程序
中斷使能中使用EXTI2_3_IRQn,中斷處理函數(shù)要與其匹配,因此使用EXTI2_3_IRQHandler,設(shè)置變量app_exti_event_on作為中斷狀態(tài)標(biāo)志,該變量初始時(shí)為false,中斷請(qǐng)求產(chǎn)生時(shí)中斷狀態(tài)標(biāo)志轉(zhuǎn)換為true,將EXRI_PR寄存器的對(duì)應(yīng)位寫入1來(lái)清除中斷。
void EXTI2_3_IRQHandler(void) { uint32_t flags = EXTI->PR; if ( 0u != ( flags (1u << 2u) ) ) { app_exti_event_on = true; } EXTI->PR |= (1u << 2u); // Clear interrupt. }
main()函數(shù)
主程序中初始化變量app_exti_event_times為0,設(shè)置該變量從0開(kāi)始計(jì)數(shù),當(dāng)中斷狀態(tài)標(biāo)志app_exti_event_on為true,即產(chǎn)生中斷請(qǐng)求時(shí),計(jì)數(shù)值加1,由于LED2初始化后顯示為亮,計(jì)算計(jì)數(shù)值取余2,若余數(shù)不等于0則LED2滅,若余數(shù)為0則LED2亮。實(shí)驗(yàn)效果如圖7所示。
int main(void) { // Enable SYSCFG and GPIOB clock. RCC->APB2ENR |= (1u << 0u); RCC->AHB1ENR |= (1u << 18u); // Setup K2. GPIOB->CRL = ~(0xf << 8u); GPIOB->CRL |= (0x8 << 8u); GPIOB->BSRR |= (1u << 2u); // Setup LED2. GPIOB->CRL = ~(0xf << 12u); GPIOB->CRL |= (0x1 << 12u); // Setup SYSCFG EXTI2. SYSCFG->EXTICR1 = ( ( SYSCFG->EXTICR1 ~(0xf << 8u) ) | (0x1 << 8u) ); // Setup EXTI. EXTI->RTSR = ~ (1u << 2u); EXTI->FTSR |= (1u << 2u); // Enable EXTI interrupt. EXTI->IMR |= (1u << 2u); // Setup NVIC. NVIC_EnableIRQ (EXTI2_3_IRQn); while (1) { while ( !app_exti_event_on ) { } app_exti_event_on = false; app_exti_event_times++; if ( (app_exti_event_times % 2u) != 0u ) { GPIOB->BSRR = (1u << 3u);// LED2(PB3 pin) off. } else { GPIOB->BRR = (1u << 3u);// LED2(PB3 pin) on. } } }
圖7 實(shí)驗(yàn)現(xiàn)象
審核編輯:彭菁
-
控制器
+關(guān)注
關(guān)注
112文章
16103瀏覽量
177074 -
比較器
+關(guān)注
關(guān)注
14文章
1628瀏覽量
107046 -
電平
+關(guān)注
關(guān)注
5文章
357瀏覽量
39812 -
端口
+關(guān)注
關(guān)注
4文章
948瀏覽量
31984
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論