使用寄存器點亮LED(第1節)—GPIO功能框圖講解
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
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功能框圖講解