衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何檢測I/O端口的電平變化判斷是否產生中斷/事件請求

jf_pJlTbmA9 ? 來源:jf_pJlTbmA9 ? 作者:jf_pJlTbmA9 ? 2023-09-18 16:37 ? 次閱讀

EXTI簡介

EXTI是外部中斷/事件控制器,包含多個邊沿檢測器,通過檢測I/O端口的電平變化判斷是否產生中斷/事件請求。

MM32F0140的EXTI包含19個外部中斷線,其中外部中斷線EXTI0 ~ EXTI15用于I/O映射,EXTI16連接到PVD輸出,EXTI19連接到比較器1輸出,EXTI24連接到IWDG中斷。可通過軟件控制任意一個I/O端口作為EXTI的輸入源,EXTI檢測對應端口是否產生邊沿觸發,若檢測到邊沿觸發則產生中斷/事件請求,GPIO對應的16個外部中斷/事件映射關系如圖1所示。

wKgZomUD7reAOxKFAAKXssqNeTQ140.png 圖1 MM32F0140 GPIO對應外部中斷/事件映射

EXTI進行邊沿檢測時包含三種觸發類型:

上升沿觸發

電平由低到高時的一瞬間稱為上升沿,由上升沿的產生觸發輸出變化就稱作上升沿觸發。

下降沿觸發

電平由高到低時的一瞬間稱為下降沿,由下降沿的產生觸發輸出變化則稱為下降沿觸發。

任意邊沿觸發

電平由上升沿或下降沿的產生而觸發輸出變化被稱作任意邊沿觸發。

中斷/事件產生過程如圖2所示,EXTI邊沿檢測引腳的外部輸入電平,若由于外部因素導致引腳電平變化并產生邊沿觸發,則邊沿檢測電路輸出有效信號。或門電路接收邊沿檢測電路輸出的信號與軟件事件中斷寄存器(EXTI_SWIER)的輸出,軟件事件中斷寄存器能夠通過軟件啟動中斷/事件線。當外部中斷線上觸發邊沿事件時,掛起寄存器(EXTI_PR)的對應位被置1,可通過讀EXTI_PR寄存器獲取當前中斷/事件狀態。或門電路的輸出與中斷屏蔽寄存器(EXTI_IMR)的輸出相與,在使能對應線中斷位且邊沿觸發有效信號時,輸出有效信號到內核的NVIC中,NVIC進行中斷處理。或門電路的輸出與事件屏蔽寄存器(EXTI_EMR)的輸出結果相與,當使能對應事件線位且邊沿觸發有效信號時,輸出有效信號1,即脈沖信號,該脈沖信號可用于其他外設,例如觸發TIM。

wKgaomUD7rmAOd3VAADdyL6nPNg005.png 圖2 EXTI模塊框圖

EXTI的配置

配置中斷

配置并使能中斷線,根據圖1判斷指定I/O端口對應的外部中斷線與SYSCFG_EXTICRx寄存器中的控制位,(EXTI0~EXTI3使用SYSCFG_EXTICR1寄存器,EXTI4~EXTI7使用SYSCFG_EXTICR2寄存器,EXTI8~EXTI11使用SYSCFG_EXTICR3寄存器,EXTI12~EXTI15使用SYSCFG_EXTICR4寄存器)向SYSCFG_EXTICRx寄存器中外部中斷線的對應位賦值,若使用PA管腳則對應位賦值為0000,PB管腳對應位賦值為0001,PC管腳對應位賦值為0010,PD管腳對應位賦值為0011。

配置邊緣檢測觸發器的觸發類型,若使用上升沿觸發,則對上升沿觸發選擇寄存器(EXTI_RTSR)的外部中斷線對應位置1;若使用下降沿觸發,則對下降沿觸發選擇寄存器(EXTI_FTSR)的外部中斷線對應位置1;若使用任意邊沿觸發,則EXTI_RTSR寄存器與EXTI_FTSR寄存器的外部中斷線對應位均置1。

中斷屏蔽寄存器(EXTI_IMR)的外部中斷線對應位置1,允許中斷請求。當指定的外部中斷線檢測到配置的觸發條件時,產生一個中斷請求,掛起寄存器(EXTI_PR)的對應位置1。通過軟件對掛起寄存器中對應位寫入1,使中斷被清除。

配置軟件中斷事件寄存器(EXTI_SWIER)的外部中斷線對應位為1并置1 EXTI_IMR寄存器的外部中斷線對應位,也能產生中斷。

配置事件

配置并使能事件線,對SYSCFG_EXTICRx寄存器中外部事件線的對應位賦值;配置邊緣檢測觸發寄存器為需要的觸發類型,對EXTI_RTSR寄存器與EXTI_FTSR寄存器賦值;事件屏蔽寄存器(EXTI_EMR)的對應位置1,允許事件請求。當檢測到配置的觸發條件時,產生一個事件請求,掛起寄存器對應位置 1;通過對掛起寄存器對應位寫1清除事件。

配置軟件中斷事件寄存器(EXTI_SWIER)的外部中斷/事件線對應位為1并置1 EXTI_EMR寄存器的對應位,也能產生事件。

實驗

本實驗在靈動官方開發板MB-023上進行,通過配置EXTI下降沿觸發中斷,按下按鍵后產生邊沿觸發,進行中斷處理,LED電平轉換。配置按鍵所使用的I/O端口的對應外部中斷線,對SYSCFG_EXTICRx寄存器的EXTIx位賦值,對EXTI_RTSR寄存器和EXTI_FTSR寄存器賦值配置觸發類型,使用EXTI_IMR寄存器使能中斷,EXTI_PR寄存器對應位置1清除中斷。具體實驗內容為配置按鍵K2的對應引腳PB2與LED2對應的PB3引腳(如圖3所示),配置PB2對應的外部中斷線為下降沿觸發,若按下K2,按鍵對應的端口輸入低電平,下降沿觸發,產生中斷。實驗現象為按下按鍵K2,LED2電平反轉一次。

wKgZomUD7ruAGioyAADEN-nO9vs813.png 圖3 MCU原理圖中的EXTI引腳

初始化外設時鐘

SYSCFG在APB2線上,GPIO在AHB線上,實驗使用SYSCFG配置外部中斷,按鍵K2與LED2的引腳均為GPIOB組的引腳。因此對RCC_APB2ENR寄存器的SYSCFGEN位置1,對RCC_AHBENR寄存器的GPIOB對應位置1,從而初始化外設時鐘。

// Enable SYSCFG clock.
RCC->APB2ENR |= (1u << 0u);
// Enable GPIOB clock.
RCC->AHB1ENR |= (1u << 18u);

初始化按鍵

實驗使用引腳為PB2的K2按鍵,按鍵原理圖如圖4所示,若K2按鍵按下則與GND導通,因此在初始化按鍵時需配置該端口的工作模式為上拉輸入。

wKgaomUD7ryAah6DAAB9MMRLVow498.png 圖4 原理圖中的按鍵

GPIOx_CRL寄存器為端口配置低寄存器,用于配置指定端口的速度與工作模式;GPIOx_BSRR寄存器用于設置/清除對應端口,該寄存器低16位的對應端口位置1會產生高電平。由圖5所示,K2所使用的端口PB2為GPIOx_CRL寄存器內第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

實驗使用PB3引腳,使用GPIOx_CRL寄存器對LED進行初始化配置,如圖5所示,端口3為GPIOx_CRL寄存器內第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對應位為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) );

配置觸發類型

在按鍵初始化中配置按鍵未按下時處于高電平,因此,對上升沿觸發選擇寄存器(EXTI_RTSR)與下降沿觸發選擇寄存器(EXTI_FTSR)賦值時配置觸發類型為下降沿觸發。

// 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對應位,使能中斷。

// Enable EXTI interrupt.
EXTI->IMR |= (1u << 2u);

配置NVIC

EXTI控制中斷,NVIC處理中斷,使用Cortex-M0 core_cm0.h頭文件中的NVIC_EnableIRQ使能中斷線,EXTI2對應中斷為EXTI2_3_IRQn。

// Setup NVIC.
NVIC_EnableIRQ (EXTI2_3_IRQn);

編寫中斷服務程序

中斷使能中使用EXTI2_3_IRQn,中斷處理函數要與其匹配,因此使用EXTI2_3_IRQHandler,設置變量app_exti_event_on作為中斷狀態標志,該變量初始時為false,中斷請求產生時中斷狀態標志轉換為true,將EXRI_PR寄存器的對應位寫入1來清除中斷。

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()函數

主程序中初始化變量app_exti_event_times為0,設置該變量從0開始計數,當中斷狀態標志app_exti_event_on為true,即產生中斷請求時,計數值加1,由于LED2初始化后顯示為亮,計算計數值取余2,若余數不等于0則LED2滅,若余數為0則LED2亮。實驗效果如圖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 實驗現象

審核編輯:彭菁

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 控制器
    +關注

    關注

    112

    文章

    16445

    瀏覽量

    179446
  • 比較器
    +關注

    關注

    14

    文章

    1658

    瀏覽量

    107428
  • 電平
    +關注

    關注

    5

    文章

    361

    瀏覽量

    40006
  • 端口
    +關注

    關注

    4

    文章

    990

    瀏覽量

    32206
收藏 人收藏

    評論

    相關推薦

    PIC單片機中斷模塊介紹

    CPU響應中斷后引腳電平才恢復到原始狀態,恢復到原始狀態的過程也產生中斷請求,這種情況就是虛假中斷現象。在端口B的D7~D4引腳上一旦有
    發表于 07-12 18:09

    請教一個I/O檢測問題。

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

    CC2530的I/O外部中斷

    為輸入后,可以用于產生中斷中斷可以設置在外部信號的上升或下降沿觸發。P0、P1或P2 端口都有中斷使能位,對位于IENl-2 寄存器內的端口
    發表于 04-15 16:03

    MM32如何使用比較器產生中斷

    /4Vrefint)時比較器會產生一個上升沿信號輸出高電平,在輸入信號由高電平變化為低電平(小于/4Vrefint)時比較器會
    發表于 03-09 09:55

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

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

    是否可以通過傳感器自檢產生中斷

    大家好,我想測試LSM6DS3傳感器的中斷而不進行任何移動。您知道是否可以通過傳感器自檢產生中斷?如果我編寫一個低中斷閾值并啟動傳感器的自檢,是否
    發表于 03-01 13:30

    請問STM32F103VE的中斷引腳,數據端口,地址端口是那些,怎么控制和產生中斷

    1,STM32F103VE的中斷引腳,數據端口,地址端口是那些?2,如何控制中斷產生中斷
    發表于 03-19 06:34

    PSoC低壓檢測何時產生中斷

    PSoC 4100/4200系列PSoC 4架構的TRM,001-85634啟號文件。*a3.3.2.3低壓檢測(LVD)何時產生中斷?只有在事件當電源電壓低于監測水平或在狀態是積極的嗎?
    發表于 09-12 08:46

    GPIO口有中斷能力的端口

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

    靈動微課堂 (第202講) | MM32F0140 EXTI 學習筆記

    EXTI簡介 EXTI是外部中斷/事件控制器,包含多個邊沿檢測器,通過檢測I/O端口
    發表于 03-17 18:44

    請問如何讓CH32V103對Set Interface請求產生中斷

    使用CH32V103芯片實現USB Device, 枚舉過程不產生Set Interface中斷,在Bus hound上可看到主機有向控制端點發送Set Interface請求。請問如何讓CH32V103對Set Interfa
    發表于 06-06 06:42

    在執行程序及產生中斷時CPU內會發生什么變化?資料下載

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

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

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

    系統芯片設計—中斷產生及處理流程

    中斷控制器是系統芯片中用于中斷源收集,屏蔽和優先級管理的IP核。產生中斷信號的部件稱為中斷源,中斷產生
    的頭像 發表于 08-12 14:46 ?3363次閱讀

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

    電子發燒友網站提供《NCA9555帶中斷的16位I2C總線I/O端口英文手冊.pdf》資料免費下載
    發表于 07-03 17:26 ?1次下載
    大发888在线娱乐城合营商| 威尼斯人娱乐城网| 大发888游戏平台电子| 苍南县| 迷你百家乐官网的玩法技巧和规则| 属狗与属龙做生意好吗| 澳门百家乐规| 石楼县| 兄弟百家乐官网的玩法技巧和规则 | 澳门百家乐娱乐场| 大发888娱乐场 17| 昆明百家乐官网装修装潢有限公司| 属鼠和属虎的人能在一起做生意吗| 威尼斯人娱乐城赌博网| 资讯 | 百家乐官网网上真钱娱乐网| 百家乐游戏机论坛| 赌博技术| 同乐城百家乐官网娱乐城| 爱赢百家乐的玩法技巧和规则| 抚远县| 百家乐视频象棋| 德州扑克发牌视频| 如何玩百家乐官网赢钱技巧| 木棉百家乐的玩法技巧和规则| 天天百家乐官网游戏| 百家乐玩法秘决| 大发888注册送50| 现金百家乐官网下载| 百家乐追号| 虚拟百家乐官网游戏下载| 澳门百家乐必杀技| 瑞奇国际娱乐| 百家乐游戏公司| 利德赌博| 百家乐可以算牌么| 波音娱乐城送彩金| 新世纪百家乐官网娱乐城| 威尼斯人娱乐城老lm0| 百家乐官网技巧赚钱| 大发888娱乐城官网|