GPIO引脚的驱动能力及相关概念解析

如何编写显卡驱动? – 知乎

 1,GPIO简介

 (1)  GPIO(General Purpose Input Output)意为通用输入输出口,也就是我们俗称的I/O口;
(2)  可配置为8种输入输出模式,文章下半部分会详细介绍;
(3)  引脚电平:0V~3.3V,部分引脚可容忍5V,具体哪些端口可以容忍5V可以参考STM32的引脚定义;
(4)  输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序(IIC,SPI等),只要可以用高低电平来控制的地方都可以用GPIO来完成,如果是控制功率较大的设备,加入驱动电路就可以了;
(5)  输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入(光敏电阻模块,热敏电阻模块等)、ADC电压采集(如果某个模块输出的是模拟量,那GPIO还可以配置成模拟输入的模式,在配合内部的ADC外设,就能直接读取端口的模拟电压了)、模拟通信协议接收数据等

2,GPIO的基本结构

在STM32中所有GPIO都是挂载在APB2外设总线上的;每个GPIO外设总共有16个引脚,在每个GPIO模块内主要包含了寄存器与驱动器;寄存器就是一段特殊的存储器,内核可以通过APB2外设总线对寄存器进行读写,完成输出电平和读取电平的功能,寄存器的每一位对应一个引脚,其中输出寄存器写1,对应的引脚就会输出高电平,反之输出低电平;输入寄存器读取为1,端口处于高电平,反之低电平;STM32为32位的单片机,所以内部寄存器都是32位的,端口只有16位,所以这个寄存器只有低16位对应有端口;驱动器用来增加驱动能力,寄存器只负责存取数据,进行点灯这些操作的话,还是需要驱动器增大驱动能力的。

3,GPIO的模式 

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

4,GPIO结构

保护二极管:这个是对输入电压进行限幅的,上面的二极管接VDD(3.3V),下面接VSS(0V),如果输入电压比3.3V还要高,那么上方的二极管导通,输入电压产生的电流就会直接流入VDD而不会流入内部电路,可以避免过高的电压对内部电路造成伤害;如果输入电压比0V还要低,那么下方的二极管就会导通,电流会从VSS直接流出去,而不会从内部电路汲取电流;如果输入的电压在0~3.3V之间,那么两个二极管都不会导通;

上/下拉电阻:上拉电阻至VDD,下拉电阻至VSS,这个开关是可以通过程序进行配置的,上面导通,下面断开就是上拉输入模式,反之就是下拉输入模式;如果两个都断开就是浮空输入模式;上拉电阻与下拉电阻是为了给输入提供一个默认的输入电平,如果输入啥都不接,这时输入就会处于一种浮空状态,引脚的输入电平极易受外界干扰。如果接入上拉电阻,当引脚悬空时,还有上拉电阻来保证引脚的高电平,所以上拉输入也称默认为高电平的输入模式;上拉电阻与下拉电阻的阻值都是比较大的,是一种弱上拉和弱下拉,目的是尽量不影响正常的输入操作;

肖特基触发器:对输入电压进行整型;如果输入电压大于某一阈值,输出就会瞬间升为高电平,如果输入电压小于某一阈值,输出就会瞬间降为低电平;

模拟输入:连接到ADC上,因为ADC需要接收模拟量,所以接到肖特基触发器前面;

复用功能输入:连接到其他需要读取端口的外设上的,如串口的输入引脚等,这根线接收的是数字量,所以接到肖特基触发器后面;

数字部分可以由输出寄存器或片上外设控制,两种控制方式通过这个数据选择器接到输出控制部分,如果选择通过输出数据寄存器进行控制,就是普通I/O口输出,写这个数据寄存器的某一位就可以操作对应的某个端口了;位设置/清除寄存器可以单独操作输出数据寄存器的某一位,而不影响其它位,输出数据寄存器同时控制16个端口,并且这个寄存器只能整体读写;所以如果想单独控制其中某一个端口而不影响其他端口的话就需要一些特殊的操作方式;第一种:是先读出这个寄存器,然后用按位与和按位或的方式更改某一位,最后再将更改后的数据写回去;这种方法比较麻烦,效率不高,对于操作而言不太合适;第二种:是通过设置位设置和位清除寄存器,如果我们要对某一位进行置1的操作,在位设置寄存器的对应位写1即可,剩下不需要操作的位写0;如果想对某一位进行清零的操作,就在位清除寄存器的对应位写1即可;第三种:读写STM32中的位带区域,位带作用与51单片机中的位寻址作用差不多,在STM32中专门分配了一段地址区域,这段地址映射了RAM和外设寄存器所有的位,读写这段地址中的数据,就相当于读写所映射位置的某一位;

MOS管:就是一种电子开关,信号来控制开关的导通和闭合,开关负责将I/O口接到VDD或者VSS;这里可以选择推挽,开漏或关闭三种输出方式,在推挽输出模式下,P-MOS和N-MOS均有效;数据寄存器为1时,上管导通,下管断开,输出接到VDD,输出高电平;数据寄存器为0时,下管导通,上管断开,输出接到VSS,输出低电平;这种模式下,高低电平均有较强的驱动能力,所有推挽输出模式也称强推输出模式;在推挽输出模式下,STM32对I/O口有绝对控制权;开漏输出模式下,P-MOS是无效的,只有N-MOS在工作,输出寄存器为1时,下管断开,这时输出相当于断开,也就是高阻模式,输出寄存器为0时,下管导通,输出直接接到VSS,低电平输出;这种模式下,只有低电平有驱动能力,高电平是没有驱动能力的,可以做通信协议的驱动方式如IIC,在多机通信的情况下,这个模式可以避免各个设备的相互干扰;开漏输出模式还可以用于输出5V的电平信号,如在I/O口外接一个上拉电阻到5V的电源,当输出低电平时,由内部的N-MOS直接接VSS,当输出高电平时,由外部上拉电阻拉高至5V,这样就可以输出5V的电平信号,用于兼容一些5V电平的设备;关闭状态下,当引脚配置为输入模式的时候,两个MOS管都无效,也就是输出关闭,端口的电平信号由外部信号来控制。

 5,GPIO的驱动能力

经常会听到MCU某I/O的驱动能力是xxmA,那么到底什么是驱动能力呢?如果某IO的驱动能力是5mA,它就输出不了超过5mA的电流了吗?为什么IO的驱动能力有差异呢?

要回答以上问题,需要先了解MCU内部的I/O结构,


 5.1,当输出高电平1时,I/O内部VDD经过PMOS流向I/O引脚,如下图红色箭头所示

这时驱动能力是指,在输出电流小于等于最大输出电流的情况下,I/O引脚可以正常的输出逻辑1。

P-MOS管的源极(S)接VDD,当MCU输出1时,P-MOS管导通,电流从源极(S)流向漏极(D)。I/O引脚外接负载大小不同,流过P-MOS管的电流、VDS(源漏电压)就会不同。输出电流越大,VDS越大,I/O电压就越小。当电压低到Voh时的这个输出电流,就表示驱动能力。


 5.2,当输出低电平0时,I/O引脚经过N-MOS流向I/O内部VSS,如下图红色箭头所示

 

 这时驱动能力是指,在小于等于最大输入电流的情况下,I/O引脚可以正常的输出逻辑0。道理同上,流过N-MOS电流越大,N-MOS产生压降越大,I/O口电压越大。当电压达到逻辑0的最高电压Vol时,这时的电流就表示驱动能力。

以上看明白后,文章开头的3个问题也就有了答案,

1)I/O驱动能力是指在同时满足Voh(输出引脚为逻辑1时的最小电压值) 和 Vol(输出引脚为逻辑0时的最大电压值)前提下,最大可以输出和吸收的电流大小。Voh和Vol的值在芯片数据手册中可以查到。

2)如果某I/O的驱动能力是5mA,并不是表示它输出不了超过5mA的电流,只是当输出电流超过5mA之后,它的输出电压会下降,电压会小于Voh。

3)I/O驱动能力的差异来源于MOS管自身的特性,要想过电流能力大,MOS管体积就要大,芯片所需的面积就会更大,成本自然也会更高。所以通常MCU只是一部分I/O具有高驱动能力,并不是每一个I/O都做成了高驱动能力。

物联沃分享整理
物联沃-IOTWORD物联网 » GPIO引脚的驱动能力及相关概念解析

发表评论