一、GPIO簡(jiǎn)介 GPIO是通用輸入輸出端口的簡(jiǎn)稱,簡(jiǎn)單來(lái)說(shuō)就是STM32可控制的引腳,STM32芯片的GPIO引腳與外部設(shè)備連接起來(lái),從而實(shí)現(xiàn)與外部通訊、控制以及數(shù)據(jù)采集的功能。STM32芯片的GPIO被分成很多組,每組有16個(gè)引腳,所有的GPIO引腳都有基本的輸入輸出功能。 最基本的輸出功能是由STM32控制引腳輸出高、低電平,實(shí)現(xiàn)開(kāi)關(guān)控制,如把GPIO引腳接入LED燈,那就可以控制LED燈的亮滅,引腳接入到繼電器或三極管,那就可以通過(guò)繼電器或三極管控制外部大功率電路的通斷。 最基本的輸入功能是檢測(cè)外部電平,如把GPIO引腳連接到按鍵,通過(guò)電平高低區(qū)分按鍵是否被按下。 二、GPIO框圖剖析 通過(guò)GPIO硬件結(jié)構(gòu)框圖,就可以從整體上深入了解GPIO外設(shè)及它的各種應(yīng)用模式,該圖從最右端看起,最右端就是代表STM32芯片引出的GPIO引腳,其它部件都位于芯片內(nèi)部。 1、保護(hù)二極管及上、下拉電阻 引腳的兩個(gè)保護(hù)二極管可以防止引腳外部過(guò)高或過(guò)低的電壓輸入,當(dāng)引腳電壓高于時(shí),上方的二極管導(dǎo)通,當(dāng)引腳電壓低于Vss時(shí),下方的二極管導(dǎo)通,防止不正常電壓引入芯片導(dǎo)致芯片燒毀。 上下拉電阻,從它的結(jié)構(gòu)我們可以看出,通過(guò)上、下拉電阻的開(kāi)關(guān)配置,我們可以控制引腳默認(rèn)狀態(tài)的電壓,開(kāi)啟上拉的時(shí)候引腳電壓為高電平,開(kāi)啟下拉的時(shí)候引腳電壓為低電平。也可以設(shè)置“既不上拉也不下拉模式”,我們也把這種狀態(tài)稱為浮空模式,配置成這個(gè)模式時(shí),直接用電壓表測(cè)量其引腳電壓為1點(diǎn)幾伏,這是個(gè)不確定的值。所以一般來(lái)說(shuō)我們都會(huì)選擇給引腳設(shè)置“上拉模式”或“下拉模式”使它有默認(rèn)狀態(tài)。STM32的內(nèi)部上拉時(shí)“弱上拉”,即通過(guò)上拉輸出的電流時(shí)很弱的,如要求大電流還是需要外部上拉,通過(guò)“上拉/下拉寄存器GPIOx_PUPDR”控制引腳的上、下拉及浮空模式。 2、P-MOS管和N-MOS管 GPIO引腳線路經(jīng)過(guò)兩個(gè)保護(hù)二極管后,向上流向“輸入模式”結(jié)構(gòu),向下流向“輸出模式”結(jié)構(gòu)。先看輸出模式部分,線路經(jīng)過(guò)一個(gè)由P-MOS和N-MOS管組成的單元電路,這個(gè)結(jié)構(gòu)使GPIO具有了“推挽輸出”和“開(kāi)漏輸出”兩種模式。 所謂的推挽輸出模式,是根據(jù)這兩個(gè)MOS管的工作方式來(lái)命名的。在該結(jié)構(gòu)中輸入高電平時(shí),經(jīng)過(guò)反向后,上方的P-MOS導(dǎo)通,下方的N-MOS關(guān)閉,對(duì)外輸出高電平;而在該結(jié)構(gòu)中輸入低電平時(shí),經(jīng)過(guò)反向后,N-MOS導(dǎo)通,P-MOS關(guān)閉,對(duì)外輸出低電平,當(dāng)引腳高低電平切換時(shí),兩個(gè)管子輪流導(dǎo)通,P管負(fù)責(zé)灌電流,N管負(fù)責(zé)拉電流,使其負(fù)載能力和開(kāi)關(guān)速度都比普通的方式由很大的提高。推挽輸出的低電平為0伏,高電平為3.3V,如下圖,它是推挽輸出模式時(shí)的等效電路。 而在開(kāi)漏輸出模式時(shí),上方的P-MOS完全不工作。如果我們控制輸出為0,低電平,則P-MOS管完全關(guān)閉,N-MOS管導(dǎo)通,使輸出接地,若控制輸出為1(它無(wú)法直接輸出高電平)時(shí),則P-MOS和N-MOS都關(guān)閉,所以引腳既不輸出高電平也不輸出低電平,為高阻態(tài)。為了正常使用時(shí)必須外部接上拉電阻,參考下圖中的等效電路。它具有“線與”特性,也就是說(shuō),若有很多個(gè)開(kāi)漏模式引腳連接到一起時(shí),只有當(dāng)所有引腳都輸出高阻態(tài),才由上拉電阻提供高電平,此電平的電壓為外部上拉電阻所接的電源的電壓。若其中一個(gè)引腳為低電平,那線路就相當(dāng)于短路接地,使得整條線路都為低電平,0伏。 推挽輸出模式一般應(yīng)用在輸出電平0和3.3伏而且需要高速切換開(kāi)關(guān)狀態(tài)的場(chǎng)合。在STM32的應(yīng)用中,除了必須用開(kāi)漏模式的場(chǎng)合,我們都習(xí)慣使用推挽輸出模式。開(kāi)漏輸出一般應(yīng)用在I2C、SMBUS通訊等需要“線與”功能的總線電路中。除此之外,還用在電平不匹配的場(chǎng)合,如需要輸出5伏的高電平,就可以在外部接一個(gè)上拉電阻,上拉電源為5伏,并且把GPIO設(shè)置為開(kāi)漏模式,當(dāng)輸出高阻態(tài)時(shí),由上拉電阻和電源向外輸出5伏電平,如下圖所示。 3、輸出數(shù)據(jù)寄存器 前面提到的雙MOS管結(jié)構(gòu)電路的輸入信號(hào),是由GPIO“輸出數(shù)據(jù)寄存器“GPIOx_ODR”提供的,因此我們通過(guò)修改輸出數(shù)據(jù)寄存器的值就可以修改GPIO引腳的輸出電平。 而”置位/復(fù)位寄存器GPIOx_BSRR“可以通過(guò)修改輸出數(shù)據(jù)寄存器的值從而影響電路的輸出。 4、復(fù)用功能輸出 “復(fù)用功能輸出”中的“復(fù)用”是指STM32的其他片上外設(shè)對(duì)GPIO引腳進(jìn)行控制,此時(shí)GPIO引腳用作該外設(shè)的一部分,算第二用途。從其他外設(shè)引出來(lái)的“復(fù)用功能輸出信號(hào)”與GPIO本身的數(shù)據(jù)寄存器都連接到雙MOS管結(jié)構(gòu)中,通過(guò)途中梯形結(jié)構(gòu)作為開(kāi)關(guān)切換選擇。 例如我們使用USART串口通訊時(shí),需要用到某個(gè)GPIO引腳作為通訊發(fā)送引腳,這個(gè)時(shí)候就可以把該GPIO引腳配置成USART串口復(fù)用功能,由串口外設(shè)控制該引腳,發(fā)送數(shù)據(jù)。 5、輸入數(shù)據(jù)寄存器 看GPIO結(jié)構(gòu)框圖的上半部分,它時(shí)GPIO引腳經(jīng)過(guò)上、下拉電阻后引入的,它連接到施密特觸發(fā)器,信號(hào)經(jīng)過(guò)觸發(fā)器后,模擬信號(hào)轉(zhuǎn)化為0、1的數(shù)字信號(hào),然后存儲(chǔ)再“輸出數(shù)據(jù)寄存器GPIOx_IDR”中,通過(guò)讀取該寄存器就可以了解GPIO引腳的電平狀態(tài)。 6、復(fù)用功能輸入 與“復(fù)用功能輸出”模式類似,在“復(fù)用功能輸出模式”時(shí),GPIO引腳的信號(hào)傳輸?shù)絊TM32其他片上外設(shè),由該外設(shè)讀取引腳狀態(tài)。 同樣,如我們使用USART串口通訊時(shí),需要用到某個(gè)GPIO引腳作為通訊接收引腳,這個(gè)時(shí)候就可以把該GPIO引腳配置成USART串口復(fù)用功能,使USART可以通過(guò)該通訊引腳接收遠(yuǎn)端數(shù)據(jù)。 7、模擬輸入輸出 當(dāng)GPIO引腳用于ADC采集電壓的輸入通道時(shí),用作“模擬輸入功能”,此時(shí)信號(hào)時(shí)不經(jīng)過(guò)施密特觸發(fā)器的,因?yàn)榻?jīng)過(guò)施密特觸發(fā)器后信號(hào)只有0、1兩種狀態(tài),所以ADC外設(shè)要采集到原始的模擬信號(hào),信號(hào)源輸入必須在施密特觸發(fā)器之前。類似的,當(dāng)GPIO引腳用于DAC作為模擬電壓輸出通道時(shí),此時(shí)作為“模擬輸出”功能,DAC的模擬信號(hào)輸出就不經(jīng)過(guò)雙MOS管結(jié)構(gòu)了,在啊GPIO結(jié)構(gòu)框圖的右下角處,模擬信號(hào)直接輸出到引腳。同時(shí),當(dāng)GPIO用于模擬功能時(shí)(包括輸入輸出),引腳的上、下拉電阻是不起作用的。這個(gè)時(shí)候即使在寄存器配置了上拉或下拉模式,也不會(huì)影響到模擬信號(hào)的輸入輸出。 三、GPIO工作模式總結(jié) 1、輸入模式(上拉/下拉/浮空) 在輸入模式時(shí),施密特觸發(fā)器打開(kāi),輸出被禁止。數(shù)據(jù)寄存器每隔1個(gè)AHB1時(shí)鐘周期更新一次,可通過(guò)數(shù)據(jù)寄存器GPIOx_IDR讀取I/O狀態(tài)。其中AHB1的時(shí)鐘如按默認(rèn)配置一般為180MHz。 2、輸出模式·(推挽/開(kāi)漏,上拉/下拉) 在輸出模式中,輸出使能,推完模式時(shí)以雙MOS管的方式工作,輸出數(shù)據(jù)寄存器GPIOx_ODR可控制I/O輸出高低點(diǎn)評(píng)。開(kāi)漏模式時(shí),只有N-MOS工作,輸出數(shù)據(jù)寄存器可控制I/O輸出高阻態(tài)或低電平。輸出速度可配置,有2MHz\25MHz\50MHz\100MHz的選項(xiàng)。此處的輸出速度即I/O支持的高低電平狀態(tài)最高切換頻率,支持的頻率越高,功耗越大,如果功耗要求不嚴(yán)格,把速度設(shè)置成最大即可。 此時(shí)施密特觸發(fā)器時(shí)打開(kāi)的,即輸入可用,通過(guò)輸入數(shù)據(jù)寄存器GPIOx_IDR可讀取I/O的實(shí)際狀態(tài)。 用于輸出模式時(shí),可使用上拉、下拉或懸空模式。但此時(shí)由于輸出模式時(shí)引腳電平會(huì)收到ODR寄存器的影響,而ODR寄存器對(duì)應(yīng)引腳的位為0,即引腳初始化后默認(rèn)輸出低電平,所以在這種情況下,上拉只能起到小幅提高輸出電流能力,但不會(huì)影響引腳的默認(rèn)狀態(tài)。 3、復(fù)用功能(推挽/開(kāi)漏,上拉/下拉) 復(fù)用功能模式中,輸出使能,輸出速度可配置,可工作在開(kāi)漏及推挽模式,但是輸出信號(hào)源于其它外設(shè),輸出數(shù)據(jù)寄存器GPIOx_ODR無(wú)效;輸入可用,通過(guò)輸入數(shù)據(jù)寄存器可獲取I/O實(shí)際狀態(tài),但一般直接用外設(shè)的寄存器來(lái)獲取該數(shù)據(jù)信號(hào)。 用于復(fù)用功能時(shí),可使用上拉、下拉或者浮空模式。同輸出模式,在這種情況下,初始化后引腳默認(rèn)輸出低電平,上拉只起到小幅提高輸出電流能力,但不會(huì)影響引腳的默認(rèn)狀態(tài)。 4、模擬輸入輸出 模擬輸入輸出模式中,雙MOS管結(jié)構(gòu)被關(guān)閉,施密特觸發(fā)器停用,上/下拉也被禁止,其他外設(shè)通過(guò)模擬通道進(jìn)行輸入輸出。 通過(guò)GPIO寄存器寫(xiě)入不同的參數(shù),就可以改變GPIO的用用模式。再GPIO外設(shè)中,通過(guò)設(shè)置“模式寄存器GPIOx_MODER”可配置GPIO的輸出/輸出/復(fù)用/模擬模式,“輸出類型寄存器GPIOx_OTYPER”配置推挽/開(kāi)漏模式,配置“輸出速度寄存器GPIOx_OSPEEDR”可選2/25/50/100MHz輸出速度,“上/下拉寄存器GPIOx_PUPDR”可配置上拉/下拉/浮空模式,各寄存器的具體參數(shù)見(jiàn)下表。 |
|
來(lái)自: 亮劍7mgtxtuz0o > 《硬件》