1. 程式人生 > >使用寄存器點亮LED(第1節)—GPIO功能框圖講解

使用寄存器點亮LED(第1節)—GPIO功能框圖講解

smbus 其它 block 負載能力 tst 很好 通用 描述 大致

GPIO簡介

GPIO 是通用輸入輸出端口的簡稱,簡單來說就是 STM32 可控制的引腳, STM32 芯片的 GPIO 引腳與外部設備連接起來,從而實現與外部通訊、控制以及數據采集的功能。STM32 芯片的 GPIO 被分成很多組,每組有 16 個引腳,如型號為 STM32F103VET6 型號的。芯片有 GPIOA、 GPIOB、 GPIOC 至 GPIOE 共 5 組 GPIO,芯片一共 100 個引腳,其中GPIO 就占了一大部分,所有的 GPIO 引腳都有基本的輸入輸出功能。

最基本的輸出功能是由 STM32 控制引腳輸出高、低電平,實現開關控制,如把 GPIO引腳接入到 LED 燈,那就可以控制 LED 燈的亮滅,引腳接入到繼電器或三極管,那就可以通過或三極管控制外部大功率電路的通斷。

最基本的輸入功能是檢測外部輸入電平,如把 GPIO 引腳連接到按鍵,通過電平高低區分按鍵是否被按下。

GPIO的框圖講解

技術分享圖片

下面我們按圖中的編號對 GPIO 端口的結構部件進行說明。

1. 保護二極管及上、下拉電阻

引腳的兩個保護二級管可以防止引腳外部過高或過低的電壓輸入,當引腳電壓高於VDD 時, 上方的二極管導通,當引腳電壓低於 VSS 時,下方的二極管導通,防止不正常電壓引入芯片導致芯片燒毀。盡管有這樣的保護,並不意味著 STM32 的引腳能直接外接大功率驅動器件,如直接驅動電機,強制驅動要麽電機不轉,要麽導致芯片燒壞,必須要加大功率及隔離電路驅動。

2. P-MOS

管和 N-MOS

GPIO 引腳線路經過兩個保護二極管後,向上流向“輸入模式”結構,向下流向“輸出模式”結構。先看輸出模式部分,線路經過一個由 P-MOS 和 N-MOS 管組成的單元電路。這個結構使 GPIO 具有了“推挽輸出”和“開漏輸出”兩種模式。

所謂的推挽輸出模式,是根據這兩個 MOS 管的工作方式來命名的。在該結構中輸入高電平時,經過反向後,上方的 P-MOS 導通,下方的 N-MOS 關閉,對外輸出高電平;而在該結構中輸入低電平時,經過反向後, N-MOS 管導通, P-MOS 關閉,對外輸出低電平。當引腳高低電平切換時,兩個管子輪流導通, P 管負責灌電流, N 管負責拉電流,使其負載能力和開關速度都比普通的方式有很大的提高。推挽輸出的低電平為 0 伏,高電平為 3.3伏,具體參考圖 8-2,它是推挽輸出模式時的等效電路。

技術分享圖片

而在開漏輸出模式時,上方的 P-MOS 管完全不工作。如果我們控制輸出為 0,低電平,則 P-MOS 管關閉,N-MOS 管導通,使輸出接地,若控制輸出為 1 (它無法直接輸出高電平)時,則 P-MOS 管和 N-MOS 管都關閉,所以引腳既不輸出高電平,也不輸出低電平,為高阻態。為正常使用時必須外部接上拉電阻,參考圖 8-3 中等效電路。它具有“線與”特性,也就是說,若有很多個開漏模式引腳連接到一起時,只有當所有引腳都輸出高阻態,才由上拉電阻提供高電平,此高電平的電壓為外部上拉電阻所接的電源的電壓。若其中一個引腳為低電平, 那線路就相當於短路接地,使得整條線路都為低電平,0 伏。

推挽輸出模式一般應用在輸出電平為 0 和 3.3 伏而且需要高速切換開關狀態的場合。在 STM32 的應用中,除了必須用開漏模式的場合,我們都習慣使用推挽輸出模式。

開漏輸出一般應用在 I2C、 SMBUS 通訊等需要“線與”功能的總線電路中。除此之外,還用在電平不匹配的場合,如需要輸出 5 伏的高電平,就可以在外部接一個上拉電阻, 上拉電源為 5 伏, 並且把 GPIO 設置為開漏模式,當輸出高阻態時,由上拉電阻和電源向外輸出 5 伏的電平,具體見圖 8-4。

技術分享圖片

技術分享圖片

3. 輸出數據寄存器
前面提到的 雙 MOS 管結構電路的輸入信號,是由GPIO“輸出數據寄存器GPIOx_ODR”提供的,因此我們通過修改輸出數據寄存器的值就可以修改 GPIO 引腳的輸出電平。而“置位/復位寄存器 GPIOx_BSRR”可以通過修改輸出數據寄存器的值從而影響電路的輸出。

4. 復用功能輸出

“復用功能輸出”中的“復用”是指 STM32 的其它片上外設對 GPIO 引腳進行控制,此時 GPIO 引腳用作該外設功能的一部分,算是第二用途。從其它外設引出來的“復用功能輸出信號”與 GPIO 本身的數據據寄存器都連接到雙 MOS 管結構的輸入中,通過圖中的梯形結構作為開關切換選擇。例如我們使用 USART 串口通訊時,需要用到某個 GPIO 引腳作為通訊發送引腳,這個時候就可以把該 GPIO 引腳配置成 USART 串口復用功能,由串口外設控制該引腳,發送數據。

 // GPIOB 16 個 IO 全部輸出 0XFF
 GPIOB->ODR = 0XFF;

5. 輸入數據寄存器

看 GPIO 結構框圖的上半部分, GPIO 引腳經過內部的上、下拉電阻, 可以配置成上下拉輸入,然後再連接到施密特觸發器,信號經過觸發器後,模擬信號轉化為 0、 1 的數字

信號,然後存儲在“輸入數據寄存器 GPIOx_IDR”中,通過讀取該寄存器就可以了解GPIO 引腳的電平狀態。

// 讀取 GPIOB 端口的 16 位數據值
uint16_t temp;
    temp = GPIOB->IDR;

6. 復用功能輸入

與“復用功能輸出”模式類似,在“復用功能輸入模式”時, GPIO 引腳的信號傳輸到STM32 其它片上外設,由該外設讀取引腳狀態。同樣,如我們使用 USART 串口通訊時,需要用到某個 GPIO 引腳作為通訊接收引腳,這個時候就可以把該 GPIO 引腳配置成 USART 串口復用功能,使 USART 可以通過該通訊引腳的接收遠端數據。
7. 模擬輸入輸出

當 GPIO 引腳用於 ADC 采集電壓的輸入通道時,用作“模擬輸入”功能,此時信號是不經過施密特觸發器的,因為經過施密特觸發器後信號只有 0、 1 兩種狀態,所以 ADC 外設要采集到原始的模擬信號,信號源輸入必須在施密特觸發器之前。類似地,當 GPIO 引腳用於 DAC 作為模擬電壓輸出通道時,此時作為“模擬輸出”功能, DAC 的模擬信號輸出就不經過雙 MOS 管結構,模擬信號直接輸出到引腳。

GPIO 工作模式

總結一下,由 GPIO 的結構決定了 GPIO 可以配置成以下模式:

typedef enum
{
GPIO_Mode_AIN = 0x0, // 模擬輸入
GPIO_Mode_IN_FLOATING = 0x04, // 浮空輸入
GPIO_Mode_IPD = 0x28, // 下拉輸入
GPIO_Mode_IPU = 0x48, // 上拉輸入
GPIO_Mode_Out_OD = 0x14, // 開漏輸出
GPIO_Mode_Out_PP = 0x10, // 推挽輸出
GPIO_Mode_AF_OD = 0x1C, // 復用開漏輸出
GPIO_Mode_AF_PP = 0x18 // 復用推挽輸出
} GPIOMode_TypeDef;

在固件庫中, GPIO 總共有 8 種細分的工作模式,稍加整理可以大致歸類為以下三類:

1. 輸入模式(模擬/浮空/上拉/下拉)

在輸入模式時, 施密特觸發器打開, 輸出被禁止,可通過輸入數據寄存器 GPIOx_IDR讀取 I/O 狀態。 其中輸入模式,可設置為上拉、下拉、 浮空和模擬輸入四種。 上拉和下拉輸入很好理解, 默認的電平由上拉或者下拉決定。浮空輸入的電平是不確定的,完全由外部的輸入決定,一般接按鍵的時候用的是這個模式。模擬輸入則用於 ADC 采集。

2. 輸出模式(推挽/開漏)

在輸出模式中, 推挽模式時雙 MOS 管以輪流方式工作,輸出數據寄存器 GPIOx_ODR可控制 I/O 輸出高低電平。開漏模式時,只有 N-MOS 管工作,輸出數據寄存器可控制 I/O輸出高阻態或低電平。 輸出速度可配置,有 2MHz\10MHz\50MHz 的選項。此處的輸出速度即 I/O 支持的高低電平狀態最高切換頻率,支持的頻率越高,功耗越大,如果功耗求不嚴格,把速度設置成最大即可。在輸出模式時施密特觸發器是打開的,即輸入可用,通過輸入數據寄存器 GPIOx_IDR可讀取 I/O 的實際狀態。

3. 復用功能(推挽/開漏)
復用功能模式中,輸出使能,輸出速度可配置,可工作在開漏及推挽模式,但是輸出信號源於其它外設,輸出數據寄存器 GPIOx_ODR 無效;輸入可用,通過輸入數據寄存器可獲取 I/O 實際狀態,但一般直接用外設的寄存器來獲取該數據信號。通過對 GPIO 寄存器寫入不同的參數,就可以改變 GPIO 的工作模式,再強調一下,要了解具體寄存器時一定要查閱《STM32F10X-中文參考手冊》中對應外設的寄存器說明。

在 GPIO 外設中, 控制端口高低控制寄存器 CRH 和 CRL 可以配置每個 GPIO 的工作模式和工作的速度, 每 4 個位控制一個 IO, CRH 控制端口的高八位, CRL 控制端口的低 8 位,具體的看 CRH 和 CRL 的寄存器描述。

使用寄存器點亮LED(第1節)—GPIO功能框圖講解