一、GPIO 是什么?

GPIO 的全称是 General Purpose Input Output,中文叫 通用输入输出端口

简单理解:

  • 输入:读取外部器件的状态,例如按键是否按下、传感器输出高低电平。

  • 输出:控制外部器件工作,例如点亮 LED、控制蜂鸣器、驱动继电器。

对于 STM32 来说,大量引脚都可以作为 GPIO 使用。不同型号芯片的 IO 数量不同,STM32F103ZET6 属于引脚资源比较丰富的型号,常见 GPIO 端口包括 GPIOA、GPIOB、GPIOC、GPIOD、GPIOE 等。

二、STM32 GPIO 的基本特点

STM32 的 GPIO 不是简单的“高低电平开关”,它有比较完整的内部结构和多种工作方式。

常见特点:

  • 每个 IO 口都可以配置成不同模式。

  • 大多数 IO 可以作为外部中断输入。

  • GPIO 支持快速翻转,适合控制 LED、片选信号、普通数字接口等。

  • 每组 GPIO 最多 16 个引脚,例如 GPIOA 的 PA0 到 PA15。

  • GPIO 引脚通常按组存在:GPIOA、GPIOB、GPIOC ...

在 STM32F103 系列中,GPIO 的配置主要围绕 模式、速度、上下拉、输出类型 展开。

三、GPIO 的电气特性

学习 GPIO 时,一定要注意电气特性,因为单片机引脚不是无限制使用的。

1. 工作电压

STM32F103 系列常用工作电压为 3.3V。一般情况下:

  • GPIO 输出高电平接近 3.3V。

  • GPIO 输出低电平接近 0V。

  • 输入引脚识别高低电平时,也有对应的电压范围。

不要随便把 5V 信号直接接到 STM32 引脚上,是否 5V 容忍要看具体引脚和数据手册。

2. 输出电流

GPIO 可以直接驱动小电流器件,例如普通 LED,但不适合直接驱动电机、继电器等大电流负载。

如果外设需要较大电流,应该使用:

  • 三极管

  • MOS 管

  • 驱动芯片

  • 继电器模块

3. 保护二极管

GPIO 内部通常带有保护结构,用来限制外部过高或过低的异常电压。但这不是让我们随便接错电压的理由,保护结构只能用于短时间、小能量的异常保护。

四、GPIO 引脚分布

STM32 芯片引脚不全是 GPIO,还包括:

  • 电源引脚

  • GND 引脚

  • 晶振引脚

  • 复位引脚

  • 下载调试引脚,如 SWD/JTAG

  • BOOT 启动模式引脚

  • 普通 GPIO 引脚

  • 复用功能引脚

对于 STM32F103ZET6,要特别注意:

  • PA13、PA14 默认用于 SWD 调试。

  • BOOT0、BOOT1 会影响启动方式。

  • 晶振相关引脚一般不要当普通 IO 使用。

  • 一个引脚可能同时支持 GPIO、USART、SPI、I2C、TIM 等复用功能。

初学阶段建议先照着开发板原理图使用 LED、按键对应的引脚,不要随意更换。

五、GPIO 内部结构理解

GPIO 内部可以粗略理解成几部分:

  • 输入部分

  • 输出部分

  • 上拉/下拉电阻

  • 保护二极管

  • 施密特触发器

  • P-MOS 和 N-MOS 输出管

  • 复用功能通道

1. 施密特触发器

施密特触发器的作用是把不太标准、边沿较慢的输入信号整理成更加标准的数字信号。

例如按键输入时,电平变化可能不够理想,经过施密特触发器后,单片机更容易判断出稳定的高低电平。

2. 上拉和下拉电阻

GPIO 输入时,如果外部没有明确给高电平或低电平,引脚状态可能不确定,这种状态叫 浮空

为了解决这个问题,可以使用上拉或下拉:

类型 空闲状态 说明
输入浮空 不确定 容易受外界干扰
输入上拉 高电平 内部通过电阻接到 VCC
输入下拉 低电平 内部通过电阻接到 GND

STM32 内部上拉/下拉电阻一般是几十 kΩ 级别,课堂总结中提到约 30kΩ 到 50kΩ

3. P-MOS 和 N-MOS

GPIO 输出部分常见结构是由 P-MOS 和 N-MOS 组成。

推挽输出时:

  • 输出高电平:上方 P-MOS 导通。

  • 输出低电平:下方 N-MOS 导通。

开漏输出时:

  • 只能主动输出低电平。

  • 高电平需要外部或内部上拉电阻提供。

六、GPIO 的八种工作模式

STM32F1 系列 GPIO 常见 8 种模式如下。

模式 作用 常见用途
输入浮空 引脚不接内部上下拉 外部电路已经提供明确电平
输入上拉 空闲时为高电平 低电平有效按键
输入下拉 空闲时为低电平 高电平有效按键
模拟输入 关闭数字输入通道 ADC 采样
开漏输出 只能主动拉低 I2C、线与逻辑
推挽输出 可输出高低电平 LED、蜂鸣器、普通控制
开漏复用输出 外设控制,开漏输出 I2C 等
推挽复用输出 外设控制,推挽输出 USART、SPI、PWM 等

初学者怎么选模式?

常见选择可以先记住:

  • 点亮 LED:推挽输出。

  • 读取普通按键:输入上拉或输入下拉。

  • ADC 采样:模拟输入。

  • 串口 TX:复用推挽输出。

  • I2C:复用开漏输出。

七、推挽输出和开漏输出的区别

这是 GPIO 学习中的重点。

1. 推挽输出

推挽输出可以主动输出高电平,也可以主动输出低电平。

特点:

  • 驱动能力较强。

  • 电平切换速度快。

  • 适合 LED、蜂鸣器、片选信号等普通输出。

2. 开漏输出

开漏输出只能主动输出低电平,不能主动输出高电平。

如果想输出高电平,必须依靠上拉电阻。

特点:

  • 适合多个器件共用一根信号线。

  • 常用于 I2C 总线。

  • 可以做电平转换场景中的一部分。

一句话记忆:

推挽输出能输出 0 和 1,开漏输出只能主动输出 0,输出 1 要靠上拉。

八、STM32F1 和 F4/F7/H7 GPIO 的一点区别

课堂总结里提到,F1 和 F4/F7/H7 的 GPIO 结构不完全一样,比较明显的区别是 内部上拉/下拉电阻的位置和寄存器设计不同

对于 STM32F103ZET6 这类 F1 芯片:

  • 0 到 7 号引脚通过 GPIOx_CRL 配置。

  • 8 到 15 号引脚通过 GPIOx_CRH 配置。

  • 输出模式下通常不使用内部上拉/下拉,HAL 配置时一般写 GPIO_NOPULL

对于 F4/F7/H7 等系列:

  • 常见配置寄存器包括 GPIOx_MODERGPIOx_OTYPERGPIOx_OSPEEDRGPIOx_PUPDR 等。

  • 模式、输出类型、速度、上下拉被拆分得更清晰。

本文重点是 STM32F103ZET6,所以后面以 F1 的理解和 HAL 写法为主。

九、STM32F1 GPIO 常用寄存器

虽然使用 HAL 库时不一定直接操作寄存器,但理解寄存器有助于理解 HAL 的底层原理。

STM32F1 GPIO 常见寄存器:

寄存器 作用
GPIOx_CRL 配置 0 到 7 号引脚
GPIOx_CRH 配置 8 到 15 号引脚
GPIOx_IDR 输入数据寄存器,读取引脚电平
GPIOx_ODR 输出数据寄存器,控制输出电平
GPIOx_BSRR 位设置/复位寄存器,推荐用于置位和复位
GPIOx_BRR 位复位寄存器
GPIOx_LCKR 配置锁定寄存器

课堂总结中提到,F1 系列基础使用时重点关注:

  • GPIOx_CRL

  • GPIOx_CRH

  • GPIOx_IDR

  • GPIOx_ODR

  • GPIOx_BSRR

ODR 和 BSRR 有什么区别?

ODR 是输出数据寄存器,修改某一位时可能涉及读-改-写过程。

BSRR 是位操作寄存器,可以直接对某个引脚置 1 或清 0,操作更安全,尤其在中断或多任务环境中更推荐使用。

使用 HAL 库的 HAL_GPIO_WritePin() 时,底层通常会使用类似 BSRR 的方式操作引脚。

十、通用外设驱动模型:四步法

课堂总结中给出一个很重要的方法:通用外设驱动模型四步法

学习任何 STM32 外设时,都可以按这个思路分析:

  1. 初始化 包括时钟设置、参数设置、IO 设置、中断设置等。

  2. 读函数 从外设读取数据,例如读取按键电平、读取串口数据。

  3. 写函数 向外设写入数据,例如设置 GPIO 输出、发送串口数据。

  4. 中断服务函数 如果外设使用中断,需要在中断中处理标志位和业务逻辑。

这个方法不仅适用于 GPIO,也适用于 USART、TIM、ADC、SPI、I2C 等外设。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐