03 GPIO
General Purpose Input/Output 通用输入输出端口
up的视频讲解: https://space.bilibili.com/1455872040
1 ⭐️GPIO简介

GPIO(General Purpose Input Output)通用I/O端口, 是STM32芯片与外部设备的电气接口
-
STM32F103C8T6的LQFP48封装主要引出GPIOA、GPIOB、GPIOC,另外PD0/PD1与外部高速晶振功能相关;实际可用脚以封装引脚表为准
-
每组标准 16 个引脚(编号 0~15,标注 PAx/PBx/PCx)
-
C8T6属于中容量器件,采用48引脚封装,并不是每组16个脚都全部引出。
-
输入
- Input floating 浮空
- Input pull-up 上拉
- Input-pull-down 下拉
- Analog 模拟输入
-
输出
- Output push-pull 推挽
- Output open-drain 开漏
- Alternate function push-pull 复用推挽
- Alternate function open-drain 复用开漏
-
输出速度(3档)
- 低速 2MHz
- 中速 10MHz
- 高速 50MHz
-
输入
上下拉在输入悬空或外部未主动驱动时提供默认电平,不是只在初始化瞬间有效;外部电路正常驱动时还要满足输入阈值。
2 ➡️GPIO四种输入
2.1 输入结构

保护二极管: IO引脚上下两边两个二极管用于防止引脚外部过高、过低的电压输入
上拉、下拉电阻:开启上拉的时候引脚初始状态为高电平,开启下拉的时候引脚初始状态为低电平
TTL施密特触发器:IO口信号经过触发器后,模拟信号转化为0和1的数字信号
IDR- Input data register(输入数据寄存器):锁存引脚的实时电平状态, 供 CPU 读取
2.2 浮空输入

- 浮空输入模式下,I/O端口的电平信号直接进入输入数据寄存器
- MCU直接读取I/O口电平,I/O的初始电平状态是不确定的,完全由外部输入决定
2.3 上拉输入

- IO内部接上拉电阻 此时IO口默认为高电平
2.4 下拉输入

- IO内部接下拉电阻 此时IO口默认为低电平
STM32的内部上拉是"弱上拉",因为有上/下拉电阻的存在,通过此上/下拉输出的电流是很弱的,所以有外部输入是, 电平由外部决定
2.5 模拟输入

-
模拟输入模式下,外部电平信号没有流入输入数据寄存器,而是直接流入模拟输入部分
-
当GPIO引脚用于ADC采集电压的输入通道时,用作"模拟输入"功能,此时信号不经过施密特触发器,直接直接进入ADC模块
-
当GPIO用于模拟功能时,引脚的上、下拉电阻是不起作用的,这个时候即使配置了上拉或下拉模式,也不会影响到模拟信号的输入输出
-
除了 ADC 和 DAC 要将 IO 配置为模拟通道之外其他外设功能一律 要配置为复用功能模式
3 ⬅️GPIO四种输出
3.1 输出结构

P-MOS管和N-MOS管:通过P-MOS管和N-MOS管的互补配合 实现IO口输出高低电平
-
ODR- Output data register (输出数据寄存器):存储 CPU 要输出的目标电平状态 -
BSRR/BRR- Bit set/reset registers ( 置位 / 复位寄存器):原子操作置位 / 复位引脚, 避免多任务冲突
剩下三个在GPIO的框架图里面没有标注出来
-
GPIOx_CRL- Port configuration register Low(端口配置低寄存器): 用于配置低八位引脚的模式(PIN0到PIN7引脚) -
GPIOx_CRH- Port configuration register High (端口配置高寄存器) 该寄存器配置信息和上面的一样, 用于配置高八位引脚(PIN8到PIN15)
-
该寄存器使用了32位, 每个引脚对应4位去配置, 所以一个寄存器对应8个引脚
-
四位中, 低两位叫
MODE, 高两位叫CNF -
低两位MODE的信息分别控制引脚的输入输出方向, 和输出速度
-
高两位CNF的信息分别控制 输入/输出方向下的 四种模式
3.2 推挽输出

-
推挽模式下,
P-MOS和N-MOS都受输出控制逻辑驱动 -
如果我们控制输出为0,低电平,则P-MOS管关闭,N-MOS管导通,使输出低电平,I/O端口的电平就是低电平
-
若控制输出为1 高电平,则P-MOS管导通N-MOS管关闭,使输出高电平,I/O端口的电平就是高电平
-
此时施密特触发器是打开的,即输入可用
3.3 开漏输出

开漏模式下, P-MOS始终断开, 只有 N-MOS 工作
-
如果我们控制输出为0,低电平,则P-MOS管关闭,N-MOS管导通,使输出低电平,I/O端口的电平就是低电平
-
若控制输出为1时,高电平,则P-MOS管和N-MOS管都关闭,即释放端口
-
并且此时施密特触发器是打开的,即输入可用
- MOS 管有栅极 (基极)、漏极 (集电极)、源极 (发射极)
- 开漏 = 漏极对外开路(只接内部 N-MOS 管漏极,不接上拉电源)
3.4 复用推挽输出

其信号来源是由复用功能相关的通信通道来控制 下的推挽输出
3.5 复用开漏输出

控制信号的来源由复用功能的外设决定的开漏输出
开漏输出比推挽输出少用了一个 P-MOS, 它的意义在于
-
开漏输出只可输出低电平,要得到高电平状态需要外接上拉电阻才行
-
开漏输出一般应用在I2C等需要“线与”功能的总线电路中。
-
除此之外,还用在电平不匹配的场合,如需要输出5伏的高电平,就可以在外部接一个上拉电阻,上拉电源为5伏
✅模式选择与验证
| 连接对象 | 常用模式 | 验证方法 |
|---|---|---|
| 接3.3 V的按键 | 下拉输入 | 松开0,按下1 |
| LED或模块控制端 | 推挽输出 | 固定写高、写低,测引脚电压 |
| IIC总线 | 复用开漏并有上拉 | 释放时能回到高电平 |
| ADC模拟信号 | 模拟输入 | 数字输入路径关闭,ADC读数随电压变化 |
2/10/50 MHz描述输出驱动速度档位,不会让GPIO自动输出对应频率的方波。保护结构也不是“任意电压都能接”的保证,5 V容忍与模拟输入限制要查具体引脚。