偶爾會有人問起STM32芯片的GPIO做輸出時還是否可能作為外部中斷觸發(fā)輸入,這里一起聊聊該話題。
作為STM32芯片,其外部中斷觸發(fā)源可以是硬件模式或軟件模式。所謂軟件模式就是通過操作相關寄存器產(chǎn)生內(nèi)部中斷觸發(fā)信號并向內(nèi)核NVIC控制器申請中斷。硬件模式自然是指來自GPIO引腳的電平跳變信號經(jīng)邊沿檢測器形成中斷觸發(fā)信號向內(nèi)核申請中斷?!咀ⅲ哼€有個別外設事件也可以作為外部中斷觸發(fā)源映射到外部中斷控制器?!?/p>

我們這里要談的是基于硬件模式的外部中斷話題。當STM32的GPIO作為輸出時,可能是通用GPIO輸出也可能是基于其它外設復用情況下的輸出,即復用輸出。
下圖是GPIO作為基本輸入輸出時的功能框圖。

下面是GPIO作為其它外設的復用輸出腳時的功能框圖。

不難看出,所謂GPIO復用輸出,就是將自身輸出數(shù)據(jù)寄存器與輸出控制電路及外部管腳斷開來,并將輸出控制電路及外部管腳借讓給其它外設使用。通俗點說,所謂GPIO復用輸出就是其它外設找GPIO借道而已。
從上面兩幅圖來看,不論GPIO通用輸出還是復用輸出,外部管腳的電平都可以連接到內(nèi)部輸入單元,管腳上的電平也應該可以被內(nèi)部邊沿檢測器檢測到。也就是說,即使GPIO作為輸出,只要管腳上的電平跳變能被邊沿檢測器識別,按理可以作為外部中斷觸發(fā)源。
下面不妨用個簡單的實例驗證下。
這里使用一塊STM32F4系列的開放板,通過定時器1的通道1輸出8個PWM信號,同時將該定時器輸出通道所用管腳PA8配置為上升沿觸發(fā)的外部中斷輸入。PC13接一個按鍵,每按鍵一次啟動定時器輸出8個脈沖。
我使用STM32CubeMx圖形化工具進行配置。因為要把PWM輸出腳同時配置為外部中斷輸入這里不好操作。我先借用旁邊的PA9進行配置,等生成初始化代碼后我再將PA9改成PA8以及對應的中斷矢量。TIM1配置在單脈沖模式,我在PC3按鍵中斷里啟動TIM1的計數(shù)器。
TIM1的基本配置如下:

再就是兩個GPIO端口PC13/PA9的EXTI配置,分別對應按鍵腳和PWM輸出腳。

將時鐘、調(diào)試口等配置完畢后生成初始化代碼,然后在代碼里將之前基于PA9生成的代碼改為基于TIM1-CH1的輸出腳PA8的。

主程序功能代碼很簡單,就是配置TIM1-CH1的pwm輸出。

在用戶按鍵中斷程序里啟動TIM1的計數(shù)器。

在基于PWM輸出腳PA8對應的外部中斷程序里對中斷次數(shù)進行統(tǒng)計。因它被配置為上沿觸發(fā),每次連續(xù)輸出8個脈沖的話,統(tǒng)計值應該為8。

下面看看代碼運行結果:
每按鍵一次輸出8個脈沖,沒有問題。

再看看基于這個8個輸出脈沖統(tǒng)計到中斷次數(shù),也確實為8次?!救缦聢D所示]

顯然,當GPIO做為輸出時還是可以感受到外部管腳電平的變化情況,并可以做為外部中斷觸發(fā)源申請中斷。結合上面GPIO輸出模式下的功能框圖來看,當它被配置為輸出時是具備雙向特性的。當然,一般來講,如果希望GPIO做為雙向驅(qū)動口使用時,建議將其配置為OD開漏結合上拉模式。比方在做I2C應用時,將通信GPIO端口配置為開漏模式結合上拉電阻即可進行雙向數(shù)據(jù)通信,無須對通信口的GPIO模式來回切換。
-
寄存器
+關注
關注
31文章
5527瀏覽量
128612 -
GPIO
+關注
關注
16文章
1309瀏覽量
55573
原文標題:GPIO做輸出還能作外部中斷輸入嗎?
文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
中科昊芯Core_DSC280025C開發(fā)板的外部中斷問題
基于小凌派RK2206開發(fā)板:OpenHarmony如何使用IoT接口控制GPIO中斷
ADS2812做UPS使用外部AD8364,PWM中斷觸發(fā)外部AD,但電流采樣不到是為什么?
GPIO使用教程 GPIO接口應用
串口中斷是內(nèi)部中斷還是外部中斷,串口中斷是怎么觸發(fā)的
GPIO在嵌入式系統(tǒng)中的作用
GPIO在物聯(lián)網(wǎng)中的應用
GPIO在樹莓派中的應用
如何配置GPIO引腳
TMS320C645x DSP通用輸入/輸出(GPIO)用戶指南

GPIO做輸出還能作外部中斷輸入嗎?
評論