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,调试引脚要配置!