摘要

1 GPIO 模块总体结构

2 GPIO 引脚内部电路结构

3 GPIO 输出模式原理

3.1 推挽输出(Push-Pull)

电路结构

软件配置

工程应用

3.2 开漏输出(Open Drain)

电路结构

工作方式

代码配置

应用场景

3.3 开源输出(Open Source)

电路结构

代码配置

应用场景

4 GPIO 输入模式原理

4.1 输入上拉

4.2 输入下拉

4.3 输入浮空

5 GPIO 输入输出代码逻辑分析

6 GPIO 驱动能力与斜率控制

驱动能力

输出斜率

7 GPIO 工程设计注意事项

1 总线冲突

2 开漏必须有上拉

3 输入引脚不要浮空

4 强驱动谨慎使用

8 GPIO 典型应用设计

LED驱动

按键检测

I²C 总线

9 结论

摘要

通用输入输出端口(General Purpose Input Output,GPIO)是微控制器与外部电路交互的最基本接口。LCM32F067 系列 MCU 提供多达 25 个高速 GPIO,并支持多种工作模式,包括输入、输出、复用功能以及模拟模式等。不同模式下 GPIO 的内部电路结构、驱动方式及寄存器配置均存在显著差异。本文基于 LCM32F067 对 GPIO 内部结构、寄存器控制机制及电气特性进行系统分析,并结合示例工程 main.c 的代码实现,对推挽输出、开漏输出、开源输出以及不同输入模式进行工程化解析。通过电路原理分析与软件配置流程结合,形成一套适用于嵌入式系统开发的 GPIO 设计方法。

源代码路径:链接: https://pan.baidu.com/s/1Y5joDmCpxVQVsJRmqeVzyQ?pwd=azvf 提取码: azvf


1 GPIO 模块总体结构

LCM32F067 MCU 提供多达 25 个高速 I/O 引脚,每个引脚均可配置为输入、输出或复用功能,并支持多种电气驱动模式。

GPIO 的核心特性包括:

  • 支持 悬空输入 / 上拉输入 / 下拉输入

  • 支持 推挽输出 / 开漏输出 / 开源输出

  • 支持 复用功能 (AF)

  • 支持 模拟输入

  • 驱动能力和输出斜率可配置

GPIO 控制主要通过以下寄存器实现:

寄存器 功能
GPIOx_MODER 端口模式配置
GPIOx_OD_BSRR 开漏配置
GPIOx_OS_BSRR 开源配置
GPIOx_SR_BSRR 输出斜率配置
GPIOx_PU_BSRR 上拉配置
GPIOx_PD_BSRR 下拉配置
GPIOx_IDR 输入数据
GPIOx_ODR 输出数据
GPIOx_DR_BSRR 驱动能力配置
GPIOx_CS_SR_BSRR 施密特触发器配置

2 GPIO 引脚内部电路结构

GPIO 引脚内部可以抽象为四个功能模块:

        +------------------------+
 PAD ---| 输入缓冲器 (Schmitt)   |----> IDR
        +------------------------+
                 |
                 |
        +------------------------+
        | 上拉/下拉电阻          |
        +------------------------+
                 |
                 |
        +------------------------+
        | 输出驱动电路           |
        |  (推挽 / 开漏 / 开源)  |
        +------------------------+
                 |
                 |
        +------------------------+
        | 复用 / 模拟开关        |
        +------------------------+

其中:

输入路径

  • 通过施密特触发器进行电平整形

  • 提供抗干扰能力

输出路径

由 MOS 管驱动:

  • 上管:拉高

  • 下管:拉低

不同模式会控制 MOS 管导通方式。


3 GPIO 输出模式原理

3.1 推挽输出(Push-Pull)

电路结构

      VDD
       |
      PMOS
       |
PAD ----------->
       |
      NMOS
       |
      GND

特点:

  • 可以 主动输出高电平

  • 可以 主动输出低电平

  • 输出阻抗低

  • 驱动能力强

软件配置

在示例工程中:

GPIO_ApplyConfig(GPIO_DEMO_PP_PINS,
                 GPIO_Mode_OUT,
                 GPIO_OType_PP,
                 GPIO_PuPd_NOPULL,
                 GPIO_Speed_Level_2);

随后配置驱动能力:

GPIO_DriveConfig(GPIO_DEMO_PORT,
                 GPIO_DEMO_PP_PINS,
                 GPIO_Drive_Level_strong);

代码来自 main.c 示例。

工程应用

适合:

  • LED 驱动

  • 普通数字信号输出

  • SPI / UART TX

优点:

  • 输出速度快

  • 驱动能力强

缺点:

  • 多设备共享总线容易冲突

3.2 开漏输出(Open Drain)

电路结构

      VDD
       |
     上拉电阻
       |
PAD ----------->
       |
      NMOS
       |
      GND

特点:

  • 只能主动 拉低

  • 输出高电平需要 上拉电阻

工作方式

写入值 引脚状态
0 NMOS 导通 → 低电平
1 NMOS 关闭 → 上拉决定高电平

代码配置

GPIO_ApplyConfig(GPIO_DEMO_OUT_PIN0,
                 GPIO_Mode_OUT,
                 GPIO_OType_OD,
                 GPIO_PuPd_UP,
                 GPIO_Speed_Level_1);

应用场景

典型应用:

  • I²C 总线

  • 多设备共享信号线

  • “线与”逻辑

优点:

  • 可实现多设备总线共享

缺点:

  • 上升沿速度较慢

3.3 开源输出(Open Source)

电路结构

      VDD
       |
      PMOS
       |
PAD ----------->
       |
     下拉电阻
       |
      GND

特点:

  • 只能主动 拉高

  • 拉低需要 下拉电阻

代码配置

GPIO_ApplyConfig(GPIO_DEMO_OUT_PIN0,
                 GPIO_Mode_OUT,
                 GPIO_OType_OS,
                 GPIO_PuPd_DOWN,
                 GPIO_Speed_Level_1);

应用场景

较少见,但适合:

  • 高侧驱动

  • 电平转换


4 GPIO 输入模式原理

GPIO 输入模式主要用于检测外部信号。


4.1 输入上拉

内部连接弱上拉电阻。

 VDD
  |
 [R]
  |
PAD -----> MCU

默认状态:

高电平

适合:

  • 按键检测

  • 开关输入

示例代码:

GPIO_ConfigInputMode(GPIO_PuPd_UP);

4.2 输入下拉

内部连接下拉电阻。

PAD -----> MCU
  |
 [R]
  |
 GND

默认状态:

低电平

示例代码:

GPIO_ConfigInputMode(GPIO_PuPd_DOWN);

4.3 输入浮空

无上拉无下拉:

PAD -----> MCU

特点:

  • 阻抗极高

  • 容易受到噪声影响

通常仅用于:

  • 外部电路已提供偏置

  • 模拟信号采样


5 GPIO 输入输出代码逻辑分析

main.c 中:

程序通过宏控制 GPIO 模式:

#define GPIO_DEMO_MODE GPIO_MODE_PUSH_PULL_STRONG

可选模式:

推挽输出
开漏输出
开源输出
输入上拉
输入下拉
输入浮空

程序流程:

SystemInit()
      ↓
SetSysClock()
      ↓
RCC_AHBPeriphClockCmd()
      ↓
GPIO_INIT()
      ↓
while(1)
      ↓
不同模式执行不同逻辑

例如:

推挽模式下:

PA0 = 1
PA1 = 1
延时

PA0 = 0
PA1 = 0
延时

输入模式下:

读取 PA1
↓
复制到 PA0

实现输入电平镜像。


6 GPIO 驱动能力与斜率控制

GPIO 还支持:

驱动能力

寄存器:

GPIOx_DR_BSRR

配置:

  • strong drive

  • weak drive

作用:

  • 控制输出电流能力

输出斜率

寄存器:

GPIOx_SR_BSRR

作用:

  • 控制信号上升下降速度

  • 减少 EMI


7 GPIO 工程设计注意事项

1 总线冲突

推挽输出不能直接并联。

2 开漏必须有上拉

否则:

输出高电平不确定

3 输入引脚不要浮空

浮空输入会:

  • 随机跳变

  • 增加功耗

4 强驱动谨慎使用

过强驱动可能:

  • 产生 EMI

  • 增加功耗


8 GPIO 典型应用设计

LED驱动

GPIO --- R --- LED --- GND

模式:

推挽输出

按键检测

VDD
 |
[R]
 |
GPIO ---- 按键 ---- GND

模式:

输入上拉

I²C 总线

SDA ----+----+
        |    |
      MCU1  MCU2
        |
       上拉

模式:

开漏

9 结论

本文基于 LCM32F067 MCU 的 GPIO 模块,对 GPIO 的内部结构、寄存器配置及多种工作模式进行了系统分析,并结合工程示例代码对各模式的实际应用进行了说明。研究表明,不同 GPIO 模式在电气结构和软件配置上具有明显差异。合理选择 GPIO 模式不仅能够提高系统可靠性,还能够优化信号完整性与功耗性能。在嵌入式系统设计中,应根据外部电路特性选择合适的 GPIO 工作模式,并结合驱动能力和输出斜率配置,实现稳定可靠的硬件接口设计。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐