GPIO是通用的輸入輸出接口,可配置8種輸入模式,輸出模式下可控制端口輸出高低電平,用于點亮LED、控制蜂鳴器、模擬通信協議等;輸入模式下可以讀取端口的高低電平或者電壓,用于讀取按鍵、外接模塊的電平信號、ADC的電壓采集等。
一、GPIO的輸出
當GPIO引腳被配置為輸出模式時,其核心目的是由MUC主動控制引腳的電平狀態(高電平VDD或低電平VSS/GND),從而驅動外部電路或者信號其他設備。
GPIO輸出模式的主要特點
????????1.可配置的輸出類型:
?推挽輸出:引腳內部包含一個 PMOS(上管)和一個 NMOS(下管)晶體管。當輸出高電平? 時,PMOS 導通,NMOS 截止,引腳連接到?VDD
。當輸出低電平時,PMOS 截止,NMOS 導通,引腳連接到VSS。
- 特點:有較強的驅動能力,不依賴外部電路,輸出的高低電平比較準確。
開漏輸出:引腳內部僅包含一個 NMOS(下管)晶體管。當輸出低電平時,NMOS 導通,引腳連接到VSS。當輸出高電平時,NMOS 截止,引腳處于高阻態(相當于斷開)。
- 特點:依賴上拉,電平轉換,驅動能力較弱(高電平)。
????????2.可配置的輸出速度:
STM32允許為輸出引腳配置不同的壓擺率。這決定了引腳電平從低到高或從高到低切換的速度。
一般通常分為低速、中速、高速、超高速。
低速:最低功耗、最低噪聲。一般適用于不頻繁切換的引腳(如LED指示燈、控制使能信號)。
中速:平衡功耗、噪聲和速度。
高速:最快的切換速度。一般適用于需要高頻切換的引腳(如SPI、USART時鐘線、PWM輸出)。
超高速:在部分高性能型號上提供,速度最快。
? ? ? ? 3.輸出數據寄存器
ODR:直接控制引腳輸出電平。
- 寫1到對應的ODR位:輸出高電平(在推完模式下)使輸出管截止(在開漏模式下,需外部上拉才能呈現高電平)。
- 寫0到對應的ODR位:輸出低電平(在推挽和開漏模式下都使輸出管導通拉低)。
BSRR:?位設置/復位寄存器。這是一個更高效、更常用的操作 ODR 的方式,特別適合原子操作(避免讀-修改-寫操作在多任務環境中的競爭條件)。
BSRR的低 16 位:寫1將對應的 ODR 位置1(輸出高/開漏截止)。
BSRR的高 16 位:寫1將對應的 ODR 位置0(輸出低/開漏導通)。
寫0到BSRR的任何位無效果。這允許只改變需要改變的位而不影響其他位。
????????4.可選的內部上拉/下拉電阻
即使在輸出模式下,也可以選擇啟用內部的上拉或下拉電阻。
主要用途:
在MCU剛啟動或者復位后、GPIO 配置完成前,內部上拉/下拉可以提供一個確定的初始電平,防止引腳懸空導致的不確定狀態。
二、如何配置 GPIO 為輸出模式
????????1.使能GPIO端口時鐘:
在RCC寄存器中使能對應GPIO端口(GPIOA,GPIOB)的時鐘。這是必要的!
? ? ? ? 2.配置引腳模式:
在GPIOx_MODER寄存器中寄存器中將對應引腳的模式位設置為01(輸出模式)。
? ? ? ? 3.配置輸出類型:
在 GPIOx_OTYPER 寄存器中設置對應引腳的輸出類型位:
- 0 = 推挽輸出
- 1 = 開漏輸出
? ? ? ?4.配置輸出速度:
在 GPIOx_OSPEEDR 寄存器中設置對應引腳的速度位(選擇低速、中速、高速或超高速)。
? ? ? ?5.(可選)配置上拉/下拉:
?在 GPIOx_PUPDR 寄存器中設置對應引腳的上拉/下拉位:
00 = 無上拉下拉
01
?= 上拉10
?= 下拉11
?= 保留 (通常不用)
? ? ? ?6.設置初始輸出電平:
通過 GPIOx_ODR 或更推薦使用 GPIOx_BSRR 寄存器設置引腳初始輸出狀態(高或低)。
GPIO的輸出總結
STM32 的 GPIO 輸出功能強大且靈活。理解?推挽?和?開漏?兩種輸出類型的原理、特點和應用場景是核心。合理配置?輸出速度?和?上拉/下拉?電阻對于優化性能、降低功耗和噪聲至關重要。熟練掌握通過?ODR?和?BSRR?寄存器(或庫函數)控制引腳電平是實際編程的基礎。始終牢記引腳的?電氣特性限制(電壓、電流)是安全可靠設計的前提。
三、GPIO的輸入
當 GPIO 引腳被配置為輸入模式時,其核心目的是由 MCU 讀取引腳上來自外部電路的電平狀態(高電平VDD或低電平VSS/GND)。MCU 不會主動驅動該引腳的電平,而是檢測外部施加在引腳上的電壓。
GPIO 輸入模式的主要特點
????????1.高輸入阻抗:
- 配置為輸入模式的 GPIO 引腳呈現非常高的輸入阻抗(通常在兆歐姆級別)。這意味著從外部電路汲取的電流非常微小(通常在微安級別)。
優點:?不會顯著加載(影響)外部信號源,適合讀取傳感器信號、按鍵狀態等微弱或高阻抗信號。
? ? ? ? 2.可配置的輸入特性:
STM32 為輸入引腳提供了三種主要的配置選項,用于確定引腳在無外部驅動信號時的默認狀態或抗干擾能力:
浮空輸入:內部既不上拉也不下拉。引腳完全“懸空”。
上拉輸入:在引腳和VDD之間內部連接一個電阻(典型值 30KΩ - 50KΩ)。
下拉輸入:在引腳和VSS之間內部連接一個電阻(典型值 30KΩ - 50KΩ)。
? ? ? ? 3.施密特觸發器:
所有 STM32 GPIO 輸入引腳都包含施密特觸發器。
作用:?對輸入信號進行整形。
? ? ? ? 4.輸入數據寄存器
IDR:?輸入數據寄存器。這是讀取引腳當前電平狀態的地方。
讀取IDR寄存器中對應引腳的位:
0
?= 檢測到低電平 (引腳電壓 <?V_IL)1
?= 檢測到高電平 (引腳電壓 > V_IH)
四、如何配置GPIO為輸入模式
使能 GPIO 端口時鐘:?在 RCC 寄存器中使能對應 GPIO 端口(如 GPIOA, GPIOB)的時鐘。必須步驟!
配置引腳模式:?在 GPIOx_MODER 寄存器中將對應引腳的模式位設置為?
00
?(輸入模式)。配置上拉/下拉:?在 GPIOx_PUPDR 寄存器中設置對應引腳的上拉/下拉位:
00
?= 浮空輸入 (無上拉下拉 -?慎用)01
?= 上拉輸入10
?= 下拉輸入11
?= 保留 (通常不用)
(可選) 配置模擬模式:?如果該引腳將用作 ADC、DAC 或 Comparator 的輸入,除了將 MODER 設置為模擬模式 (11
),通常也要求 PUPDR 配置為無上拉下拉 (00
)。模擬模式會禁用施密特觸發器和數字輸入路徑。
//直接讀取 IDR 寄存器
if (GPIOA->IDR & GPIO_IDR_ID0) { // 檢查 PA0 對應位 (IDR bit0) 是否為 1// PA0 為高電平 (按鍵松開)
} else {// PA0 為低電平 (按鍵按下)
}
一般適用場景:
按鍵/開關檢測:上拉輸入 + 按鍵接地:松開=高電平,按下=低電平。下拉輸入 + 按鍵接?VDD
:松開=低電平,按下=高電平。
數字傳感器讀取:讀取數字傳感器(如數字溫度傳感器 DS18B20 - 需單總線協議、PIR 運動傳感器、霍爾開關)的輸出信號。
接收數字信號:
通信接口:UART RX, SPI MISO, I2C SDA (作為從機接收時), CAN RX 等。這些復用功能通常會自動或要求配置相應的輸入模式(浮空或上拉取決于協議)。
外部中斷源:配置為輸入是使用外部中斷/事件控制器 (EXTI) 的前提條件。
數字狀態監控:讀取外部設備的狀態信號(如就緒READY、忙BUSY、錯誤ERROR等)。
模擬信號采集 (ADC/DAC/COMP):當引腳配置為模擬輸入模式時,它本質上是輸入模式的一個特例(MODER=11, PUPDR=00),信號直接連接到 ADC 轉換器、比較器或其他模擬外設,繞過施密特觸發器和數字輸入路徑。
電平檢測/監控:?監控電源狀態、外部邏輯電平等。
注意事項
1、避免浮空輸入:?這是導致不穩定、誤觸發、額外功耗的最常見原因之一。除非外部電路保證提供確定驅動(如推挽輸出信號)或用于模擬輸入,否則務必啟用內部上拉或下拉電阻!
2、輸入阻抗與信號源驅動能力:?雖然輸入阻抗很高,但如果信號源阻抗也很大(如長線、高阻抗傳感器),信號上升/下降時間會變慢,可能影響高速信號識別或增加噪聲敏感性。必要時可考慮緩沖器(如跟隨器)。
3、復用功能:?當引腳用作通信接口 (UART, SPI, I2C, CAN 等) 的輸入或外部中斷 (EXTI) 時,輸入模式(浮空、上拉)的配置需遵循外設或中斷的要求。參考參考手冊和外設章節。
GPIO的輸入總結
STM32 的 GPIO 輸入模式是感知外部數字世界的關鍵。核心在于理解浮空、上拉、下拉三種配置的區別與應用場景(上拉下拉是穩定性的保障),掌握施密特觸發器的抗噪作用,以及嚴格遵守電壓限制(特別是 5V Tolerant)。通過讀取?IDR?寄存器可以獲取引腳狀態。按鍵檢測可以很好的理解輸入模式原理和實踐。一定要避免浮空輸入和注意電壓兼容性是設計可靠系統的關鍵原則。