STM32学习-GPIO
一、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_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR、GPIOx_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 外设时,都可以按这个思路分析:
-
初始化 包括时钟设置、参数设置、IO 设置、中断设置等。
-
读函数 从外设读取数据,例如读取按键电平、读取串口数据。
-
写函数 向外设写入数据,例如设置 GPIO 输出、发送串口数据。
-
中断服务函数 如果外设使用中断,需要在中断中处理标志位和业务逻辑。
这个方法不仅适用于 GPIO,也适用于 USART、TIM、ADC、SPI、I2C 等外设。
更多推荐

所有评论(0)