一、GP IO简介
数字0为低电平:0V
数字1为高电平:3.3V



如果GPIO输出的是模拟量,那GPIO还可以配置成模拟输入模式,再配合内部的SDC外设,就能直接读取端口的模拟电压了;
二、GPIO的基本结构
在STM32中,所有的GPIO都是挂载在APB2外设总线上的;
每个GPIO外设总共有16个引脚,为0到15;
GPIO模块内,主要包括寄存器和驱动器;
1、寄存器 :
就是一段特殊的储存器,内核可以通过APB2总线对寄存器惊醒读写,这样就完成了输出电平和读取电平的功能;
寄存器的每一位对应一个引脚;寄存器是有32位的,因为这里输出端口只有16位,所以只有寄存器的低16位用到了的;,高16位是没有用到
2、驱动器:
是用来增加信号的驱动能力的, 寄存器只负责存储数据,如果要进行点灯,就需要驱动器来负责增大驱动能力;

三、GPIO位结构
1、整体位置关系
整体结构可以分为两个部分,上面为输入,下面为输出



2、上拉、下拉、浮空

如果上面导通、下面断开,就是上拉输入模式,默认为高电平的输入模式;
如果下面导通、上面断开,就是下拉输入模式,默认为低电平的输入模式;
都断开则为浮空模式;
二者阻值都比较大;
3、TTL施密特触发器
工作原理
a.初始状态下,输入端为低电平,PNP二极管导通,NPN二极管截断,输出端为高电平。
b.当输入信号从低电平变为高电平时,PNP二极管截断,NPN二极管导通,输出端电压被拉低,变为低电平。
c.当输入信号再次从高电平变为低电平时,PNP二极管导通,NPN二极管截断,输出端电压被拉高,变为高电平。
d.重复上述过程,实现从高电平到低电平的转换
4、输出部分

如果选择通过输出数据寄存器进行控制:普通的IO口输出;
位设置/清除寄存器:可以用来单独操作输出数据寄存器的某一位,而不影响其他位;
5、引出:
⭐STM32中"位带"区域是什么?

a、核心目的:解决 "位操作" 的痛点
在嵌入式开发中,经常需要单独控制某个比特位(例如:控制 GPIO 引脚电平、寄存器中的标志位)。传统方式必须执行三步:
- 读:读取整个寄存器的值到 CPU;
- 改:修改目标比特位(其他位保持不变);
- 写:将修改后的值写回寄存器。
这种 "读 - 改 - 写" 存在两个问题:
- 代码繁琐(需要用
|=、&=配合掩码); - 多线程 / 中断场景下可能出现竞态条件(读取后被其他程序修改,导致写回的数据失效)。
b、STM32 的位带区域划分
STM32 只对两个特定内存区域支持位带映射,分别对应片内 SRAM 和外设寄存器,每个区域都包含 "原始区域" 和 "位带别名区域"
| 类型 | 原始区域(可位操作的内存) | 位带别名区域(映射地址) | 映射规则 |
|---|---|---|---|
| 片内 SRAM | 0x2000 0000 ~ 0x200F FFFF(1MB) | 0x2200 0000 ~ 0x23FF FFFF(2MB) | 别名地址 = 0x22000000 + (原始地址 - 0x20000000) × 32 + 比特位 × 4 |
| 外设寄存器 | 0x4000 0000 ~ 0x400F FFFF(1MB) | 0x4200 0000 ~ 0x43FF FFFF(2MB) | 别名地址 = 0x42000000 + (原始地址 - 0x40000000) × 32 + 比特位 × 4 |
映射规则说明:
- 原始区域中1 个字节(8 位) 对应别名区域中32 个字节(8 位 × 4 字节 / 位);
- 对别名区域中某个字节执行:
- 写
1→ 对应原始比特位置1; - 写
0→ 对应原始比特位清0; - 读该字节 → 返回原始比特位的值(0 或 1)。
- 写
c、位带机制的优势与限制
优势:
- 简化代码:无需掩码和 "读 - 改 - 写",直接操作单个位;
- 效率高:单条指令完成位操作(传统方式需 3 条以上指令);
- 无竞态风险:无需读取整个寄存器,避免多线程 / 中断干扰(前提是无其他代码同时操作该位)。
限制:
- 仅支持特定区域:仅 SRAM(0x20000000~0x200FFFFF)和外设寄存器(0x40000000~0x400FFFFF),其他区域(如 Flash)不支持;
- 地址对齐要求 :别名区域按 4 字节对齐(需用
uint32_t指针访问,避免非对齐错误); - STM32 全系列支持:所有 STM32 型号(F1/F4/L4 等)均内置位带机制,无硬件差异。
总结
STM32 的位带区域是将 "SRAM / 外设寄存器的单个比特位" 映射为 "独立的字节地址" 的内存机制,核心价值是用简单的字节访问替代复杂的 "读 - 改 - 写",高效实现单个位的置 1、清 0 和读取。在 GPIO 控制、标志位操作等场景中广泛应用,是 STM32 简化位操作的核心特性之一。
6、开漏模式
开漏模式可以作为通信协议的驱动方式,再多机通信的情况下,可以避免各个设备的相互干扰,
还可以用于输出5V的电平信号;
四、GPIO八种模式


浮空、上拉、下拉这三个模式的电路结构基本是一样的,区别就是上拉电阻和下拉电阻的连接;
它们都属于数字的输入口,特征就是,读取端口的高低电平;
当引脚悬空时: 上拉输入默认为高电平, 下拉输入默认为低电平;
而浮空输入的电平不确定,所以在使用浮空时,端口要接上一个连续的电源;
模拟输入

五、GPIO的寄存器
1、GPIO配置寄存器
每一个端口的模式由4位进行配置,则16个端口就需要64位,所以这里有两个寄存器;




2、端口输入数据寄存器
低16位对应16个引脚,高16位没有用到;

3、端口输出数据寄存器
同上

4、端口位设置/清除寄存器
高16位进行位清除;
低16位进行位设置;

5、端口位清除寄存器
端口位清除寄存器的低16位与端口位设置/清除寄存器的高16位一样;
为了方便操作设置的;

6、端口配置锁定寄存器
