一、前言
萬物皆有源頭,大家學(xué)習(xí)單片機(jī)的源頭操作就是通過GPIO口點(diǎn)燈,GPIO作為STM32最基礎(chǔ)的外設(shè),也是大家最先接觸的外設(shè)。 當(dāng)然,看似基礎(chǔ)的GPIO,不僅僅是簡單的設(shè)置好IO口,讓燈亮起就一了百了,了解清楚GPIO的使用特性,根本原理、運(yùn)行機(jī)制對我們在涉及到GPIO的相關(guān)設(shè)計(jì)操作上會應(yīng)用的更加自如。
GPIO就是通用輸入/輸出接口(General-Purpose IO ports),可以配置成輸出模式來控制外部設(shè)備,也可以配置成輸入模式來讀取外部信號,是 STM32的一種外設(shè),連接芯片外部的引腳,其引腳可以供使用者自由的進(jìn)行控制。 將STM32芯片的GPIO引腳與外部設(shè)備連接起來,也可以實(shí)現(xiàn)與外部通訊、控制以及數(shù)據(jù)采集的功能。 GPIO 最簡單的功能是輸出高低電平; GPIO 還可以被設(shè)置為輸入功能,用于讀取按鍵等輸入信號; 也可以將GPIO復(fù)用成芯片上的其他外設(shè)的控制引腳。
后續(xù)將從以下圖1中所示的幾個(gè)方面對GPIO進(jìn)行詳細(xì)的解析。
圖1 GPIO學(xué)習(xí)框架
二、基本結(jié)構(gòu)概述
首先對GPIO的基本結(jié)構(gòu)進(jìn)行詳細(xì)分析。 了解GPIO的基本結(jié)構(gòu)對GPIO的模塊的靜態(tài)全貌、運(yùn)行機(jī)理、配置使用有很好的幫助,圖2為STM32的5V容忍的GPIO口內(nèi)部基本結(jié)構(gòu)圖,圖3為GPIO的基本結(jié)構(gòu)中各個(gè)模塊部分的概述。
圖2 STM32的5V容忍的GPIO內(nèi)部基本結(jié)構(gòu)
圖3 GPIO基本結(jié)構(gòu)包含的功能概述
Q :什么是5V容忍?
A : 在數(shù)字電平的規(guī)范中,有很多電壓都被設(shè)置為邏輯電平,比較典型的有5V,3.3V,2.5V,1.8V,1.2V等等,通常的規(guī)律是電路運(yùn)行的速度越快,使用的邏輯電平電壓越低。
而STM32使用的是3.3V的邏輯電平,各個(gè)引腳輸出與輸入的邏輯電平應(yīng)該是3.3V,ST公司為了增加芯片的兼容性,實(shí)現(xiàn)了對5V邏輯電平的容忍,意思是可以正常識別5V的邏輯電平信號而不至于因?yàn)檫壿嬰娖诫妷焊哂谧陨淼?.3V標(biāo)準(zhǔn)而損壞芯片,這里的容忍就是正常識別不損壞的意思。
圖4 STM32芯片手冊中GPIO的定義
一般而言能夠容忍5V的話都會寫有“FT”兩個(gè)字。 因此,并不是所有的I/O都是能容忍5V的。 注意:如果引腳設(shè)置的是模擬輸入模式,則不能接5V!
下圖為GPIO引腳電壓特性和電流特性的絕對最大額定值。
圖5 STM32芯片手冊中GPIO的電壓電流特性
加在器件上的電壓或電流如果超過絕對最大額定值,可能會導(dǎo)致器件永久性地?fù)p壞。 這里只是給出能承受的最大電壓或電流,并不意味在此條件下器件的功能性操作無誤,器件長期工作在最大值條件下會影響器件的可靠性。
三、基本結(jié)構(gòu)詳述
從圖2中可以看出,從右往左為GPIO在芯片內(nèi)部的連接通路。 各個(gè)模塊描述如下:
(1)保護(hù)二極管
引腳上的這兩個(gè)保護(hù)二極管可以將引腳外部過高或過低的電壓進(jìn)行鉗位,當(dāng)引腳電壓高于VDD_FT 或VDD 時(shí),上方的二極管導(dǎo)通吸收這個(gè)高電壓,當(dāng)引腳電壓低于VSS 時(shí),下方的二極管導(dǎo)通,防止不正常電壓引入芯片導(dǎo)致芯片燒毀。 水平的檢測管腳Pin是受保護(hù)的節(jié)點(diǎn)。 當(dāng)該點(diǎn)電壓超過VDD+VD1(0.7V)時(shí),上面的二極管導(dǎo)通。 而當(dāng)該點(diǎn)電壓小于-VD2(-0.7V)時(shí),下面的二極管導(dǎo)通。 因此,該點(diǎn)電壓被鉗制在VDD+VD1到-VD2間。
盡管STM32 芯片內(nèi)部有這樣的保護(hù),但并不意味著STM32 的引腳就無所不能,從之前的電流特性表中可知,IO口的電流很小,如果直接將引腳連接大功率器件,比如電機(jī),那么要么電機(jī)不轉(zhuǎn),要么燒壞芯片。 因此若要驅(qū)動一些大功率器件,必須要加大功率及隔離電路驅(qū)動。 也可以說STM32引腳是用來做控制,而不是做驅(qū)動使用的。
圖6 鉗位二極管圖
(2)上下拉電阻
上拉和下拉電阻上都有一個(gè)開關(guān),通過配置上下拉電阻開關(guān),可以控制引腳的默認(rèn)狀態(tài)電平。 當(dāng)開啟上拉時(shí)引腳默認(rèn)電壓為高電平,開啟下拉時(shí),引腳默認(rèn)電壓為低電平,這樣就可以消除引腳不定狀態(tài)的影響。 當(dāng)然也可以將上拉和下拉的開關(guān)都關(guān)斷,這種狀態(tài)我們稱為浮空模式,一旦配置成這個(gè)模式,引腳的電壓是不確定的,如果用萬用表測量此模式下管腳電壓時(shí)會發(fā)現(xiàn)只有1 點(diǎn)幾伏,而且還不時(shí)改變,所以一般情況下我們都會給引腳設(shè)置成上拉或者下拉模式,使它有一個(gè)默認(rèn)狀態(tài)。 STM32 上下拉及浮空模式的配置是通過GPIOx_CRL 和GPIOx_CRH 寄存器控制的。 STM32 內(nèi)部的上拉其實(shí)是一個(gè)弱上拉,也就是說通過此上拉電阻輸出的電流很小,如果想要輸出一個(gè)大電流,那么就需要外接上拉電阻了。
圖7 上下拉電阻圖
下圖可以知曉STM32芯片的GPIO口上下拉電阻的最小值,典型值和最大值。
圖8 STM32芯片手冊給定的GPIO上下拉電阻值
(3)P-MOS -N-MOS 管
圖2中GPIO 引腳經(jīng)過兩個(gè)保護(hù)二極管后就分成兩路,上面一路是經(jīng)過輸入驅(qū)動器為“輸入模式”,下面一路經(jīng)過輸出驅(qū)動器為“輸出模式”。
當(dāng)為輸出模式時(shí),線路經(jīng)過輸出控制緩沖器到一個(gè)由P-MOS 和N-MOS管組成的雙MOS電路,因此GPIO 引腳可以配置成推挽和開漏兩種輸出模式。
圖9 雙MOS電路圖
推挽輸出模式,是根據(jù)P-MOS 和N-MOS 管的工作方式命名的。 在該結(jié)構(gòu)單元輸入一個(gè)高電平時(shí),P-MOS 管導(dǎo)通,N-MOS 管截止(可以將P-MOS 看作NPN三極管,N-MOS看作PNP 三極管),對外輸出高電平(3.3V)。 在該單元輸入一個(gè)低電平時(shí),P-MOS 管截止,N-MOS 管導(dǎo)通,對外輸出低電平(0V)。 如果當(dāng)切換輸入高低電平時(shí),兩個(gè)MOS 管將輪流導(dǎo)通,一個(gè)負(fù)責(zé)灌電流(電流輸出到負(fù)載),一個(gè)負(fù)責(zé)拉電流(負(fù)載電流流向芯片),使其負(fù)載能力和開關(guān)速度都比普通的方式有很大的提高。
圖10 推挽輸出
開漏輸出模式時(shí),不論輸入是高電平還是低電平,P-MOS 管總處于關(guān)閉狀態(tài)。 當(dāng)給這個(gè)單元電路輸入低電平時(shí),N-MOS 管導(dǎo)通,輸出即為低電平。 當(dāng)輸入高電平時(shí),N-MOS 管截止,這個(gè)時(shí)候引腳狀態(tài)既不是高電平,又不是低電平,我們稱之為高阻態(tài)。 如果想讓引腳輸出高電平,那么引腳必須外接一個(gè)上拉電阻,由上拉電阻提供高電平。 開漏輸出模式等效電路圖如圖所示。
圖11 開漏輸出
在開漏輸出模式中還有一個(gè)特點(diǎn),引腳具有“線與”關(guān)系。 就是說如果有很多個(gè)開漏輸出模式的引腳接在一起,只要有一個(gè)引腳為低電平,其他所有管腳都為低,即把所有引腳連接在一起的這條總線拉低了。 只有當(dāng)所有引腳輸出高阻態(tài)時(shí)這條總線的電平才由上拉電阻的VDD 決定。 如果VDD 連接的是3.3V,那么引腳輸出的就是3.3V,如果VDD 連接的是5V,那么引腳輸出的就是5V。 因此如果想要讓STM32 管腳輸出5V,可以選擇開漏輸出模式,然后在外接上拉電阻的電源VDD 上連接5V 即可,前提是這個(gè)STM32引腳是容忍5V 的。
開漏輸出模式一般應(yīng)用在I2C、SMBUS 通訊等需要“線與”功能的總線電路中。 還可以用在電平不匹配的場合中,就如上面說的輸出5V 一樣。 推挽輸出模式一般應(yīng)用在輸出電平為0-3.3V 而且需要高速切換開關(guān)狀態(tài)的場合。 除了必須要用開漏輸出模式的場合,我們一般選擇推挽輸出模式。 要配置引腳是開漏輸出還是推挽輸出模式可以使用GPIOx_CRL 和GPIOx_CRH 寄存器。
(4)輸出數(shù)據(jù)寄存器
前面提到的雙MOS 管結(jié)構(gòu)電路的輸入信號,由GPIO“輸出數(shù)據(jù)寄存器GPIOx_ODR”提供,因此通過修改圖12中輸出數(shù)據(jù)寄存器的值就可以修改GPIO 引腳的輸出電平,同時(shí)“輸出數(shù)據(jù)寄存器GPIOx_ODR”的數(shù)值狀態(tài)也是可讀的。
而如果需要對輸出電平信號進(jìn)行原子操作,可以通過圖12中“置位/復(fù)位寄存器GPIOx_BSRR”修改輸出數(shù)據(jù)寄存器的值從而改變GPIO的輸出。 該寄存器是只寫寄存器,通過寫入 “置位/復(fù)位寄存器GPIOx_BSRR”狀態(tài),可分別對 “輸出數(shù)據(jù)寄存器GPIOx_ODR” 進(jìn)行置位和復(fù)位。
剛開始或許你跟我一樣有以下疑惑:既然ODR 能控制管腳高低電平,為什么還需要BSRR寄存器?
意法半導(dǎo)體給的答案就是用BSRR去改變管腳狀態(tài)的時(shí)候是原子操作置位/復(fù)位,沒有被中斷打斷的風(fēng)險(xiǎn)。 也就不需要關(guān)閉中斷,關(guān)閉中斷明顯會延遲或丟失一事件的捕獲,所以控制GPIO的狀態(tài)最好可以用BSRR。
圖12 輸出數(shù)據(jù)寄存器部分圖
(5)復(fù)用功能輸出
STM32 的GPIO 引腳不僅僅可以用作普通IO輸出電平進(jìn)行控制,還可以用作芯片上其他外設(shè)的復(fù)用功能引腳。 因此當(dāng)使用復(fù)用功能的時(shí)候,也就是其他外設(shè)復(fù)用功能輸出信號將直接經(jīng)過圖12中輸出控制緩沖器后,作為雙MOS 管電路的輸入,其中信號在進(jìn)入輸出控制緩沖器之前,需要選擇使用復(fù)用功能還是普通IO 口功能。 例如,我們使用USART 串口通訊時(shí),需要用到某個(gè)GPIO 引腳作為通訊發(fā)送引腳,這個(gè)時(shí)候就可以把該GPIO 引腳配置成USART 串口復(fù)用功能,由芯片上的串口外設(shè)控制該引腳,發(fā)送數(shù)據(jù)。 具體使用的GPIO口具備哪些復(fù)用功能,可以查閱具體的芯片手冊得到。
圖13 STM32芯片手冊中GPIO復(fù)用功能定義
(6)輸入數(shù)據(jù)寄存器
輸入數(shù)據(jù)寄存器是由IO口經(jīng)過上下拉電阻、TTL施密特觸發(fā)器引入。 當(dāng)信號經(jīng)過TTL施密特觸發(fā)器,模擬信號將變?yōu)?a target="_blank">數(shù)字信號0或1,然后存儲在輸入數(shù)據(jù)寄存器中,通過讀取“輸入數(shù)據(jù)寄存器GPIOx_IDR” 就可以知道IO 口的電平狀態(tài)。
施密特觸發(fā)器:簡單來說,就是當(dāng)輸入電壓高于正向閾值電壓,輸出為高; 當(dāng)輸入電壓低于負(fù)向閾值電壓,輸出為低; 當(dāng)輸入在正負(fù)向閾值電壓之間,輸出不改變。 因此只有當(dāng)輸入電壓發(fā)生足夠的變化時(shí),輸出才會變化,因此將這種元件命名為觸發(fā)器。 這種雙閾值動作被稱為遲滯現(xiàn)象,表明施密特觸發(fā)器有記憶性。 從本質(zhì)上來說,施密特觸發(fā)器是一種雙穩(wěn)態(tài)多諧振蕩器。
施密特觸發(fā)器可作為波形整形電路,能將模擬信號波形整形為數(shù)字電路能夠處理的方波波形,而且由于施密特觸發(fā)器具有滯回特性,所以可用于抗干擾。
圖14 輸入數(shù)據(jù)寄存器部分圖
(7)復(fù)用功能輸入
復(fù)用功能輸入和復(fù)用功能輸出類似。 在復(fù)用功能輸入模式時(shí),GPIO 引腳的信號傳輸?shù)絊TM32芯片上 其它外設(shè),由該外設(shè)讀取引腳的狀態(tài)。 同樣,如我們使用USART 串口通訊時(shí),需要用到某個(gè)GPIO 引腳作為通訊接收引腳,這個(gè)時(shí)候就可以把該GPIO 引腳配置成USART 串口復(fù)用功能,使USART 可以通過該通訊引腳的接收外部通信線上的數(shù)據(jù)。
(8)模擬輸入輸出
當(dāng)GPIO 引腳用于ADC 采集電壓的輸入通道時(shí),用作“模擬輸入”功能,如圖14所示,此時(shí)信號是不經(jīng)過施密特觸發(fā)器的,因?yàn)榻?jīng)過施密特觸發(fā)器后信號只有0或1 兩種狀態(tài),ADC 外設(shè)要采集到原始的模擬信號,信號源輸入必須在施密特觸發(fā)器之前。 類似地,當(dāng)GPIO 引腳用于DAC 作為模擬電壓輸出通道時(shí),此時(shí)作為“模擬輸出”功能,如圖12所示,DAC 的模擬信號輸出就不經(jīng)過雙MOS 管結(jié)構(gòu)了,模擬信號直接通過管腳輸出。
四、總結(jié)
以上針對STM32芯片的GPIO基本結(jié)構(gòu)中各個(gè)模塊的原理和作用分別進(jìn)行了介紹,可以對GPIO的靜態(tài)全貌有一個(gè)初步的了解,在下一篇將繼續(xù)介紹GPIO基礎(chǔ)知識篇之工作模式。
評論
查看更多