侧边栏壁纸
博主头像
木云舟

行动起来,活在当下

  • 累计撰写 3 篇文章
  • 累计创建 1 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

STM32笔记(二)GPIO

1.GPIO简介

GPIO 的全称是 General Purpose Input Output,即通用输入输出。简单来说,它就是芯片上的那些引脚,你可以通过代码控制它们“通电”或“断电”,也可以让它们去感知外界的电压。


1. GPIO 的基本功能

每个 GPIO 引脚都可以被配置为两种最基本的状态:

  • 输出 (Output):由芯片控制引脚。

    • 高电平 (High):引脚输出约 3.3V 电压(相当于开关接通)。

    • 低电平 (Low):引脚输出 0V 电压(相当于开关断开)。

    • 应用:点亮 LED、驱动蜂鸣器、控制继电器。

  • 输入 (Input):芯片检测引脚上的电压。

    • 如果外界给引脚 3.3V,程序读到的是 1

    • 如果外界给引脚 0V,程序读到的是 0

    • 应用:读取按键是否按下、接收传感器触发信号。


2. GPIO 的内部构造

为了应对不同的场景,STM32 的 GPIO 引脚内部设计了复杂的电路。

你需要重点理解这几种常用模式:

输出模式

  • 推挽输出 (Push-Pull):最常用的输出方式。可以输出高、低电平,驱动能力强,适合点灯、控制驱动电路。

  • 开漏输出 (Open-Drain):只能输出低电平。如果要输出高电平,必须在外电路接一个上拉电阻。常用于 I2C 通信。

输入模式

  • 上拉输入 (Pull-up):引脚内部接一个电阻到 3.3V。当外部没有信号时,引脚默认保持高电平。

  • 下拉输入 (Pull-down):引脚内部接一个电阻到 GND。当外部没有信号时,引脚默认保持低电平。

  • 浮空输入 (Floating):内部既不接上拉也不接下拉,电平极易受外界干扰而抖动。通常在特定的通信协议(如 USART)中使用。


3. GPIO 的命名规则

STM32 的引脚非常多,它是按“组”分的:

  • 组名:GPIOA, GPIOB, GPIOC ... (每一组通常有 16 个引脚)。

  • 编号:0 到 15。

  • 示例PC13 表示 C 组 的第 13 号 引脚(这是很多开发板板载 LED 所在的引脚)。


💡 深度提示:记得开头那句代码吗?

无论是输入还是输出,在操作任何 GPIO 之前,第一步永远是开启该组的时钟。

2.GPIO 引脚基本结构

image-20260121222709593.png

GPIO 的工作原理。

三个核心部分:保护与稳定电路、输入数据路径、输出驱动电路

第一部分:保护与稳定(位于图片最左侧)

这是 GPIO 的“大门”,负责保护内部电路并确保信号初始状态的稳定。

1. 保护二极管 (Protection Diodes)

  • 位置: 图片最左侧,引脚上下各有一个二极管。

  • 原理:

    • 上方二极管: 连接到 VDD(电源)。当引脚输入的电压异常过高(超过 VDD)时,该二极管导通,将多余的电流“泄放”到电源中,防止烧坏内部电路。

    • 下方二极管: 连接到 VSS(地)。当引脚输入的电压异常过低(低于VSS,即负电压)时,该二极管导通,防止负电压损坏芯片。

  • 总结: 它们是芯片的“避雷针”,防止静电或过压损坏芯片。

2. 上拉/下拉电阻 (Pull-Up/Pull-Down Resistors)

  • 位置: 二极管右侧,通过开关连接的两个电阻。

  • 原理:

    • 上拉电阻: 当开关闭合时,引脚通过电阻连接到 VDD。如果外部没有信号(悬空),引脚会被“拉”到高电平。

    • 下拉电阻: 当开关闭合时,引脚通过电阻连接到 VSS。如果外部没有信号,引脚会被“拉”到低电平。

  • 总结: 它们给引脚一个“默认状态”,防止引脚因为悬空而出现乱码。可以通过软件控制这两个开关的通断。


第二部分:输入路径(图中中间部分,箭头向右 ---->)

当我们需要读取外部信号(如按键按下、传感器信号)时,信号走这条路。

3. 施密特触发器 (Schmitt Trigger)

  • 位置: 三角形符号,位于输入线上。

  • 原理: 这是一个特殊的电压比较器。外部输入的信号往往不是完美的 0V 或 3.3V,可能带有杂波或处于中间电压。

    • 当电压高于某个阈值(如 2.0V),它输出逻辑 1

    • 当电压低于某个阈值(如 1.0V),它输出逻辑 0

  • 总结: 它的作用是“整形”和“滤波”,把外部不稳定的模拟电压变成内部 CPU 能看懂的纯净数字信号(0 或 1)。

4. 输入数据寄存器 (IDR)

  • 位置: 施密特触发器后面。

  • 原理: 这是一个存储单元。施密特触发器输出的“0”或“1”会暂时存放在这里。

  • 总结: 它是“信箱”。CPU 随时来读取 IDR 里的数值,就知道当前引脚是高电平还是低电平了。


第三部分:输出路径(图中右侧部分,箭头向左 <----)

当我们需要控制外部设备(如点亮 LED、发送数据)时,信号走这条路。

5. 输出数据寄存器 (ODR)

  • 位置: CPU 右侧。

  • 原理: 当你在代码中写 GPIO_Write(1) 时,CPU 会把这个“1”写入 ODR 寄存器。

  • 总结: 它是“指令台”,保存了 CPU 想要输出的目标电平。

6. 输出驱动器 (Output Driver - MOS管组)

  • 位置: 图片最右侧的大方框,包含 P-MOSFET (上管) 和 N-MOSFET (下管)。

  • 原理: 这是一个电子开关组合,根据 ODR 的指令来控制引脚电压。图中展示了两种模式:

    • 模式 A:推挽输出 (Push-Pull) —— 驱动能力强

      • 输出高电平 (1): 上方的 P-MOS 导通,下方的 N-MOS 截止。电流从VDD 流向引脚,对外输出高电平。

      • 输出低电平 (0): 上方的 P-MOS 截止,下方的 N-MOS 导通。电流从引脚流向VSS,对外输出低电平。

    • 模式 B:开漏输出 (Open-Drain) —— 用于 I2C 或 电平转换

      • 输出低电平 (0): 下方的 N-MOS 导通,引脚直接接地(VSS),输出强低电平。

      • 输出高电平 (1): 上方的 P-MOS 不工作 (被断开),下方的 N-MOS 截止。此时引脚处于“高阻态”(相当于断路)。注意: 此时必须在外部接一个上拉电阻,才能将电平拉高。


总结信号流向

  1. 读数据 (Input):

    外部引脚电压----> 保护二极管(过压保护) -----> 施密特触发器(整形) ----> IDR寄存器-----> CPU 读取。

  2. 写数据 (Output):

    CPU 写指令-----> ODR寄存器 ----> 输出控制电路----> 控制 P-MOS/N-MOS 开关 ----> 引脚呈现高/低电平。

3.GPIO位结构

image-20260121224250149.png

这张图片展示了一个非常经典且标准的 GPIO(通用输入/输出)位结构图(看起来非常像 STM32 系列单片机的 GPIO 结构)。按照信号流向功能模块,把这张图拆解为四个核心部分:

1. 保护电路 (最右侧)

位于图片的最右侧,直接连接外部引脚。

  • 组件: 两个保护二极管(一个接 $V{DD}$,一个接 $V{SS}$)。

  • 工作原理:

    • 这是芯片的“防弹衣”。

    • 如果引脚电压 高于 $V_{DD}$,上方二极管导通,电流流向电源。

    • 如果引脚电压 低于 $V_{SS}$(负电压),下方二极管导通,电流从地流出。

  • 目的: 防止外部过高或过低的电压(如静电 ESD)烧毁芯片内部的精密电路。


2. 上拉/下拉电阻 (右侧上方)

位于保护二极管的左侧。

  • 组件: 两个开关 + 两个电阻。

  • 工作原理: 通过软件配置这两个开关的闭合状态。

    • 上拉 (Pull-up): 上方开关闭合,引脚通过电阻连到 $V_{DD}$,默认为高电平。

    • 下拉 (Pull-down): 下方开关闭合,引脚通过电阻连到 $V_{SS}$,默认为低电平。

    • 浮空 (Floating): 两个开关都断开,电平由外部信号完全决定。

  • 目的: 消除引脚在没有外部信号时的不确定状态(防止乱码)。


3. 输入驱动器 (中间上部)

这是信号从外部进入芯片的通道。图片中展示了信号进入后的三条分路:

  • 核心组件:TTL肖特基触发器 (Schmitt Trigger)

    • 它是一个迟滞比较器,作用是将外部波动的模拟电压信号“整形”为标准的数字信号(0 或 1)。

    • 注意: 图中显示它有一个“开/关”控制。当配置为模拟输入模式时,这个触发器会被关闭,以节省功耗。

  • 信号的三条去路:

    1. 模拟输入 (至片上外设):

      • 路径: 不经过肖特基触发器,直接传输电压值。

      • 用途: 给 ADC(模数转换器)读取具体的电压数值。

    2. 复用功能输入 (至片上外设):

      • 路径: 经过触发器整形后,直接连接到内部的其他外设。

      • 用途: 例如串口 (UART) 的 RX 引脚、定时器的输入捕获引脚。

    3. 输入数据寄存器 (至 CPU):

      • 路径: 经过触发器整形后,存入输入数据寄存器

      • 用途: CPU 通过“读出”指令读取该寄存器,就能知道当前引脚是 0 还是 1。


4. 输出驱动器 (中间下部)

这是信号从芯片发往外部的通道。

  • 写数据源头:

    • 位设置/清除寄存器 (BSRR): 这是一个控制型寄存器,CPU 往这里写数据,可以原子操作地修改 ODR 的值(防止多任务打断产生的风险)。

    • 输出数据寄存器 (ODR): 最终决定输出电平的地方,锁存数据。

    • 复用功能输出: 如果开启复用(如 PWM 输出),信号来源就不是 ODR,而是来自片上外设(如定时器)。

  • 输出控制逻辑:

    • 图中有一个梯形选择器(多路选择器),决定是让 ODR 控制引脚,还是让 复用功能 控制引脚。

    • 随后进入“输出控制”模块,这里会根据模式(推挽或开漏)处理信号,控制后面的 MOS 管。

  • 双 MOS 管驱动电路 (P-MOS + N-MOS):

    • 推挽模式 (Push-Pull): P-MOS 和 N-MOS 轮流工作。输出 1 时 P-MOS 导通(强上拉);输出 0 时 N-MOS 导通(强下拉)。驱动能力强,开关速度快。

    • 开漏模式 (Open-Drain): P-MOS 彻底不工作。输出 0 时 N-MOS 导通(接地);输出 1 时 N-MOS 截止(高阻态)。需要外接上拉电阻才能输出高电平,常用于 I2C 通信。

    • 关闭 (模拟模式): P-MOS 和 N-MOS 都关闭,引脚呈现高阻态,避免干扰模拟信号读取。


总结图中的工作流

  1. CPU 写: CPU----> 位设置/清除寄存器 ----> 输出数据寄存器 ----> 输出控制 ----> MOS管 ----> 引脚电平变化

  2. CPU 读: 引脚电平 ----> 肖特基触发器 ----> 输入数据寄存器 ----> CPU 读取

  3. 外设复用: 信号直接绕过数据寄存器,在复用功能输入/输出通道与片上外设(如 I2C, SPI, USART)直接交互。

4.GPIO模式

通过配置GPIO的端口配置寄存器,端口可以配置成以下8种模式:

模式名称

性质

特征

浮空输入

数字输入

可读取引脚电平,若引脚悬空,则电平不确定

上拉输入

数字输入

可读取引脚电平,内部连接上拉电阻,悬空时默认高电平

下拉输入

数字输入

可读取引脚电平,内部连接下拉电阻,悬空时默认低电平

模拟输入

模拟输入

GPIO无效,引脚直接接入内部ADC

开漏输出

数字输出

可输出引脚电平,高电平为高阻态,低电平接VSS

推挽输出

数字输出

可输出引脚电平,高电平接VDD,低电平接VSS

复用开漏输出

数字输出

由片上外设控制,高电平为高阻态,低电平接VSS

复用推挽输出

数字输出

由片上外设控制,高电平接VDD,低电平接VSS

0

评论区