0

0

0

修罗

站点介绍

只有了解事实才能获得真正的自由

GPIO(一)介绍和工作模式

修罗 2025-08-18 617 6条评论 stm32

首页 / 正文

GPIO(一)介绍和工作模式

1.1 GPIO概述

​ GPIO(General-purpose input/output),通用型输入输出。简单理解就是我们可以控制输入输出的STM32引脚,统称为GPIO。

​ GPIO存在的意义就是用程序控制或读取它们的输出或输入

1.2 GPIO总体说明

​ STM32有多组GPIO,比如我们使用的芯片:STM32F103ZET6共有7组GPIO端口,他们分别是GPIOx(x从A-G),每组控制16个引脚,共有112个GPIO引脚。具体一个其他STM32芯片有多少组GPIO,可以去查看他们的对应的数据手册。

每个引脚的电平是0-3.3V,部分引脚最高可以兼容到5V。

1.2.1 GPIO的主要特点

  1. 不同型号,IO口的数量可能不一样;
  2. 快速翻转(GPIO 引脚电平在高/低之间来回切换)。最快可以达到每2个时钟周期翻转一次。(STM32F1系列最快可以达到50MHz的翻转速度);
  3. 每个IO都可以作为外部中断;
  4. 支持8种工作模式;

1.2.2 GPIO的8种工作模式

​ GPIO端口的每个位(引脚)可以由软件分别配置成8种模式,当然对同一个引脚同一时间只能处于某一种模式中。

  1. 输入浮空(Input floating)
  2. 输入上拉(Input pull-up)
  3. 输入下拉(Input-pull-down)
  4. 模拟输入(Analog)
  5. 通用开漏输出(Output open-drain)
  6. 通用推挽式输出(Output push-pull)
  7. 推挽式复用功能(Alternate function push-pull)
  8. 开漏复用功能(Alternate function open-drain)

​ 每个I/O端口位可以自由编程,然而I/O端口寄存器必须按32位字被访问;
输出模式下可以控制端口输出高电平低电平,用于驱动LED,蜂鸣器等,如果是大功率器件(比如电机),还需要加上驱动器(小电流控制大电流);
输入模式下可以读取端口的高低电平,用于读取外接按键,外接模拟信号的输入,ADC电压采集,模拟通信协议接受数据等;

1.3 GPIO工作模式

1.3.1 GPIO每位的具体电路结构

image-20250816092810355.png

1.3.2 每种模式详解

1.3.2.1 输出模式

  1. 在开漏或推挽式配置中,输出缓冲器被打开,输出缓冲器是 GPIO 内部用于驱动外部负载的电路。
  2. 推挽模式:输出寄存器上的 1 将激活P-MOS,输出高电平。0 将激活N-MOS,输出低电平。
  3. 开漏模式:PMOS永远关闭。 输出寄存器上的 0 激活N-MOS,而输出寄存器上的1 将端口置于高阻状态,所以外部必须要接上拉电阻
  4. 施密特触发输入被激活,施密特触发是输入信号的电平判定方式,具有迟滞(hysteresis),可以防止输入信号在噪声下频繁跳变,输入信号在达到一定高电平或低电平阈值后才会被识别为逻辑 1 或 0,提高抗干扰能力。
  5. 弱上拉和下拉电阻被禁止,GPIO 内部通常带有弱上拉或下拉电阻,用来在引脚悬空时提供默认电平。禁止后,引脚悬空时不再被内部电阻拉高或拉低,需要外部电路提供电平。
  6. 在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器,CPU 读取 IDR 就能获取当前引脚实际电平。
  7. 开漏模式时,读输入数据寄存器时可得到I/O口状态。输入和输出可以不一样,在开漏模式下,读取 IDR 可以得到引脚的实际电平,而不仅仅是你写入的值。
  8. 在推挽模式时,读输出数据寄存器时可得到最后一次写的值,读的跟输出一样。

推挽输出

输出1
  1. 设置寄存器写入1

image-20250818145607545.png

或者直接在输出数据寄存器写入1

image-20250818145753556.png

  1. 输出寄存器收到1

image-20250818145635979.png

  1. 输出控制反转,反转后P-MOS管收到0,非门又将0变成1;N-MOS管反转后变成0;

image-20250818150244580.png

  1. 因此P-MOS导通,引脚输出1高电平:

image-20250818150416812.png

  1. 此时,读引脚也是高电平

image-20250818150508171.png

输出0
  1. 清除寄存器写入1,或者直接在输出数据寄存器写入0

image-20250818150804103.png

  1. 输出数据寄存器收到0

image-20250818150831984.png

  1. 反转后,P-MOS断开,N-MOS导通:

image-20250818150953329.png

  1. 此时引脚输出低电平,读取引脚也是低电平

image-20250818151107754.png

推挽输出总结
  1. 向设置/清除寄存器对应的设置位或清除位写1
  2. 或者直接输出寄存器对应位写1或0
  3. 也可以从输入寄存器读取引脚状态
  4. 工作时两个MOS管交替工作来驱动负载。输出1时,上部晶体管导通将电流推向负载; 输出0时,下部晶体管导通,将电流拉回地线。所以叫推挽输出。

开漏输出

开漏输出模式下,P-MOS管永远关闭:

image-20250818151402036.png

输出0
  1. 清除寄存器写入1,或者直接在输出数据寄存器写入0

image-20250818151623360.png

  1. 输出数据寄存器收到0

image-20250818151655953.png

  1. 反转后,N-MOS导通,输出和读取都是低电平

image-20250818151757820.png

输出1
  1. 设置寄存器或者复直接在输出数据寄存器写入1,输出数据寄存器收到1

image-20250818151943291.png

  1. 反转后,mos管为高组态

image-20250818152025792.png

  1. 通过外接上拉电阻将引脚拉高,输入输出都是高电平:

image-20250818152143896.png

开漏输出总结
  1. 上部晶体管永远关闭;
  2. 可以输出0;
  3. 如果要输出1必须接上拉电阻;

推挽输出和开漏输出的选择

使用推挽
  1. 驱动能力需求较高的场合;
  2. 高速信号传输;
  3. 无需共用信号线的场合;
使用开漏
  1. 多个设备共用信号线;
  2. 不同电压系统之间的接口;
  3. 需要外部上拉电阻来确定逻辑高电平的场合;

1.3.2.2 复用输出模式

内置外设的信号驱动输出缓冲器(复用功能输出),GPIO 不只是普通 I/O 引脚,还可以复用为外设信号(如 UART、SPI、定时器 PWM 输出)。

image-20250818160857185.png

1.3.2.3 输入模式

选择输入模式后,GPIO 的输出驱动会关闭;

  • 引脚处接了两个二极管,作用是保护我们的芯片不会由于电压过高或过低而烧毁。VDD是接电源(3.3V),VSS接地(0V)。如果IO引脚的输入电压高于VDD的值到一定程度,上方保护二极管导通,则引脚电压被拉低到VDD。如果IO引脚的输入电压(负电压)低于VSS到一定程度,则下方保护二极管导通,电压被拉高到VSS。

image-20250818161642731.png

image-20250818161840717.png

  • 如下图,2个开关控制引脚在没有输入的时候是上拉、下拉还是浮空。当上面的开关闭合的时候,输入被拉高到高电平。当下面的开关闭合的时候,输入被拉低到低电平。如果两个都不闭合,输入就是悬空状态。两个同时闭合,就是费电了,不会这么做的。

image-20250818161918509.png

image-20250818161933876.png

image-20250818162008790.png

  • 施密特(图中翻译成肖特基触发器应该是翻译错误,英文版手册是TTL Schmitt trigger)触发器是包含正反馈的比较器电路。可以对信号进行波形整形。

image-20250818162238225.png

从施密特触发器出来的数据,进入到输入数据寄存器中,我们就可以从中读取数据了

1.3.2.4 模拟输入模式

当配置为模拟输入时:

  1. 输出部分被禁止。
  2. 禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强置为0。
  3. 弱上拉和下拉电阻被禁止。
  4. 读取输入数据寄存器时数值永远为0。

image-20250818162619087.png

评论(6)

  1. 1 游客 2025-09-01 11:27 回复

    1

  2. 1 游客 2025-09-01 12:07 回复

    1

  3. @@yuHLu 游客 2025-09-01 12:09 回复

    1

  4. 1 游客 2025-09-01 12:11 回复

    1

  5. 1 游客 2025-09-01 12:12 回复

    1

  6. 1 游客 2025-09-01 12:13 回复

    1


最新评论

  • 1

    1

  • 1

    1

  • -1' OR 2+158-158-1=0+0+0+1 or 'TKCTZnRa'='

    1

  • 1

    1

  • 1

    1

  • 1

    1

  • 1

    1

  • @@5Qa2D

    1

  • 1

    1

  • 1

    1

日历

2025年09月

 123456
78910111213
14151617181920
21222324252627
282930    

文章目录

推荐关键字: Linux webpack js 算法 MongoDB laravel JAVA jquery javase redis