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

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

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

STM32的IO外部中斷EXTI的使用

科技綠洲 ? 來(lái)源:明解嵌入式 ? 作者:明解嵌入式 ? 2023-06-22 10:21 ? 次閱讀

一、前言

在之前針對(duì)STM32的GPIO相關(guān)API函數(shù)及配置使用進(jìn)行了詳細(xì)的介紹,GPIO作為輸入引腳時(shí),調(diào)用相關(guān)讀信號(hào)引腳函數(shù)接口就可以在程序的循環(huán)中,輪詢的對(duì)輸入信號(hào)進(jìn)行讀取檢測(cè)操作,除了輪詢的方式訪問(wèn)輸入引腳,還可以通過(guò)另外一種叫做外部中斷的方式來(lái)對(duì)引腳的輸入信號(hào)進(jìn)行檢測(cè),本篇首先介紹下EXTI的結(jié)構(gòu),接著介紹外部中斷的相關(guān)概念,對(duì)STM32的IO外部中斷EXTI有個(gè)初步的了解,在此基礎(chǔ)上重點(diǎn)圍繞IO外部中斷EXTI的使用展開(kāi)分析。

圖片

圖1 外部中斷設(shè)計(jì)

二、EXTI結(jié)構(gòu)

EXTI(External interrupt/event controller)—外部中斷/事件控制器,管理了控制器的 20個(gè)中斷/事件線。每個(gè)中斷/事件線都對(duì)應(yīng)有一個(gè)邊沿檢測(cè)器,可以實(shí)現(xiàn)輸入信號(hào)的上升沿檢測(cè)和下降沿的檢測(cè)。EXTI 可以實(shí)現(xiàn)對(duì)每個(gè)中斷/事件線進(jìn)行單獨(dú)配置,可以單獨(dú)配置為中斷或者事件,以及觸發(fā)事件的屬性。

在圖2可以看到很多在信號(hào)線上打一個(gè)斜杠并標(biāo)注“20”字樣,這個(gè)表示在控制器內(nèi)部類似的信號(hào)線路有 20 個(gè),這與 EXTI 總共有 20 個(gè)中斷/事件線是吻合的。所以我們只要明白其中一個(gè)的原理,那其他 19 個(gè)線路原理也就知道了。

圖片

圖2 EXTI結(jié)構(gòu)

EXTI 可分為兩大部分功能,一個(gè)是產(chǎn)生中斷,另一個(gè)是產(chǎn)生事件,這兩個(gè)功能從硬件上就有所不同。

中斷和事件的區(qū)別:

事件:某一信號(hào)出現(xiàn),比如上升沿或者下降沿。不一定觸發(fā)中斷。

中斷:某一的事件發(fā)生,并產(chǎn)生中斷,然后跳到相應(yīng)的中斷服務(wù)函數(shù)中進(jìn)行相應(yīng)的處理。

首先我們來(lái)看圖中紅色虛線指示的電路流程。它是一個(gè)產(chǎn)生中斷的線路,最終信號(hào)流入到 NVIC 控制器內(nèi)。

編號(hào) 1 是輸入線,EXTI 控制器有 19 個(gè)中斷/事件輸入線,這些輸入線可以通過(guò)寄存器設(shè)置為任意一個(gè) GPIO,也可以是一些外設(shè)的事件,這部分內(nèi)容我們將在后面專門講解。輸入線一般是存在電平變化的信號(hào)。

編號(hào) 2 是一個(gè)邊沿檢測(cè)電路,它會(huì)根據(jù)上升沿觸發(fā)選擇寄存(EXTI_RTSR)和下降沿觸發(fā)選擇寄存器(EXTI_FTSR)對(duì)應(yīng)位的設(shè)置來(lái)控制信號(hào)觸發(fā)。邊沿檢測(cè)電路以輸入線作為信號(hào)輸入端,如果檢測(cè)到有邊沿跳變就輸出有效信號(hào) 1 給編號(hào) 3 電路,否則輸出無(wú)效信號(hào)0。而 EXTI_RTSR 和 EXTI_FTSR 兩個(gè)寄存器可以控制器需要檢測(cè)哪些類型的電平跳變過(guò)程,可以是只有上升沿觸發(fā)、只有下降沿觸發(fā)或者上升沿和下降沿都觸發(fā)。

編號(hào) 3 電路實(shí)際就是一個(gè)或門電路,它一個(gè)輸入來(lái)自編號(hào) 2 電路,另外一個(gè)輸入來(lái)自軟件中斷事件寄存器(EXTI_SWIER)。EXTI_SWIER允許我們通過(guò)程序控制就可以啟動(dòng)中斷/事件線,這在某些地方非常有用。我們知道或門的作用就是有 1 就為 1,所以這兩個(gè)輸入隨便一個(gè)有有效信號(hào) 1就可以輸出 1 給編號(hào) 4和編號(hào) 6電路。

編號(hào) 4 電路是一個(gè)與門電路,它一個(gè)輸入是編號(hào) 3 電路,另外一個(gè)輸入來(lái)自中斷屏蔽寄存器(EXTI_IMR)。與門電路要求輸入都為 1 才輸出 1,導(dǎo)致的結(jié)果是如果EXTI_IMR 設(shè)置為 0 時(shí),那不管編號(hào) 3 電路的輸出信號(hào)是 1 還是 0,最終編號(hào) 4 電路輸出的信號(hào)都為 0;如果EXTI_IMR設(shè)置為1時(shí),最終編號(hào)4電路輸出的信號(hào)才由編號(hào)3電路的輸出信號(hào)決定,這樣我們可以簡(jiǎn)單的控制 EXTI_IMR 來(lái)實(shí)現(xiàn)是否產(chǎn)生中斷的目的。編號(hào) 4 電路輸出的信號(hào)會(huì)被保存到掛起寄存器(EXTI_PR)內(nèi),如果確定編號(hào) 4 電路輸出為 1 就會(huì)把 EXTI_PR 對(duì)應(yīng)位置1。

編號(hào) 5 是將 EXTI_PR 寄存器內(nèi)容輸出到 NVIC 內(nèi),從而實(shí)現(xiàn)系統(tǒng)中斷事件控制。

接下來(lái)我們來(lái)看看綠色虛線指示的電路流程。它是一個(gè)產(chǎn)生事件的線路,最終輸出一個(gè)脈沖信號(hào)。產(chǎn)生事件線路是在編號(hào)3電路之后與中斷線路有所不同,之前電路都是共用的。

編號(hào)6電路是一個(gè)與門,它一個(gè)輸入來(lái)自編號(hào) 3 電路,另外一個(gè)輸入來(lái)自事件屏蔽寄存器(EXTI_EMR)。如果 EXTI_EMR設(shè)置為 0時(shí),那不管編號(hào) 3電路的輸出信號(hào)是 1還是 0,最終編號(hào) 6 電路輸出的信號(hào)都為 0;如果EXTI_EMR 設(shè)置為 1 時(shí),最終編號(hào) 6 電路輸出的信號(hào)才由編號(hào) 3 電路的輸出信號(hào)決定,這樣我們可以簡(jiǎn)單的控制 EXTI_EMR 來(lái)實(shí)現(xiàn)是否產(chǎn)生事件的目的。

編號(hào) 7 是一個(gè)脈沖發(fā)生器電路,當(dāng)它的輸入端,即編號(hào) 6 電路的輸出端,是一個(gè)有效信號(hào) 1 時(shí)就會(huì)產(chǎn)生一個(gè)脈沖;如果輸入端是無(wú)效信號(hào)就不會(huì)輸出脈沖。

編號(hào) 8 是一個(gè)脈沖信號(hào),就是產(chǎn)生事件的線路最終的產(chǎn)物,這個(gè)脈沖信號(hào)可以給其他外設(shè)電路使用,比如定時(shí)器 TIM、模擬數(shù)字轉(zhuǎn)換器 ADC等等,這樣的脈沖信號(hào)一般用來(lái)觸發(fā) TIM 或者 ADC開(kāi)始轉(zhuǎn)換。

產(chǎn)生中斷線路目的是把輸入信號(hào)輸入到 NVIC,進(jìn)一步會(huì)運(yùn)行中斷服務(wù)函數(shù),實(shí)現(xiàn)功能,這樣是軟件級(jí)的。而產(chǎn)生事件線路目的就是傳輸一個(gè)脈沖信號(hào)給其他外設(shè)使用,并且是電路級(jí)別的信號(hào)傳輸,屬于硬件級(jí)的。

另外,EXTI是在 APB2總線上的,在編程時(shí)候需要注意到這點(diǎn)。

三、IO外部中斷概念

外部中斷是單片機(jī)實(shí)時(shí)地處理外部事件的一種內(nèi)部機(jī)制。當(dāng)某種外部事件發(fā)生時(shí),單片機(jī)的中斷系統(tǒng)將迫使CPU暫停正在執(zhí)行的程序,轉(zhuǎn)而去進(jìn)行中斷事件的處理;中斷處理完畢后.又返回被中斷的程序處,繼續(xù)執(zhí)行下去。

圖片

圖3 外部中斷概念內(nèi)容

1、外部中斷映射

外部中斷/事件控制器EXTI包含多達(dá) 23 個(gè)用于產(chǎn)生事件/中斷請(qǐng)求的邊沿檢測(cè)器。每根輸入線都可單獨(dú)進(jìn)行配置,以選擇類型(中斷或事件)和相應(yīng)的觸發(fā)事件(上升沿觸發(fā)、下降沿觸發(fā)或邊沿觸發(fā))。每根輸入線還可單獨(dú)屏蔽。

以STM32F407為例,支持多達(dá) 23 個(gè)軟件事件/中斷請(qǐng)求,這些事件/中斷請(qǐng)求通過(guò)EXTI線輸入到EXTI控制器中去,其中各EXTI線連接如下:

EXTI_Line0~15:連接外部 GPIO 口的輸入中斷。

EXTI_Line16:連接到 PVD 輸出

EXTI_Line17:連接到 RTC 鬧鐘事件

EXTI_Line18:連接到 USB OTG FS 喚醒事件

EXTI_Line19:連接到以太網(wǎng)喚醒事件

EXTI_Line20:連接到 USB OTG HS(在 FS 中配置)喚醒事件

EXTI_Line21:連接到 RTC 入侵和時(shí)間戳事件

EXTI_Line22:連接到 RTC 喚醒事件

我們?cè)谶@里重點(diǎn)討論的是GPIO口的輸入中斷,因此EXTI_Line16EXTI_Line22不是本文討論的重點(diǎn)。STM32的每個(gè)GPIO引腳都可以作為外部中斷輸入,STM32的GPIO口引腳多達(dá)幾十個(gè)甚至上百個(gè),因此既然每個(gè)GPIO引腳都可以作為外部中斷輸入,而EXTI_Line015只有16個(gè),因此IO引腳和外部中斷線的對(duì)應(yīng)關(guān)系如下:

圖片

圖4 外部中斷/事件 GPIO 映射

從圖4中可以看出,由于STM32每個(gè)GPIO端口都有16個(gè)pin引腳,因此EXTI_Line015對(duì)應(yīng)的是引腳pin0pin15。例如EXTI_Line0對(duì)應(yīng)GPIOA0GPIOI0,因此類推EXTI_Line1對(duì)應(yīng)GPIOA1GPIOI1,因此每個(gè)EXTI_Line可以對(duì)應(yīng)最多9個(gè)pin引腳,具體映射到那個(gè)pin引腳上,需要進(jìn)行相應(yīng)的配置。

2、外部中斷寄存器

(1)、中斷屏蔽寄存器EXTI_IMR

圖5為斷屏蔽寄存器定義,本寄存器用于打開(kāi)和關(guān)閉外部中斷的請(qǐng)求,0~22位有效,對(duì)應(yīng)之前提到的23個(gè)外部中斷請(qǐng)求,對(duì)應(yīng)的位寫0時(shí),關(guān)閉外部中斷請(qǐng)求;對(duì)應(yīng)位寫1時(shí),打開(kāi)外部中斷請(qǐng)求。

圖片

圖5 中斷屏蔽寄存器定義

(2)、事件屏蔽寄存器EXTI_EMR

圖6為事件屏蔽寄存器定義,本寄存器用于打開(kāi)和關(guān)閉外部事件的請(qǐng)求,0~22位有效,對(duì)應(yīng)之前提到的23個(gè)外部事件請(qǐng)求,對(duì)應(yīng)的位寫0時(shí),關(guān)閉外部事件請(qǐng)求;對(duì)應(yīng)位寫1時(shí),打開(kāi)外部事件請(qǐng)求。事件只是一個(gè)觸發(fā)信號(hào),它作為中斷的觸發(fā)源,可以觸發(fā)中斷,也可以不觸發(fā)中斷,打開(kāi)對(duì)應(yīng)EXTI_IMR的中斷屏蔽位,那么事件可以觸發(fā)對(duì)應(yīng)的中斷。只有觸發(fā)了中斷后,程序才會(huì)跳轉(zhuǎn)到對(duì)應(yīng)的中斷處理程序中去。

圖片

圖6 事件屏蔽寄存器定義

(3)、上升沿觸發(fā)選擇寄存器EXTI_RTSR

圖7為上升沿觸發(fā)選擇寄存器定義,本寄存器用于設(shè)置外部中斷的觸發(fā)事件是信號(hào)的上升沿,0~22位有效,對(duì)應(yīng)之前提到的23個(gè)外部事件請(qǐng)求,對(duì)應(yīng)的位寫0時(shí),關(guān)閉外部事件信號(hào)上升沿請(qǐng)求,不可以觸發(fā)信號(hào)上升沿中斷;對(duì)應(yīng)位寫1時(shí),打開(kāi)外部信號(hào)上升沿請(qǐng)求,可以觸發(fā)信號(hào)上升沿中斷。

圖片

圖7 上升沿觸發(fā)選擇寄存器定義

(4)、下降沿觸發(fā)選擇寄存器EXTI_FTSR

圖8為下降沿觸發(fā)選擇寄存器定義,本寄存器用于設(shè)置外部中斷的觸發(fā)事件是信號(hào)的下降沿,0~22位有效,對(duì)應(yīng)之前提到的23個(gè)外部事件請(qǐng)求,對(duì)應(yīng)的位寫0時(shí),關(guān)閉外部事件信號(hào)下降沿請(qǐng)求,不可以觸發(fā)信號(hào)下降沿中斷;對(duì)應(yīng)位寫1時(shí),打開(kāi)外部信號(hào)下降沿請(qǐng)求,可以觸發(fā)信號(hào)下降沿中斷。

圖片

圖8 下降沿觸發(fā)選擇寄存器定義

(5)、軟件中斷事件寄存器EXTI_SWIER

圖9為軟件中斷事件寄存器定義,本寄存器可以用軟件程序的方式來(lái)觸發(fā)事件中斷的產(chǎn)生,用來(lái)模擬外部實(shí)際事件中斷的產(chǎn)生,0~22位有效,對(duì)應(yīng)之前提到的23個(gè)外部事件請(qǐng)求,對(duì)應(yīng)位寫1時(shí),用于模擬外部事件的產(chǎn)生,對(duì)應(yīng)位寫0時(shí),用于復(fù)位事件狀態(tài),下次可以再寫1產(chǎn)生事件。因此,這個(gè)寄存器是用軟件程序模擬外部實(shí)際事件的產(chǎn)生從而觸發(fā)中斷,當(dāng)然前提是打開(kāi)了IMR和EMR。

圖片

圖9 軟件中斷事件寄存器定義

(6)、掛起寄存器EXTI_PR

圖10為掛起寄存器寄存器定義,本寄存器可以標(biāo)志是否產(chǎn)生了外部中斷事件請(qǐng)求,同時(shí)可以通過(guò)向?qū)?yīng)位寫1來(lái)清除中斷事件,0~22位有效,對(duì)應(yīng)之前提到的23個(gè)外部事件請(qǐng)求,讀到對(duì)應(yīng)位為1時(shí),表示發(fā)生了外部事件中斷;讀到對(duì)應(yīng)位為1時(shí),表示沒(méi)有發(fā)生外部事件中斷。因此一旦觸發(fā)中斷條件就對(duì)應(yīng)位被置為1,不過(guò)要在中斷服務(wù)函數(shù)里面向?qū)?yīng)位寫1清除中斷,不然就導(dǎo)致會(huì)一直進(jìn)入中斷。

圖片

圖10 掛起寄存器定義

3、外部中斷API函數(shù)

本節(jié)所介紹的STM32的EXTI函數(shù)接口是STM32標(biāo)準(zhǔn)庫(kù)的函數(shù)接口,在詳細(xì)介紹各個(gè)API函數(shù)接口功能之前,我們需要對(duì)函數(shù)接口中使用到的關(guān)鍵的參數(shù)進(jìn)行分析。

EXTI_InitTypeDef* EXTI_InitStruct

這個(gè)參數(shù)是EXTI函數(shù)端口需要初始化的功能參數(shù)的結(jié)構(gòu)體指針,下面我們看看這個(gè)結(jié)構(gòu)體的定義。

typedef struct
{
  uint32_t EXTI_Line;              //外部中斷事件連接線                                                 
  EXTIMode_TypeDef EXTI_Mode;      //外部中斷事件模式                                    
  EXTITrigger_TypeDef EXTI_Trigger; //邊沿事件觸發(fā)方式                                      
  FunctionalState EXTI_LineCmd;     //外部中斷事件連接線開(kāi)關(guān)
}EXTI_InitTypeDef;

(a)、外部中斷事件連接線:可選范圍為EXTI_Line0~EXTI_Line15。

(b)、外部中斷事件模式:用于選擇發(fā)生EXTI的模式,可選的模式如下。

typedef enum
{
  EXTI_Mode_Interrupt = 0x00,  //中斷模式
  EXTI_Mode_Event = 0x04       //事件模式
}EXTIMode_TypeDef;

(c)、邊沿事件觸發(fā)方式:用于選擇外部IO輸入時(shí)信號(hào)邊沿觸發(fā)事件的方式。

typedef enum
{
  EXTI_Trigger_Rising = 0x08,        //信號(hào)上升沿觸發(fā)
  EXTI_Trigger_Falling = 0x0C,       //信號(hào)下降沿觸發(fā)
  EXTI_Trigger_Rising_Falling = 0x10  //信號(hào)雙邊沿觸發(fā)
}EXTITrigger_TypeDef;

(d)、外部中斷事件連接線開(kāi)關(guān):用于打開(kāi)和關(guān)閉外部中斷事件連接線。

typedef enum 
{
  DISABLE = 0,         //關(guān)閉外部中斷事件連接線
  ENABLE = !DISABLE   //打開(kāi)外部中斷事件連接線
} FunctionalState;

下面就對(duì)具體的函數(shù)接口進(jìn)行逐個(gè)的介紹。由于使用的是STM32的標(biāo)準(zhǔn)庫(kù),EXTI相關(guān)的函數(shù)及配置定義和可以調(diào)用的接口放置在官方提供的標(biāo)準(zhǔn)庫(kù)文件 stm32fxx_exti.c和頭文件 stm32fxx_exti.h 文件中。

(1)、void EXTI_DeInit(void);

作用:將EXTI的各個(gè)寄存器值恢復(fù)到復(fù)位值,各個(gè)寄存器復(fù)位值如下。

EXTI- >IMR = 0x00000000;
EXTI- >EMR = 0x00000000;
EXTI- >RTSR = 0x00000000;
EXTI- >FTSR = 0x00000000;
EXTI- >PR = 0x007FFFFF;

(2)、void EXTI_Init(EXTI_InitTypeDef EXTI_InitStruct); *

作用:對(duì)外部中斷的中斷線進(jìn)行初始化操作。

舉例:

EXTI_InitStructure.EXTI_Line = EXTI_Line2; //外部中斷事件連接線為EXTI2
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//EXTI模式為外部中斷模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //外部IO輸入信號(hào)為下降沿觸發(fā)
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//打開(kāi)外部中斷事件連接線
EXTI_Init(&EXTI_InitStructure);

(3)、void EXTI_StructInit(EXTI_InitTypeDef EXTI_InitStruct); *

作用:獲取EXTI的一個(gè)默認(rèn)狀態(tài),可應(yīng)用于某個(gè)外部中斷事件上。該函數(shù)內(nèi)部默認(rèn)狀態(tài)如下。

EXTI_InitStruct- >EXTI_Line = EXTI_LINENONE; //外部中斷事件連接線為無(wú)
EXTI_InitStruct- >EXTI_Mode = EXTI_Mode_Interrupt;//EXTI模式為外部中斷模式
EXTI_InitStruct- >EXTI_Trigger = EXTI_Trigger_Falling;//外部IO輸入信號(hào)為下降沿觸發(fā)
EXTI_InitStruct- >EXTI_LineCmd = DISABLE;//關(guān)閉外部中斷事件連接線

舉例:EXTI_StructInit(&exti_InitStruct),使用exti_InitStruct快速獲取到了外部中斷事件默認(rèn)狀態(tài)值。

(4)、void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);

作用:使用軟件的方式模擬產(chǎn)生一個(gè)外部中斷,前提是使能了EXTI_IMR和EXTI_EMR。

舉例:EXTI_GenerateSWInterrupt(EXTI_Line2),通過(guò)軟件方式在EXTI_Line2上產(chǎn)生了一個(gè)中斷。

(5)、FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);

作用:檢測(cè)外部事件標(biāo)志位,判斷外部事件是否產(chǎn)生。FlagStatus=RESET,事件未產(chǎn)生;FlagStatus=SET,事件產(chǎn)生。

舉例:status = EXTI_GetFlagStatus(EXTI_Line2),檢測(cè)EXTI_Line2上外部事件標(biāo)志位。

(6)、void EXTI_ClearFlag(uint32_t EXTI_Line);

作用:清除外部事件標(biāo)志位。

舉例:EXTI_ClearFlag(EXTI_Line2),清除EXTI_Line2外部事件標(biāo)志位。

(7)、ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);

作用:檢測(cè)外部中斷標(biāo)志位,判斷外部中斷是否產(chǎn)生。ITStatus =RESET,中斷未產(chǎn)生;ITStatus=SET,中斷產(chǎn)生。

舉例:status = EXTI_GetITStatus(EXTI_Line2),檢測(cè)EXTI_Line2上外部中斷標(biāo)志位。

(8)、void EXTI_ClearITPendingBit(uint32_t EXTI_Line);

作用:清除外部中斷標(biāo)志位。

舉例:EXTI_ClearITPendingBit(EXTI_Line2),清除EXTI_Line2外部中斷標(biāo)志位。

四、IO外部中斷使用

圖片

圖11 IO外部中斷配置使用內(nèi)容

(1)、初始化相應(yīng)的GPIO引腳

需要按照GPIO的普通IO輸入進(jìn)行引腳的初始化,同時(shí)使能對(duì)用GPIO的外設(shè)時(shí)鐘。

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA的外設(shè)時(shí)鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//設(shè)置使用引腳
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通IO輸入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//根據(jù)實(shí)際應(yīng)用配置輸出速度
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//根據(jù)實(shí)際應(yīng)用配置上拉或下拉電阻
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化PA1引腳

(2)、初始系統(tǒng)配置控制器SYSCFG

系統(tǒng)配置控制器SYSCFG可以用于管理GPIO外部中斷線連接。需要開(kāi)啟SYSCFG 時(shí)鐘,同時(shí)需要將外部中斷事件線 EXTI_Line和GPIO的引腳pin進(jìn)行關(guān)系映射。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能 SYSCFG 時(shí)鐘
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource1);//PA1連接到中斷線1

將中斷線 1 與GPIOA 映射起來(lái),那么此處很顯然是 GPIOA的pin1與 EXTI_Line1中斷線連接了。

(3)、初始化外部中斷事件線

即調(diào)用EXTI_Init接口對(duì)中斷線進(jìn)行配置,設(shè)置好EXTI_Line的參數(shù)。

EXTI_InitStructure.EXTI_Line = EXTI_Line1; //外部中斷事件連接線為EXTI1,根據(jù)實(shí)際情況設(shè)置
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//EXTI模式為外部中斷模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //外部IO輸入信號(hào)為下降沿觸發(fā)根據(jù)實(shí)際情況設(shè)置
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//打開(kāi)外部中斷事件連接線
EXTI_Init(&EXTI_InitStructure);

(4)、初始化NVIC

NVIC是嵌套向量中斷控制器,屬于內(nèi)核外設(shè),管理著包括內(nèi)核和片上所有外設(shè)的中斷相關(guān)的功能。關(guān)于NVIC的知識(shí),可以回顧明解STM32中斷系統(tǒng)的內(nèi)容進(jìn)行詳細(xì)的了解。

NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; //使能外部中斷EXTI1,根據(jù)實(shí)際情況設(shè)置
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //搶占優(yōu)先級(jí)2,根據(jù)實(shí)際情況設(shè)置
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //響應(yīng)優(yōu)先級(jí)2,根據(jù)實(shí)際情況設(shè)置 
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道 
NVIC_Init(&NVIC_InitStructure); //中斷優(yōu)先級(jí)分組初始化

(5)、中斷服務(wù)函數(shù)編寫

雖然EXTI的外部中斷事件線有16個(gè)為EXTI_Line0~EXTI_Line15,但是STM32規(guī)定好的GPIO外部中斷服務(wù)函數(shù)只有7個(gè):

EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
EXTI9_5_IRQHandler
EXTI15_10_IRQHandler

可以看出EXTI_Line0EXTI_Line4每個(gè)中斷線對(duì)應(yīng)一個(gè)中斷函數(shù),中斷線EXTI_Line5EXTI_Line9共用中斷函數(shù) EXTI9_5_IRQHandler,EXTI_Line10~EXTI_Line15 共用中斷函數(shù) EXTI15_10_IRQHandler。

一個(gè)標(biāo)準(zhǔn)的GPIO外部中斷服務(wù)函數(shù)模板如下:

void EXTI1_IRQHandle(void)
{
  if(EXTI_GetITStatus(EXTI_Line1)!=RESET)//判斷某個(gè)EXTI_Line上的中斷是否發(fā)生
  {
    ................ //此處用戶自行定義中斷處理邏輯
    EXTI_ClearITPendingBit(EXTI_Line3); //清除EXTI_Line上的中斷標(biāo)志位
  } 
}

需要注意的是:EXTI9_5_IRQHandler和EXTI15_10_IRQHandler這兩個(gè)中斷由于是多個(gè)中斷線共用,因此中斷服務(wù)函數(shù)中可以分別放置多個(gè)EXTI_Line的處理邏輯。

五、總結(jié)

本篇在GPIO基本API和配置使用流程基礎(chǔ)之前,對(duì)EXTI的結(jié)構(gòu)功能,普通IO輸入使用成外部中斷的方式進(jìn)行了詳細(xì)介紹。圍繞外部中斷概念和外部中斷的配置使用分別進(jìn)行了介紹分析,通過(guò)分析外部中斷相關(guān)API和寄存器,了解外部中斷和GPIO引腳的映射關(guān)系,功能特性等,從而能更好的應(yīng)用外部中斷的接口完成一系列外部中斷的配置使用工作。

聲明:本文內(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)投訴
  • STM32
    +關(guān)注

    關(guān)注

    2262

    文章

    10846

    瀏覽量

    353676
  • 引腳
    +關(guān)注

    關(guān)注

    16

    文章

    1162

    瀏覽量

    50014
  • EXTI
    +關(guān)注

    關(guān)注

    0

    文章

    27

    瀏覽量

    3646
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32 GPIO的外部中斷設(shè)計(jì)

    輸入引腳,還可以通過(guò)另外一種叫做外部中斷的方式來(lái)對(duì)引腳的輸入信號(hào)進(jìn)行檢測(cè),本篇首先介紹下EXTI的結(jié)構(gòu),接著介紹外部中斷的相關(guān)概念,對(duì)
    發(fā)表于 04-14 10:51 ?1943次閱讀
    <b class='flag-5'>STM32</b> GPIO的<b class='flag-5'>外部</b><b class='flag-5'>中斷</b>設(shè)計(jì)

    EXTI外部中斷

    程序簡(jiǎn)介 -工程名稱:EXTI--外部中斷 -實(shí)驗(yàn)平臺(tái): 秉火STM32 F429 開(kāi)發(fā)板 -MDK版本:5.16 -ST固件庫(kù)版本:1.5.1 【 !】功能簡(jiǎn)介: 兩個(gè)按鍵控制彩燈的
    發(fā)表于 12-12 19:08 ?3次下載

    STM8S_009_ EXTI外部中斷

    STM8S_009_EXTI外部中斷
    的頭像 發(fā)表于 03-14 14:56 ?4139次閱讀

    STM32EXTI——外部中斷資料下載

    電子發(fā)燒友網(wǎng)為你提供STM32EXTI——外部中斷資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設(shè)計(jì)、用戶指南、解決方案等資料,希望可以幫助
    發(fā)表于 04-14 08:53 ?6次下載
    <b class='flag-5'>STM32</b>之<b class='flag-5'>EXTI</b>——<b class='flag-5'>外部</b><b class='flag-5'>中斷</b>資料下載

    STM32外部中斷

    事件(上升沿或下降沿或雙邊沿)并能夠單獨(dú)地屏蔽:有一個(gè)掛起寄存器維持所有中斷請(qǐng)求的狀態(tài)。EXTI可以檢測(cè)到脈沖寬度小于內(nèi)部APB2的時(shí)鐘周期。多達(dá)80個(gè)通用IO口連接到16個(gè)外部
    發(fā)表于 11-22 13:51 ?23次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>外部</b><b class='flag-5'>中斷</b>

    STM32外部中斷實(shí)驗(yàn)-EXTI

    STM32 外部中斷簡(jiǎn)介STM32 的每個(gè) IO 都可以作為外部
    發(fā)表于 11-29 16:06 ?9次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>外部</b><b class='flag-5'>中斷</b>實(shí)驗(yàn)-<b class='flag-5'>EXTI</b>

    STM32外部中斷

    事件(上升沿或下降沿或雙邊沿)并能夠單獨(dú)地屏蔽:有一個(gè)掛起寄存器維持所有中斷請(qǐng)求的狀態(tài)。EXTI可以檢測(cè)到脈沖寬度小于內(nèi)部APB2的時(shí)鐘周期。多達(dá)80個(gè)通用IO口連接到16個(gè)外部
    發(fā)表于 01-14 15:14 ?2次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>外部</b><b class='flag-5'>中斷</b>

    STM32_EXTI外部中斷學(xué)習(xí)筆記

    參考資料:《STM32F4xx中文參考手冊(cè)》系統(tǒng)配置控制器以及中斷和事件章節(jié)。EXTI( External interrupt /evet controller)之前接觸過(guò)51單片機(jī)的都了解到51
    發(fā)表于 01-14 15:21 ?3次下載
    <b class='flag-5'>STM32_EXTI</b><b class='flag-5'>外部</b><b class='flag-5'>中斷</b>學(xué)習(xí)筆記

    STM32 外部中斷/事件控制器EXTI

    EXTI(External interrupt/event controller)—外部中斷/事件控制器,管理了控制器的20個(gè)中斷/事件線。每個(gè)中斷
    發(fā)表于 01-14 15:26 ?0次下載
    <b class='flag-5'>STM32</b> <b class='flag-5'>外部</b><b class='flag-5'>中斷</b>/事件控制器<b class='flag-5'>EXTI</b>

    STM32CUBEMX(11)--外部中斷(EXTI)

    外部中斷和事件控制器 (EXTI) 管理外部和內(nèi)部異步事件 / 中斷,并生成相應(yīng)的事件請(qǐng)求到CPU/
    的頭像 發(fā)表于 11-14 16:39 ?1810次閱讀
    <b class='flag-5'>STM32</b>CUBEMX(11)--<b class='flag-5'>外部</b><b class='flag-5'>中斷</b>(<b class='flag-5'>EXTI</b>)

    STM32外部中斷

    STM32F10x 的 EXTI外部 IO 口使用的中斷線有 16 根,但是我們使用的 STM32
    的頭像 發(fā)表于 02-10 14:53 ?2339次閱讀
    <b class='flag-5'>STM32</b>的<b class='flag-5'>外部</b><b class='flag-5'>中斷</b>

    STM32外部中斷控制器EXTI詳解

    什么是外部中斷控制器,外部中斷控制器在STM32芯片中處于什么位置,它的作用是什么,EXTI與G
    的頭像 發(fā)表于 04-20 11:44 ?2523次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>外部</b><b class='flag-5'>中斷</b>控制器<b class='flag-5'>EXTI</b>詳解

    STM32CUBEIDE(14)----外部中斷EXTI

    外部中斷和事件控制器 (EXTI) 管理外部和內(nèi)部異步事件 / 中斷,并生成相應(yīng)的事件請(qǐng)求到CPU/
    的頭像 發(fā)表于 07-26 14:33 ?1274次閱讀
    <b class='flag-5'>STM32</b>CUBEIDE(14)----<b class='flag-5'>外部</b><b class='flag-5'>中斷</b><b class='flag-5'>EXTI</b>

    STM32L4外部中斷及事件控制模塊(EXTI)

    電子發(fā)燒友網(wǎng)站提供《STM32L4外部中斷及事件控制模塊(EXTI).pdf》資料免費(fèi)下載
    發(fā)表于 08-01 10:23 ?0次下載
    <b class='flag-5'>STM32</b>L4<b class='flag-5'>外部</b><b class='flag-5'>中斷</b>及事件控制模塊(<b class='flag-5'>EXTI</b>)

    STM32如何配置外部中斷STM32外部中斷配置步驟

    STM32如何配置外部中斷?STM32外部中斷配置步驟? 作為一款現(xiàn)代化的微控制器,
    的頭像 發(fā)表于 10-26 17:47 ?3211次閱讀