在
電子系統(tǒng)設(shè)計中,STM32 的 GPIO(通用輸入輸出)具有至關(guān)重要的作用,它可以被配置為多種模式,以滿足不同的應(yīng)用需求。這些模式包括輸入浮空、輸入上拉 / 下拉、模擬、推挽和開漏輸出等。在輸入模式里,上拉和下拉電阻的作用十分關(guān)鍵,它們能夠確保邏輯電平的確定性,避免信號的不穩(wěn)定。而輸出模式分為推挽和開漏,推挽模式使用兩個
晶體管(一個 PMOS 和一個 NMOS)來驅(qū)動輸出,能夠快速地將輸出驅(qū)動到適當(dāng)?shù)碾娖剑婚_漏模式則需要外部上拉電阻,在一些特定的應(yīng)用場景中具有獨特的優(yōu)勢。復(fù)用功能允許 GPIO 與多個外設(shè)共享,大大提高了引腳的利用率;模擬配置則用于 ADC、DAC 等模擬信號操作,為處理模擬信號提供了便利。配置這些模式涉及到 GPIOx_PUPDR、GPIOx_OTYPER 等寄存器。
STM32 產(chǎn)品集成了三個主要的 GPIO 基本結(jié)構(gòu),分別是三伏兼容(縮寫為 TC)、三伏容限(縮寫為 TT)和五伏容限(縮寫為 FT)。圖 1 給出了等效的 GPIO 圖結(jié)構(gòu),圖 2 給出了 TT 或 FT 等效的 GPIO 圖結(jié)構(gòu)。


當(dāng) STM32 器件 I/O 引腳配置為輸入時,有三種選項可供選擇:
- 帶內(nèi)部上拉的輸出:在 STM32 器件中使用上拉電阻,能確保在浮動輸入信號的情況下具有良好定義的邏輯電平。根據(jù)應(yīng)用要求,還可以使用外部上拉電阻。
- 帶內(nèi)部下拉的輸入:使用下拉電阻,同樣是為了確保在浮動輸入信號時邏輯電平的確定性。也可根據(jù)需要使用外部下拉電阻。
- 浮空輸入:信號電平跟隨外部信號。但當(dāng)沒有外部信號時,施密特觸發(fā)器會在由外部噪聲引起的邏輯電平之間隨機切換,這會增加總體消耗。
編程為輸入時,I/O 端口具有以下特征:
- 輸出緩沖器被關(guān)閉;
- 施密特觸發(fā)器輸入被打開;
- 根據(jù) GPIOx_PUPDR 寄存器中的值決定是否激活上拉或下拉電阻;
- 輸入數(shù)據(jù)寄存器每隔 1 個 AHB 時鐘周期對 I/O 引腳上的數(shù)據(jù)進行一次采樣;
- 通過讀取 GPIOx_IDR 輸入數(shù)據(jù)寄存器可獲取 I/O 狀態(tài)。
當(dāng) STM32 器件 I/O 引腳配置為輸出時,有兩種選項:
- 推挽輸出模式:推挽輸出使用兩個晶體管(一個 PMOS 和一個 NMOS)。當(dāng)輸出必須驅(qū)動為高電平狀態(tài)時,頂部晶體管(PMOS)導(dǎo)通;當(dāng)輸出必須驅(qū)動為低電平狀態(tài)時,底部晶體管(NMOS)導(dǎo)通。兩個晶體管的控制通過 GPIO 端口輸出類型寄存器(GPIOx_OTYPER)完成。將輸出寄存器(GPIOx_ODR)的相關(guān)位寫 0 可激活 NMOS 晶體管,強制 I/O 引腳接地;寫 1 可激活 PMOS 晶體管,強制 I/O 引腳接通 VDD。
- 開漏輸出模式:開漏輸出模式不使用 PMOS 晶體管,而是需要一個上拉電阻。當(dāng)輸出必須變?yōu)楦唠娖綍r,必須關(guān)閉 NMOS 晶體管,僅通過上拉電阻將電平拉高。該上拉電阻可以是內(nèi)部的,典型值為 40kOhm,并通過 GPIO 端口上拉 / 下拉寄存器(GPIOx_PUPDR)激活。
編程為輸出時,I/O 端口具有以下特征:
- 可將輸出緩沖器配置為開漏或推挽模式;
- 施密特觸發(fā)器輸入被打開;
- 根據(jù) GPIOx_PUPDR 寄存器中的值決定是否激活上拉或下拉電阻;
- 寫入輸出數(shù)據(jù)寄存器 GPIOx_ODR 的值將 I/O 引腳狀態(tài)置位;
- GPIOx_ODR 中的寫入數(shù)據(jù)可從 GPIOx_IDR 中讀取,該寄存器每個 AHB 時鐘周期更新一次。
在一些 STM32 GPIO 引腳上,用戶可以選擇復(fù)用功能輸入 / 輸出。每個引腳可與多達 16 個外設(shè)功能復(fù)用,例如通信接口(SPI,UART,I2C,USB,CAN,LCD 等)、
定時器、調(diào)試接口等。所選引腳的復(fù)用功能通過兩個寄存器配置:GPIOx_AFRL(引腳 0 到 7)和 GPIOx_AFRH(引腳 8 到 15)。
對 I/O 端口進行編程作為復(fù)用功能時:
- 可將輸出緩沖器配置為開漏或推挽模式
- 輸出緩沖器由來自外設(shè)的信號驅(qū)動(發(fā)送器使能和數(shù)據(jù))
- 施密特觸發(fā)器輸入被打開
- 根據(jù) GPIOx_PUPDR 寄存器中的值決定是否激活上拉或下拉電阻
- 輸入數(shù)據(jù)寄存器每隔 1 個 AHB 時鐘周期對 I/O 引腳上的數(shù)據(jù)進行一次采樣。
- 對輸入數(shù)據(jù)寄存器的讀訪問可獲取 I/O 狀態(tài)。
有一些 STM32 GPIO 引腳可以配置為模擬模式,允許使用 ADC、DAC、OPAMP 和 COMP 內(nèi)部外設(shè)。要在模擬模式下使用 GPIO 引腳,需要考慮以下寄存器:
- GPIOx_MODER,用于選擇模式(輸入,輸出,復(fù)用,模擬)
- GPIOx_ASCR,用于選擇所需的功能,如 ADC,DAC,OPAMP 或 COMP
對 I/O 端口進行編程作為模擬配置時:
- 輸出緩沖器被關(guān)閉
- 施密特觸發(fā)器輸入被禁用,因此 I/O 引腳的每個模擬值零消耗。施密特觸發(fā)器的輸出被強制為恒定值(0)。
- 上拉和下拉電阻被硬件關(guān)閉
- 對輸入數(shù)據(jù)寄存器的讀訪問值為 “0”。

0次