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的主要特点
- 不同型号,IO口的数量可能不一样;
- 快速翻转(GPIO 引脚电平在高/低之间来回切换)。最快可以达到每2个时钟周期翻转一次。(STM32F1系列最快可以达到50MHz的翻转速度);
- 每个IO都可以作为外部中断;
- 支持8种工作模式;
1.2.2 GPIO的8种工作模式
GPIO端口的每个位(引脚)可以由软件分别配置成8种模式,当然对同一个引脚同一时间只能处于某一种模式中。
- 输入浮空(Input floating)
- 输入上拉(Input pull-up)
- 输入下拉(Input-pull-down)
- 模拟输入(Analog)
- 通用开漏输出(Output open-drain)
- 通用推挽式输出(Output push-pull)
- 推挽式复用功能(Alternate function push-pull)
- 开漏复用功能(Alternate function open-drain)
每个I/O端口位可以自由编程,然而I/O端口寄存器必须按32位字被访问;
输出模式下可以控制端口输出高电平低电平,用于驱动LED,蜂鸣器等,如果是大功率器件(比如电机),还需要加上驱动器(小电流控制大电流);
输入模式下可以读取端口的高低电平,用于读取外接按键,外接模拟信号的输入,ADC电压采集,模拟通信协议接受数据等;
1.3 GPIO工作模式
1.3.1 GPIO每位的具体电路结构
1.3.2 每种模式详解
1.3.2.1 输出模式
- 在开漏或推挽式配置中,输出缓冲器被打开,输出缓冲器是 GPIO 内部用于驱动外部负载的电路。
- 推挽模式:输出寄存器上的 1 将激活P-MOS,输出高电平。0 将激活N-MOS,输出低电平。
- 开漏模式:PMOS永远关闭。 输出寄存器上的 0 激活N-MOS,而输出寄存器上的1 将端口置于高阻状态,所以外部必须要接上拉电阻
- 施密特触发输入被激活,施密特触发是输入信号的电平判定方式,具有迟滞(hysteresis),可以防止输入信号在噪声下频繁跳变,输入信号在达到一定高电平或低电平阈值后才会被识别为逻辑 1 或 0,提高抗干扰能力。
- 弱上拉和下拉电阻被禁止,GPIO 内部通常带有弱上拉或下拉电阻,用来在引脚悬空时提供默认电平。禁止后,引脚悬空时不再被内部电阻拉高或拉低,需要外部电路提供电平。
- 在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器,CPU 读取 IDR 就能获取当前引脚实际电平。
- 开漏模式时,读输入数据寄存器时可得到I/O口状态。输入和输出可以不一样,在开漏模式下,读取 IDR 可以得到引脚的实际电平,而不仅仅是你写入的值。
- 在推挽模式时,读输出数据寄存器时可得到最后一次写的值,读的跟输出一样。
推挽输出
输出1
- 设置寄存器写入1
或者直接在输出数据寄存器写入1
- 输出寄存器收到1
- 输出控制反转,反转后P-MOS管收到0,非门又将0变成1;N-MOS管反转后变成0;
- 因此P-MOS导通,引脚输出1高电平:
- 此时,读引脚也是高电平
输出0
- 清除寄存器写入1,或者直接在输出数据寄存器写入0
- 输出数据寄存器收到0
- 反转后,P-MOS断开,N-MOS导通:
- 此时引脚输出低电平,读取引脚也是低电平
推挽输出总结
- 向设置/清除寄存器对应的设置位或清除位写1
- 或者直接输出寄存器对应位写1或0
- 也可以从输入寄存器读取引脚状态
- 工作时两个MOS管交替工作来驱动负载。输出1时,上部晶体管导通将电流推向负载; 输出0时,下部晶体管导通,将电流拉回地线。所以叫推挽输出。
开漏输出
开漏输出模式下,P-MOS管永远关闭:
输出0
- 清除寄存器写入1,或者直接在输出数据寄存器写入0
- 输出数据寄存器收到0
- 反转后,N-MOS导通,输出和读取都是低电平
输出1
- 设置寄存器或者复直接在输出数据寄存器写入1,输出数据寄存器收到1
- 反转后,mos管为高组态
- 通过外接上拉电阻将引脚拉高,输入输出都是高电平:
开漏输出总结
- 上部晶体管永远关闭;
- 可以输出0;
- 如果要输出1必须接上拉电阻;
推挽输出和开漏输出的选择
使用推挽
- 驱动能力需求较高的场合;
- 高速信号传输;
- 无需共用信号线的场合;
使用开漏
- 多个设备共用信号线;
- 不同电压系统之间的接口;
- 需要外部上拉电阻来确定逻辑高电平的场合;
1.3.2.2 复用输出模式
内置外设的信号驱动输出缓冲器(复用功能输出),GPIO 不只是普通 I/O 引脚,还可以复用为外设信号(如 UART、SPI、定时器 PWM 输出)。
1.3.2.3 输入模式
选择输入模式后,GPIO 的输出驱动会关闭;
- 引脚处接了两个二极管,作用是保护我们的芯片不会由于电压过高或过低而烧毁。VDD是接电源(3.3V),VSS接地(0V)。如果IO引脚的输入电压高于VDD的值到一定程度,上方保护二极管导通,则引脚电压被拉低到VDD。如果IO引脚的输入电压(负电压)低于VSS到一定程度,则下方保护二极管导通,电压被拉高到VSS。
- 如下图,2个开关控制引脚在没有输入的时候是上拉、下拉还是浮空。当上面的开关闭合的时候,输入被拉高到高电平。当下面的开关闭合的时候,输入被拉低到低电平。如果两个都不闭合,输入就是悬空状态。两个同时闭合,就是费电了,不会这么做的。
- 施密特(图中翻译成肖特基触发器应该是翻译错误,英文版手册是TTL Schmitt trigger)触发器是包含正反馈的比较器电路。可以对信号进行波形整形。
从施密特触发器出来的数据,进入到输入数据寄存器中,我们就可以从中读取数据了
1.3.2.4 模拟输入模式
当配置为模拟输入时:
- 输出部分被禁止。
- 禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强置为0。
- 弱上拉和下拉电阻被禁止。
- 读取输入数据寄存器时数值永远为0。
1 游客 2025-09-01 11:27 回复
1
1 游客 2025-09-01 12:07 回复
1
@@yuHLu 游客 2025-09-01 12:09 回复
1
1 游客 2025-09-01 12:11 回复
1
1 游客 2025-09-01 12:12 回复
1
1 游客 2025-09-01 12:13 回复
1