GPIO詳解:不僅僅是輸入輸出那么簡單
“別小看一個小小的引腳,它可是 MCU 世界的社交之門。”
👋 先打個招呼:什么是 GPIO?
GPIO,全稱是 General Purpose Input/Output —— 通用輸入輸出口。
簡單說,它就像 MCU 身上的“手指”:
- 輸入模式:它能感知外部世界(比如按鍵按下)
- 輸出模式:它能控制外部設備(比如點亮LED)
別以為它只是通電/斷電!
GPIO 的“本領”比你想象的多很多!
🧠 GPIO 的核心概念梳理
概念 | 通俗解釋 |
---|---|
輸入模式 | “耳朵”——用來接收信號 |
輸出模式 | “手”——用來發出信號 |
上拉/下拉 | 默認信號狀態,不懸空就靠它 |
推挽輸出 | 能輸出高電平也能輸出低電平 |
開漏輸出 | 只能拉低,靠外部上拉輸出高 |
復用功能 | “兼職”的引腳,比如串口、I2C、PWM等 |
中斷功能 | 引腳也能“打斷”主程序,成為中斷源 |
速度設置 | 并不是說跑步,而是電氣變化的快慢(驅動能力) |
? 輸入模式:不是你以為的那么簡單
GPIO_MODE_INPUT
輸入模式一般配合 上拉
或 下拉
使用:
場景 | 原因 |
---|---|
內部上拉 | 防止引腳懸空漂移,默認為高電平 |
內部下拉 | 保持引腳為低電平,適合低有效按鍵 |
無上拉下拉 | 用外部電路控制,或用于模擬輸入 |
舉個例子:你用按鍵接 GND,那就要設置為“輸入 + 上拉”,按下時變低電平。
💡 輸出模式:推挽 vs 開漏
🚀 推挽輸出(GPIO_MODE_OUTPUT_PP)
能把引腳拉高也能拉低,適合控制 LED、繼電器等。
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 輸出高
🌪 開漏輸出(GPIO_MODE_OUTPUT_OD)
只能拉低,拉高需要靠外部上拉電阻。
適合做I2C總線、多個設備共用一根線的場景。
🧬 復用模式:GPIO 的“分身術”
你定義的是 GPIO,其實它暗地里還兼職著:
- USART_TX/RX(串口通信)
- I2C_SCL/SDA(I2C 通信)
- PWM 輸出
- ADC 輸入
- 外部中斷 EXTI
這就需要設置為 GPIO_MODE_AF_xx
模式(AF = Alternate Function)
👉 一個引腳,多種身份,選誰就看配置!
?? GPIO的輸出速度有啥用?
STM32等平臺經常讓你選:
- GPIO_SPEED_FREQ_LOW
- GPIO_SPEED_FREQ_MEDIUM
- GPIO_SPEED_FREQ_HIGH
這并不是 MCU 執行速度,而是 引腳電氣輸出的上升/下降沿速度。
- 太快:可能引起信號串擾、干擾(尤其在長線上)
- 太慢:可能帶不動外設,波形變形
推薦做法:
用途 | 推薦速度 |
---|---|
普通LED | Low |
SPI/I2C/PWM | Medium or High |
驅動高速信號/屏幕 | High |
🔧 中斷功能:GPIO也能做觸發器!
某些 GPIO 支持外部中斷,比如 STM32 的 EXTI(External Interrupt)。
配置為:
GPIO_MODE_IT_FALLING // 下降沿觸發
GPIO_MODE_IT_RISING // 上升沿觸發
GPIO_MODE_IT_RISING_FALLING // 雙邊觸發
然后寫 ISR(中斷服務函數)即可對按鈕、電平變化做出及時響應!
📦 特殊功能小結(不同MCU略有不同)
特性 | 說明 |
---|---|
鎖定 GPIO | 防止誤改配置(STM32 有 GPIOx_LCKR) |
上電默認態 | GPIO 默認可能是浮空,要謹慎使用 |
電流驅動能力 | 有的 GPIO 可驅動幾十 mA,有的卻只能帶小負載 |
復用限制 | 某些 GPIO 只能用于特定功能,不可亂配(查看芯片手冊) |
🧪 實戰小練習建議
練習項目 | 技能點 |
---|---|
點亮一個LED | 推挽輸出 |
按下按鈕點亮燈 | 輸入 + 中斷 |
軟件控制蜂鳴器 | 輸出控制、PWM復用 |
用一根線控制多個設備 | 開漏輸出 + 上拉 |
軟件模擬串口 | 開漏 + 中斷 + 復用 |
🧠 一句話總結
“GPIO,是MCU和世界溝通的最小單元,掌握它,你才能真正掌握嵌入式的‘肌肉’。”