0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何檢測(cè)I/O端口的電平變化判斷是否產(chǎn)生中斷/事件請(qǐng)求

jf_pJlTbmA9 ? 來(lái)源:jf_pJlTbmA9 ? 作者:jf_pJlTbmA9 ? 2023-09-18 16:37 ? 次閱讀

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所示。

wKgZomUD7reAOxKFAAKXssqNeTQ140.png 圖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。

wKgaomUD7rmAOd3VAADdyL6nPNg005.png 圖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)一次。

wKgZomUD7ruAGioyAADEN-nO9vs813.png 圖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í)需配置該端口的工作模式為上拉輸入。

wKgaomUD7ryAah6DAAB9MMRLVow498.png 圖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位。

wKgZomUD7r2AVVsZAAGyPFhjx64029.png 圖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位。

wKgaomUD7r-AcNoaAAFGR9Jf8Ew323.png 圖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.
        }
    }
}

pYYBAGIzEOKAeTqnACuqPlbdUq0694.gif 圖7 實(shí)驗(yàn)現(xiàn)象

審核編輯:彭菁

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 控制器
    +關(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
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    PIC單片機(jī)中斷模塊介紹

    CPU響應(yīng)中斷后引腳電平才恢復(fù)到原始狀態(tài),恢復(fù)到原始狀態(tài)的過(guò)程也產(chǎn)生中斷請(qǐng)求,這種情況就是虛假中斷現(xiàn)象。在端口B的D7~D4引腳上一旦有
    發(fā)表于 07-12 18:09

    請(qǐng)教一個(gè)I/O檢測(cè)問(wèn)題。

    本帖最后由 eehome 于 2013-1-5 09:59 編輯 用I/O口作為輸入口檢測(cè)時(shí)要先置1吧,那當(dāng)I/O
    發(fā)表于 08-14 12:33

    CC2530的I/O外部中斷

    為輸入后,可以用于產(chǎn)生中斷。中斷可以設(shè)置在外部信號(hào)的上升或下降沿觸發(fā)。P0、P1或P2 端口都有中斷使能位,對(duì)位于IENl-2 寄存器內(nèi)的端口
    發(fā)表于 04-15 16:03

    MM32如何使用比較器產(chǎn)生中斷

    /4Vrefint)時(shí)比較器會(huì)產(chǎn)生一個(gè)上升沿信號(hào)輸出高電平,在輸入信號(hào)由高電平變化為低電平(小于/4Vrefint)時(shí)比較器會(huì)
    發(fā)表于 03-09 09:55

    通用I/O ,矢量中斷,實(shí)時(shí)中斷模塊介紹

    ,或者在雙邊沿都產(chǎn)生中斷。 對(duì)于 GIO 通用 I/O口的外部連接有一些設(shè)計(jì)上需要注意的地方,當(dāng)GIO 作 為輸出引腳使用的時(shí)候,在 2mA 驅(qū)動(dòng)能力下,可以保證輸出的高電平電壓一定
    發(fā)表于 05-25 01:18

    是否可以通過(guò)傳感器自檢產(chǎn)生中斷?

    大家好,我想測(cè)試LSM6DS3傳感器的中斷而不進(jìn)行任何移動(dòng)。您知道是否可以通過(guò)傳感器自檢產(chǎn)生中斷?如果我編寫一個(gè)低中斷閾值并啟動(dòng)傳感器的自檢,是否
    發(fā)表于 03-01 13:30

    請(qǐng)問(wèn)STM32F103VE的中斷引腳,數(shù)據(jù)端口,地址端口是那些,怎么控制和產(chǎn)生中斷?

    1,STM32F103VE的中斷引腳,數(shù)據(jù)端口,地址端口是那些?2,如何控制中斷產(chǎn)生中斷?
    發(fā)表于 03-19 06:34

    PSoC低壓檢測(cè)何時(shí)產(chǎn)生中斷?

    PSoC 4100/4200系列PSoC 4架構(gòu)的TRM,001-85634啟號(hào)文件。*a3.3.2.3低壓檢測(cè)(LVD)何時(shí)產(chǎn)生中斷?只有在事件當(dāng)電源電壓低于監(jiān)測(cè)水平或在狀態(tài)是積極的嗎?
    發(fā)表于 09-12 08:46

    GPIO口有中斷能力的端口

    GPIO口有中斷能力的端口:1. 中斷使能寄存器PxIE位置位表示允許對(duì)應(yīng)的引腳在電平變化時(shí)(正跳變或負(fù)跳變)
    發(fā)表于 11-29 06:23

    靈動(dòng)微課堂 (第202講) | MM32F0140 EXTI 學(xué)習(xí)筆記

    EXTI簡(jiǎn)介 EXTI是外部中斷/事件控制器,包含多個(gè)邊沿檢測(cè)器,通過(guò)檢測(cè)I/O端口
    發(fā)表于 03-17 18:44

    請(qǐng)問(wèn)如何讓CH32V103對(duì)Set Interface請(qǐng)求產(chǎn)生中斷?

    使用CH32V103芯片實(shí)現(xiàn)USB Device, 枚舉過(guò)程不產(chǎn)生Set Interface中斷,在Bus hound上可看到主機(jī)有向控制端點(diǎn)發(fā)送Set Interface請(qǐng)求。請(qǐng)問(wèn)如何讓CH32V103對(duì)Set Interfa
    發(fā)表于 06-06 06:42

    在執(zhí)行程序及產(chǎn)生中斷時(shí)CPU內(nèi)會(huì)發(fā)生什么變化?資料下載

    電子發(fā)燒友網(wǎng)為你提供在執(zhí)行程序及產(chǎn)生中斷時(shí)CPU內(nèi)會(huì)發(fā)生什么變化?資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設(shè)計(jì)、用戶指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
    發(fā)表于 04-04 08:52 ?2次下載
    在執(zhí)行程序及<b class='flag-5'>產(chǎn)生中斷</b>時(shí)CPU內(nèi)會(huì)發(fā)生什么<b class='flag-5'>變化</b>?資料下載

    可靠的邏輯高電平I/O電路

    可靠的邏輯高電平I/O電路(輸入) 微控制器I/O端口線能承受的最大電壓不超過(guò)5V(不同微控制器
    的頭像 發(fā)表于 08-16 14:52 ?7742次閱讀
    可靠的邏輯高<b class='flag-5'>電平</b><b class='flag-5'>I</b>/<b class='flag-5'>O</b>電路

    系統(tǒng)芯片設(shè)計(jì)—中斷產(chǎn)生及處理流程

    中斷控制器是系統(tǒng)芯片中用于中斷源收集,屏蔽和優(yōu)先級(jí)管理的IP核。產(chǎn)生中斷信號(hào)的部件稱為中斷源,中斷產(chǎn)生
    的頭像 發(fā)表于 08-12 14:46 ?3124次閱讀

    NCA9555帶中斷的16位I2C總線I/O端口英文手冊(cè)

    電子發(fā)燒友網(wǎng)站提供《NCA9555帶中斷的16位I2C總線I/O端口英文手冊(cè).pdf》資料免費(fèi)下載
    發(fā)表于 07-03 17:26 ?1次下載