STM32(6)-- GPIO外设

1. GPIO跟引脚有什么区别

引脚包含GPIO,引脚还包括电源引脚,BOOT引脚,复位引脚等

下图是STM32数据手册中的引脚分类

2. GPIO简介

3. GPIO功能框图

3.1 保护二极管、上下拉电阻

保护二极管

STM32的引脚出了ADC,都是可以容忍5V供电

如输入电压大于5V,则通过上面的保护二极管;如输入电压小于0V,如-1V,则由VSS经下面的二极管从I/O出去。

上下拉电阻

"弱上拉(weak pull-up)"可以把它理解成:STM32 在引脚内部偷偷帮你接了一根"很大电阻"的上拉到 VDD ,让引脚在没人驱动时不要飘(floating),但它拉不动大电流


  1. 弱上拉到底"弱"在哪?

因为内部上拉并不是直接硬连到 VDD,而是类似这样:

VDD ──(几十 kΩ 的电阻)── GPIO 引脚

这个"电阻很大"(常见量级 30kΩ~50kΩ,不同芯片略有差异),所以电流很小:

  • 假设 3.3V、40kΩ

    电流约:3.3V / 40kΩ ≈ 0.082mA(82µA)

这点电流只能做一件事:给输入脚一个默认高电平

它不适合拿来供电、驱动 LED、拉动继电器之类的负载。


  1. 弱上拉的典型用途

给输入脚提供默认电平

比如按键一端接 GND,另一端接 GPIO,打开弱上拉后:

  • 不按:GPIO 被弱上拉 → 读到 1

  • 按下:GPIO 被按键直接拉到 GND → 读到 0

避免悬空导致乱跳

输入脚悬空时会因为噪声随机读 0/1,弱上拉/下拉就是为了稳定它。


  1. 为什么说"要大电流还得外部上拉"?

因为外部上拉可以用更小的电阻,比如 4.7kΩ / 10kΩ:

  • 3.3V + 4.7kΩ

    电流约:0.7mA(比内部弱上拉大很多)

  • 上升沿更快、抗干扰更强、能拉住更"重"的外部电路输入

内部弱上拉:

  • 电流小

  • 抗干扰一般

  • 对长线、强干扰环境可能不够稳

上下拉电阻的控制,通过上拉/下拉寄存器控制,如下所示

PUPDR0[1:0] 里的 [1:0] 表示:这个字段(field)占用 2 个比特 ,从 bit1 到 bit0

  • [高位:低位] 是寄存器手册里描述"位范围"的常见写法

  • 所以 PUPDR0[1:0] = 两位二进制数(bit1、bit0 组成)

  • 这两位合起来编码含义(你截图里那张表):

    • 00:无上拉/下拉

    • 01:上拉

    • 10:下拉

    • 11:保留

同理:

  • PUPDR3[1:0] 不是寄存器的 bit1..0,而是"第3组字段也有两位",它在整个 32-bit 寄存器里的位置是 bit(23+1 : 23) = bit7:6

记住一句话:
[1:0] 说的是字段宽度(2 bit),字段在寄存器里的实际位置要看它对应的 bit 范围(比如 7:6、25:24 等)。
中间那张"31...0 的大表":这是位段分布图

GPIOx_PUPDR 这个寄存器是 32 位,每个引脚用 2 位控制(所以刚好 16 个引脚 ×2 = 32 位)。

表里你看到:

  • PUPDR15[1:0] 对应 bit31..30

  • PUPDR0[1:0] 对应 bit1..0

  • ......

下面的 rw 意思是 read/write(可读可写)

3.2 输出模式

P-MOS 和 N-MOS 本质都是 MOSFET(场效应管),区别主要在沟道类型、需要的栅极驱动方向、导通特性,以及常见用法(高边/低边)。


1)最核心的区别

N-MOS(NMOS)

  • 多数载流子:电子

  • 栅极相对源极为正 才导通:
    Vgs > Vth → 导通

  • 一般 导通电阻更小、同尺寸下电流能力更强、价格常更友好

P-MOS(PMOS)

  • 多数载流子:空穴

  • 栅极相对源极为负 才导通:
    Vgs < −Vth → 导通(也可理解为"栅极比源极低"才开)

  • 一般 导通电阻更大(同工艺同尺寸下通常不如 NMOS)

推挽输出

开漏输出

在 GPIO 里,"MOS 导通"≈"强上拉/强下拉"

  • **推挽输出(push-pull)**时:

    • 上面的 P-MOS 导通 :输出被主动拉向 VDD → 可理解为强上拉

    • 下面的 N-MOS 导通 :输出被主动拉向 GND/VSS → 可理解为强下拉

  • 相比之下,弱上拉/弱下拉 是通过很大的电阻(几十 kΩ)拉,不是用 MOS 管"硬拉"。

但别把"强"理解成"无限强"

MOS 导通也不是理想短路,它有 Rds(on)(等效导通电阻),所以:

  • 输出高电平并不一定等于 VDD(带大电流时会掉一点)

  • 输出低电平也不一定等于 0V(带大电流时会抬一点)

  • STM32 每个 IO 口都有最大灌/拉电流限制(具体数值看 datasheet)

所以更准确的说法是:

MOS 导通 = 低阻驱动(strong drive),但受限于导通电阻和电流规格。

还有一种情况:开漏不是"强上拉"

  • **开漏输出(open-drain)**时:

    • 只有 N-MOS那条"强下拉"

    • "上拉"要靠外部电阻内部弱上拉

      → 这时候就不是"强上拉"了

输出类型寄存器

两种输出模式通过输出类型寄存器控制

输出速度寄存器

3.3 数据输出

端口置位/复位寄存器

输出数据寄存器

也就是说BSRR寄存器会影响ODR寄存器

3.4 复用功能输出

端口模式寄存器

以上说的输出模式都是通用输出模式,复用功能模式的输入输出就是片上的外设来控制IO口了,另外复用输出时,就是片上外设直接控制输出数据寄存器了(ODR),不用置位/复位寄存器了。

3.5 输入数据寄存器

3.6 复用功能输入

下面把 TTL 电平CMOS 电平 讲清楚:它们本质是两套"数字 0/1 怎么判定"的电压门限 和对应的输出能力/输入特性。工程里最重要的是:能不能互连、需不需要电平转换


1)TTL 电平是什么

TTL 来自早期 5V TTL 逻辑芯片 (74xx 系列等)的标准。它的门限特点是相对固定(不太随电源比例变化),典型(经典 TTL):

  • 输入低(0):VIL ≤ 0.8V

  • 输入高(1):VIH ≥ 2.0V

输出保证(典型):

  • 输出低:VOL ≤ 0.4V

  • 输出高:VOH ≥ 2.4V(注意:不一定到 5V

特点总结:

  • 高电平判定门限比较低(≥2.0V 就算 1)

  • 输出高电平不必接近 5V

  • 早期 TTL 输入需要一定电流(输入特性与老 CMOS 不同)


2)CMOS 电平是什么

CMOS 是另一类逻辑家族,门限通常跟供电电压 VDD 成比例(不同系列会有差异,但"比例型"是典型特征)。

常见经验值(很多 CMOS/MCU 输入大致如此,具体看 datasheet):

  • 输入低(0):VIL ≤ 0.3 × VDD

  • 输入高(1):VIH ≥ 0.7 × VDD

例如 VDD=3.3V:

  • 低:≤ 0.99V

  • 高:≥ 2.31V

特点总结:

  • 门限随 VDD 变化(3.3V 和 5V 的门限不同)

  • 静态输入电流非常小(高阻输入)

  • 输出高电平通常更接近 VDD("摆幅更满")

3.7 模拟输入输出

4. GPIO工作模式

4.1 输入模式(上拉/下拉/浮空)

4.2 输出模式(推挽/开漏,上拉/下拉)

4.3 复用功能(推挽/开漏,上拉/下拉)

4.4 模拟输入输出

相关推荐
我爱我家diyer2 小时前
使用STM32的HAL库开发GD32F303CGT6
stm32·单片机·嵌入式硬件
新能源BMS佬大3 小时前
【仿真到实战】STM32落地EKF算法实现锂电池SOC高精度估算(含硬件驱动与源码)
stm32·嵌入式硬件·算法·电池soc估计·bms电池管理系统·扩展卡尔曼滤波估计soc·野火开发板
点灯小铭3 小时前
基于单片机的井盖安全监测与报警上位机监测系统设计
单片机·嵌入式硬件·毕业设计·课程设计
Hello_Embed4 小时前
USB 虚拟串口源码改造与 FreeRTOS 适配
笔记·单片机·嵌入式·freertos·usb
无垠的广袤4 小时前
【CPKCOR-RA8D1】RUHMI 转换 AI 模型
人工智能·python·嵌入式硬件·开发板
望眼欲穿的程序猿5 小时前
SDCC+Ai8051U 中断点灯
stm32·单片机·嵌入式硬件
youcans_6 小时前
【动手学STM32G4】(15)三路互补带死区 PWM 输出
stm32·单片机·嵌入式硬件·pwm·死区
小慧10246 小时前
外部中断与回调函数
stm32·单片机·嵌入式硬件
加斯顿工程师6 小时前
STM32F103C8T6驱动DS18B20温度传感器程序
stm32·单片机·嵌入式硬件