GD32 GPIO 超詳細總結 (江科大風格課件版)
第一部分:GPIO 是什么?
- 名稱:GPIO = General Purpose Input/Output (通用輸入輸出口)
- 作用:MCU與外部世界交互的橋梁。通過程序控制引腳輸出高、低電平,或者讀取引腳的電平狀態。
- 功能:
- 輸出功能:驅動LED、蜂鳴器、繼電器,模擬通信時序(如I2C, SPI, 單總線)等。
- 輸入功能:讀取按鍵、傳感器等外部數字信號的狀態。
第二部分:GPIO 的八種工作模式 (核心重點!)
GD32的每個GPIO引腳都可以獨立配置為以下8種模式中的一種。理解每種模式的電路結構和應用場景是關鍵。
模式 | 簡稱 (庫函數中常見) | 電路原理 (形象理解) | 應用場景 |
---|---|---|---|
1. 模擬輸入 | GPIO_MODE_AIN | 引腳直接連到內部ADC,完全斷開數字電路部分。 | ADC采集,測量電壓值。 |
2. 浮空輸入 | GPIO_MODE_IN_FLOATING | 引腳懸空,電平狀態完全由外部信號決定。 | 連接外部驅動源,如串口RX引腳、I2C等。 |
3. 上拉輸入 | GPIO_MODE_IPU | 內部有一個約40kΩ的電阻連接到VDD(高電平)。默認狀態下引腳為高電平。 | 按鍵檢測(按鍵另一端接地),按下為低,松開為高。 |
4. 下拉輸入 | GPIO_MODE_IPD | 內部有一個約40kΩ的電阻連接到GND(低電平)。默認狀態下引腳為低電平。 | 按鍵檢測(按鍵另一端接VCC),按下為高,松開為低。 |
5. 推挽輸出 | GPIO_MODE_OUT_PP | 最常用輸出模式。像一對推挽工作的開關,可以強輸出高電平(接近VDD)或強輸出低電平(接近0V),驅動能力強。 | 驅動LED、蜂鳴器、舵機等,以及USART_TX、SPI等外設輸出。 |
6. 開漏輸出 | GPIO_MODE_OUT_OD | 只能強輸出低電平或高阻態(相當于斷開)。要輸出高電平,必須依賴外部上拉電阻。 | I2C總線(支持“線與”)、5V電平轉換、通信總線。 |
7. 復用推挽輸出 | GPIO_MODE_AF_PP | 模式同推挽輸出,但輸出信號源不是CPU,而是由片內外設(如SPI、TIM)自動控制。 | 將引腳作為外設的輸出腳,如SPI_SCK, TIM_PWM。 |
8. 復用開漏輸出 | GPIO_MODE_AF_OD | 模式同開漏輸出,輸出信號源由片內外設自動控制。 | 將引腳作為外設的輸出腳,如I2C_SDA。 |
江科大經典總結:
- 輸入:測電壓。浮空是“你說了算”,上/下拉是“有個默認值”。
- 輸出:供電流。推挽是“能高能低真漢子”,開漏是“只能拉低,想高得找人(上拉電阻)幫忙”。
- 復用:CPU不管了,交給外設大哥來控制。
第三部分:GPIO 基本結構 (了解)
一個GPIO口內部主要包含:
- 保護二極管:防止引腳電壓過高或過低。
- 上拉/下拉電阻:約40kΩ,可通過寄存器開關。
- 施密特觸發器:將模擬電壓整形為數字信號0或1。
- 輸出驅動器:推挽或開漏結構,由P-MOS和N-MOS管組成。
第四部分:GPIO 操作流程 (代碼實踐)
“萬事開頭先開時鐘!”
-
開啟GPIO端口時鐘
rcu_periph_clock_enable(RCU_GPIOA); // 使能GPIOA的時鐘 // 如果是復用功能或重映射,可能還需要開啟AFIO時鐘 // rcu_periph_clock_enable(RCU_AF);
-
初始化GPIO(配置模式與速度)
- 方法一 (面向系列:F10x, F30x, F20x, E10x等):使用
gpio_init
函數。// 配置PA0為上拉輸入 gpio_init(GPIOA, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_0);// 配置PA1為推挽輸出,速度50MHz gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_1);
- 方法二 (面向系列:F1x0, F3x0, F4xx, E23x等):使用
gpio_mode_set
和gpio_output_options_set
。// 配置PA1為推挽輸出,無上下拉,速度50MHz gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_1); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_1);
- 方法一 (面向系列:F10x, F30x, F20x, E10x等):使用
-
操作GPIO
// 輸出操作 gpio_bit_set(GPIOA, GPIO_PIN_1); // PA1輸出高電平 gpio_bit_reset(GPIOA, GPIO_PIN_1); // PA1輸出低電平 gpio_bit_write(GPIOA, GPIO_PIN_1, SET); // 等同于set gpio_bit_write(GPIOA, GPIO_PIN_1, RESET); // 等同于reset// 輸入操作 if (gpio_input_bit_get(GPIOA, GPIO_PIN_0) == SET) {// 如果PA0檢測到高電平 } else {// 如果PA0檢測到低電平 }
第五部分:重要注意事項 (避坑指南)
- 先開時鐘,再操作:不開啟外設時鐘,所有操作無效!
- 電平兼容性:
- 非FT(5V耐受)引腳,輸入電壓絕對不能超過
VDD + 0.3V
。 - 即使FT引腳,也主要在輸入模式下耐受5V。
- 非FT(5V耐受)引腳,輸入電壓絕對不能超過
- JTAG/SWD調試引腳:PA13, PA14, PA15, PB3, PB4 默認用于調試,想當普通GPIO用,必須先禁用JTAG(通常保留SWD即可)。
gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP, ENABLE); // 常用:關閉JTAG,使能SWD
- 未使用的引腳:最好設置為模擬輸入模式,懸空容易引入干擾。
- 輸出速度:高速(50MHz)適合通信,低速(2MHz)適合驅動簡單外設,更省電抗干擾。
第六部分:總結與實戰選擇
- LED、蜂鳴器:推挽輸出。
- 按鍵:上拉輸入(按鍵接地)或下拉輸入(按鍵接VCC)。
- 串口RX:浮空輸入。
- 串口TX:推挽輸出。
- I2C:復用開漏輸出(必須外加上拉電阻,如4.7K)。
- ADC采集:模擬輸入。
- PWM輸出:復用推挽輸出。
記住江科大口訣:
輸出用推挽,輸入看默認;
開漏要上拉,復用給大哥;
模擬給ADC,調試引腳要配置!