文章目录
一、初识GPIO
1.1 GPIO输出速度
一般我们使用GPIO都是使用输入模式或者是输出模式,所为输入模式就是起到检测作用,例如我们将GPIO连接按键,那么通过高电平有效或者低电平有效判断按键按下有效。或者我们使用输出模式将该GPIO口连接LED灯,通过高低电平点亮对应的LED灯,亦或者是AD口等等。
其中GPIO有一个最关键的地方就是最大输出速度,也就是GPIO口高低电平翻转的最快频率。
如下图所示:
知道翻转速度有什么用?
可以在某种情况下通过配置GPIO的速度来改善一些控制情况。
图中同红色标注的,这里就是一个电平翻转,从低电平到到高电平,然后在到低电平,这是一个周期。需要注意的是频率就是单位时间内高低电平翻转的次数,我们需要求的是一次翻转电平的时间,因此需要f的倒数,在10MHZ频率下,我们可以算出,高低电平翻转一次需要的时间是100ns,但是不是绝对的,
理想状态下高电平直接就变成低电平,但是从图中就可以看出,并不是如此。
就是在日常生活中肯定是有一个变化趋势的,也就说,在课本上我们学到的高电平直接到低电平是不可能的实现的,因为没有这种元器件支持。
GPIO在电平变化过程中有一个上升时间和下降时间。并且这个数值是有要求的。两个时间只差小于(2/3)T,频率越高,这是时间就要求的约苛刻。这应该也是芯片的一个技术难点。
10MHZ 100ns 单个的上升时间或者下降时间需要小于38ns
50MHZ 20ns 单个的上升时间或者下降时间需要小于6ns
1.2 分析上升时间和下降时间
既然存在上升时间和减少时间,并且不同频率下这个速度不一样,那么就说明这个时间是通过技术可以降低的,这就涉及到电子器件的工艺,我们仅在这里做理论分析。
高低电平的变化,也就是电压变化的快慢,也就是电容的充放电的速度很快,而我们经常说的0和1指得就是电容的充放电过程,只不过是将充电和放电后的状态用数字进行具象化表达。是不是这样的,好像确实是这样的。
此时看公式就可以看出来,就是这样意思,电压变化的越快,那么电流就很大,对用的功耗就很高。也进一步证实了这个样子,(当然电路中的所有电容不都是这个效果,但是可以通过这个方式去理解电容充充放电过程,还有就是一个芯片内部有很多电容,也就是通过这个进行存储的吧。对于电容可以先进行简单的理解。)
1.3 单片机内部干扰或者电路中干扰的理解
根据电容公式,电压变化越快,电流越大。在单片机内部就是频率理解:频率越高,也会出现电磁干扰的现象,也就是电生磁,磁生电??
电压变化率(dv/dt)越大,电流(I)越大。在单片机内部,高频信号(如时钟信号)的快速切换会导致电压急剧变化,从而产生较大的瞬态电流。
高频电路:
高频信号(如MHz级别的时钟)的快速边沿(上升/下降时间短)会导致电流尖峰,这些瞬态电流通过导线和寄生电感时,会引发电压波动(V=L⋅di/dt),进一步加剧噪声。
关于电生磁(传导干扰):
高频电流在导线中流动时,周围会产生交变磁场(安培定律)。若磁场耦合到邻近电路(如信号线或电源线),会感应出干扰电压,形成传导干扰。
关于磁生电(辐射干扰)
交变磁场在空间中传播,形成电磁波(麦克斯韦方程组)。若其他电路或设备接收到这些电磁波,会感应出噪声电流,即辐射干扰。
谐波与串扰:
高频信号的谐波成分(如时钟信号的奇次谐波)可能通过电源线或PCB走线耦合到其他电路,导致串扰或共模干扰。
晶振干扰:
无源晶振的反馈环路易受电磁干扰,导致频率漂移(如对讲机靠近时漂移±100ppm),进而引发单片机程序跑飞。
PWM调光干扰:
LED驱动电路的高频PWM信号若未良好滤波,会通过电源线传导至其他电路,导致ADC采样错误。
以上这些内容知道了解就行,有个印象。
配置GPIO得时候频率的大小根据需求进行配置,够用就行。没必要浪费,因为功耗会很大。
这个地方不仅有电容的影响,还会有电压的影响。
主要产生干扰的其实是高频的对低频的干扰
二、GPIO的模式分析
每个 GPIO 引脚可以由软件配置为输出(推挽或开漏)、输入、外设备用功能或者模拟模式。
每个 GPIO 引脚都可以配置为上拉、下拉或浮空。除模拟模式外,所有的 GPIO 引脚都具备大电流驱动能力。
GPIO有三种状态:高电平,低电平,浮空/高阻态。
2.1 输出模式
根据上图可以看出有一个片上外设,这个片上外设值得就是ADC、通信串口Uart等,可以想想一下我需要AD检测,不管是输入芯片的是电流还是电压都是需要引脚作为支撑,那么这个引脚不就是我们常指的GPIO口,如果是作为检测使用,那么我们不就需要将GPIO配置为输入,然后另外一端链接的是AD检测模块,有对应的电路,这也是为什么有些GPIO可以作为AD检测有些不可以作为检测口,正是这个原因。并且有些可以作为Uart有些不能作为UArt口道理都是一样的,甚至DMA也是如此。之前一直不理解为什么,今天有点通透了。
还有一个就是片上外设值得是芯片上面的集成的外设,需要对应电路作为配合。还有一个外设是芯片驱动的,我们称之为负载。注意别把片上外设理解成我们的负载。
言归正传:
输出模式下一般分为推挽输出和开漏输出。
2.1.1 推挽输出(push-pull)
推挽输出(Push-Pull Output)由两个互补的晶体管(上管P-MOS、下管N-MOS)组成。通过输出驱动器控制P-MOS和N-MOS开关来输出高低电平的。 可以理解为对电流进行推拉操作 。
-
输出高电平:上管导通,下管截止,电流从电源经上管流向负载(“推”模式)。
-
输出低电平:上管截止,下管导通,电流从负载经下管流向地(“挽”模式)
“强推挽”是推挽输出的增强版本,主要差异在驱动能力和导通电阻:
-
驱动电流更大:
-
普通推挽输出驱动电流一般为数mA至25mA(如STM32的IO口最大25mA)。
-
强推挽通过优化晶体管尺寸或降低导通电阻,可提供更高的电流(例如50mA以上),适合驱动重负载(如电机、大功率LED)。
-
-
导通电阻更低:
- 强推挽的MOS管导通电阻(Rds(on))更小,输出电平更稳定(压降更小),尤其在驱动低阻负载时不易出现电平跌落。
-
功耗与散热:
- 强推挽因驱动电流大,静态功耗可能更高,且大电流下需注意散热设计。
晶体管导通电阻(Rds(on))GPIO的驱动电流能力主要由内部MOS管的导通电阻决定。导通电阻越小,驱动能力越强(如STM32推挽模式下可达±25mA)。
GPIO的电压受到导通电阻影响。
GPIO(通用输入输出口)的输出模式最大电压主要由其供电电压(VDD)决定:
-
标准情况:STM32系列GPIO在3.3V供电时,输出高电平的典型值为3.3V,低电平为0V。
-
负载影响:无负载时可达理论最大值,但驱动较大电流时,因内部电阻可能导致电压略微下降(如降至3.0V左右)。
-
5V容忍引脚:部分引脚标有“FT”(Five Tolerate),可输入5V电平,但输出仍限制在3.3V(供电电压决定)。
-
开漏模式: 若外接5V上拉电阻,开漏输出可间接实现5V高电平(内部MOS管断开时由外部电源拉高)
该模式下具有驱动能力,可以通过单片机内部电压驱动外设。
应用场景:高速切换和高负载能力的场合,如驱动LED指示灯、继电器。
-
轻负载(如驱动LED+限流电阻):电流小,电压稳定。
-
重负载(如直接驱动电机):电流超限导致电压显著跌落,甚至触发过流保护。
(1)推出去:上端的MOS管打开,下端的MOS管关闭,GPIO输出高电平,电流走向如图
输出的电压是有限的,一般都是VDD,可能是3.3V或者是5V。
在开发过程中是直接驱动控制LED的三极管。
(2)挽回来:上端的MOS管关闭,下端的MOS管打开,GPIO输出低电平,给外部的MOS管栅极放电
这个地方要牢记脑海中,这是基本内容。
2.2.2 开漏输出
只有N-MOS工作,P-MOS一直处于断开状态。通过控制N-MOS的开合来控制电路。
该模式下无驱动能力,需要外部电压驱动外设。
应用场景:需要外部上拉电阻定义高电平的场合,如I2C通信。
如果下面的N-MOS管导通,那么该GPIO输出的就是低电平。但是有一个问题N-MOS管导通的电压谁来提供? 只能说是视情况而定。
如下图所示,如果使用GPIO去做外部芯片的使能脚(GPIO的上拉电平是5V),假设外部芯片的使能脚的电压只能承受3.3V以内。使用推挽模式进行控制,那么Q1打开,Q2关闭,外部使能脚要承受5V电压,就不可行。因此只能使用开漏输出。
如果使用开漏模式去输出,外部接个3.3V的上拉电阻,就可以实现,这是因为如果不接上拉电阻可能导致电流过大烧毁器件。
-
当Q2打开时,EN被拉到低电平。这是因为输出引脚是直接和地相连接的,那么直接就是0V。
-
当Q2关闭时,Q2的漏极是浮空的状态,即高阻态(无限大的电阻),则EN被拉到3.3V
现代芯片(尤其是CMOS工艺)的输入端本质上是MOSFET的栅极。栅极与沟道之间通过二氧化硅(SiO₂)绝缘层隔离,形成天然的高阻态。直流条件下,栅极电流仅为极微弱的漏电流(皮安级至纳安级),等效阻抗可达 10⁹~10¹² Ω(1GΩ~1TΩ)。
MOSFET是电压控制器件,其导通仅需栅极电压变化,几乎不消耗电流。这与电流控制器件(如BJT)形成鲜明对比,后者需持续基极电流。
电压是MOSFET导通的唯一钥匙,其核心机制依赖于栅极绝缘层的电场效应。导通过程本质是栅极电压在绝缘层中建立电场,进而调制沟道载流子分布。
开漏模式的本质:
开漏输出只能主动拉低(Q2导通时),无法主动推高。高电平依赖外部上拉(R1)。
开漏输出模式(Open-Drain)的GPIO引脚未连接外部上拉电阻时,EN引脚的电压会变得不确定(浮空状态)。
-
EN引脚内部是MOSFET栅极,通过绝缘层(SiO₂)与芯片内部隔离 → 栅极电荷无法通过电流泄放。
-
若此前操作残留电荷(如Q2导通时积累的电子),或环境电磁干扰耦合电荷,将长期滞留于栅极电容上。
高阻态(High-Z)是器件的工作状态,而浮空(Floating)是高阻态下电压不确定的实际表现。
-
高阻态:描述的是输出端电气特性(断开连接,阻抗极高)。
-
浮空状态:描述的是该特性下实际电平结果(电压随机,系统不可控)。
特性 | 高阻态 | 浮空状态 |
---|---|---|
本质 | 器件主动断开输出(阻抗 >1MΩ) | 高阻态引发的电压不确定性 |
图中对应位置 | Q2关闭时的“输出”端 | R1缺失时的EN引脚 |
电压表现 | 依赖外部电路 | 0.3V~2.8V随机抖动 |
解决方式 | 外接上拉/下拉电阻 | 必须通过电阻锚定电位 |
特性 | 浮空 (Floating) | 高阻态 (High-Z) |
---|---|---|
定义 | 物理引脚未连接任何电路(悬空) | 芯片内部三态门输出断开(逻辑上等效开路) |
产生原因 | 外部电路未连接,引脚裸露。 | 内部上拉/下拉MOS管均关闭,输出电阻极大(>100MΩ) |
电平状态 | 不确定,易受电磁干扰影响 | 不确定,由外部电路决定(如总线电平) |
设计意图 | 非主动设计,通常为硬件设计缺陷。 | 主动配置,用于总线仲裁、模拟输入等场景 |
被控芯片输入端阻抗极高(典型值1MΩ~10GΩ):
-
EN引脚内部是CMOS门电路或MOSFET栅极,输入电流几乎为0(理论漏电流<1μA)。
-
计算示例:若R1=10kΩ,输入电流=1μA,压降= 1μA × 10kΩ = 0.01V。
-
结果:EN电压 ≈ 3.3V - 0.01V = 2.99V(仍被识别为高电平)。
所有高阻态输出引脚(如开漏模式)必须通过电阻连接至确定电位!
开漏模式可支持几个GPIO同时控制一个输入:
使用推挽输出,会烧毁
使用开漏输出
开漏模式扩展高电平的原理
-
开漏输出的特性:
开漏模式下,GPIO只能主动输出低电平(内部MOSFET导通拉低),而高电平需依赖外部上拉电阻连接到更高电压的电源(如12V)。当内部MOSFET关闭时,输出电平由外部电源决定。
-
电平转换示例:
- 若STM32的GPIO(3.3V逻辑)需控制12V设备,可将开漏引脚外接上拉电阻至12V电源。
- 输出低电平时,内部MOSFET导通,引脚接地(0V);输出高电平时,MOSFET关闭,引脚被上拉至12V。
-
上拉电阻选择:
- 阻值需平衡速度和功耗。例如,12V系统常用4.7kΩ~10kΩ电阻,确保电流在安全范围内(如1-2mA)。
- 公式:R=ILEDVext−VLED(驱动LED时需计算限流电阻)。
-
保护电路:
- 若驱动感性负载(如继电器),需添加续流二极管防止反向电压击穿GPIO。
- 确保外部电源电压不超过GPIO引脚的最大耐受电压(如5V容忍引脚需避免直接输入12V)
通过开漏模式+外部上拉,GPIO可安全扩展至12V甚至更高电平,但需注意电阻选型、保护电路和速度权衡。对于复杂系统,推荐使用专用电平转换器或驱动芯片以提高可靠性。
-
开漏输出的局限性:
GPIO开漏模式仅能主动拉低电平(0V),高电平需依赖外部上拉电源。但MCU的GPIO引脚耐压通常不超过5V(如STM32为3.3V),直接连接220V会损坏芯片。
-
高压隔离方案:
需通过继电器、光耦或固态继电器(SSR)实现电气隔离,例如:
-
继电器控制:
GPIO开漏输出驱动继电器线圈(5V或12V),继电器触点控制220V通断。
-
光耦隔离:
光耦(如PC817)的输入端由GPIO控制,输出端通过三极管或MOSFET驱动220V负载。
-
固态继电器(SSR):
直接通过GPIO的低压信号(3.3V/5V)控制SSR内部的光电隔离电路,进而切换220V负载。
-
-
智能家居控制:
通过STM32的GPIO开漏输出控制继电器,实现220V灯具或电器的开关。 -
工业设备:
使用光耦隔离+可控硅(如BT136)驱动220V电机,GPIO仅提供低压控制信号。
专栏介绍
嵌入式通信协议解析专栏
PID算法专栏
C语言指针专栏
单片机嵌入式软件相关知识
FreeRTOS源码理解专栏
文章源码获取方式:
如果您对本文的源码感兴趣,欢迎在评论区留下您的邮箱地址。我会在空闲时间整理相关代码,并通过邮件发送给您。由于个人时间有限,发送可能会有一定延迟,请您耐心等待。同时,建议您在评论时注明具体的需求或问题,以便我更好地为您提供针对性的帮助。
【版权声明】
本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议。这意味着您可以自由地共享(复制、分发)和改编(修改、转换)本文内容,但必须遵守以下条件:
署名:您必须注明原作者(即本文博主)的姓名,并提供指向原文的链接。
相同方式共享:如果您基于本文创作了新的内容,必须使用相同的 CC 4.0 BY-SA 协议进行发布。
感谢您的理解与支持!如果您有任何疑问或需要进一步协助,请随时在评论区留言。