一、GPIO基础知识
GPIO (general purpose input output)通用输入输出端口,简单来说就是软件可控制的引脚,STM32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。在一个芯片上我们通常能够看到外围有很多引脚,但是这里的引脚并不是所有的引脚都可以作为IO口使用,里边还包含供电和调试以及时钟输入等引脚。
二、GPIO的电平标准
在STM32的数据手册中我们可以查到,STM32单片机的IO口电平兼容CMOS电平和TTL电平,逻辑电平0所代表得电压范围在0.8v以下,大于2v的话就代表逻辑1。
这里提到了两个电平标准一个是TTL电平,一个是CMOS电平。下面咱们简单说一下两者的区别:
1.CMOS是场效应管构成,TTL为双极晶体管构成
2.CMOS的逻辑电平范围比较大(3~15V),TTL只能在5V下工作
3.CMOS的高低电平之间相差比较大、抗干扰性强,TTL则相差小,抗干扰能力差
4.CMOS功耗很小,TTL功耗较大(1~5mA/门)
5.CMOS的工作频率较TTL略低,但是高速CMOS速度与TTL差不多相当
三、GPIO框图
1、保护二极管
在芯片内部连接引脚的地方首先有两个保护二极管,当引脚电压高于VDD 时,上方的二极管导通,防止过高电压进入芯片内部烧坏芯片。当引脚电压低于 VSS 时,下方的二极管导通防止电压过低,从芯片内部汲取电流。
2、施密特触发器
施密特触发器就像但于是一个开关,可以将输入的电压由缓慢变化的过程变为一个图片的过程,也就是说经过施密特触发器之后只有电平1或电平0,不会再有中间那个变化的过程,而且触发器还具有一定的滤波功能。
四、GPIO的工作模式
不同于51单片机,在STM32中IO口需要配置为对应的模式才能够实现输入或者输出,具体的工作模式有以下几种,接下来我们会对每一种模式进行详细分析。
1、浮空输入模式
当IO口配置为浮空输入模式的时候,两个开关都处于打开状态,输入信号直接经过施密特触发器将数据传递给输入数据寄存器或者外设,此时,IO口的电平完全由外部输入决定,所以一般用做按键输入。
2、上拉输入模式
当配置为上拉输入模式时,单片机内部的上拉电阻起作用,此时由于上拉电阻的存在,IO口得电平默认为高电平。上拉电阻是用来解决总线驱动能力不足时提供电流的。一般说法是拉电流、或者说是提高高电平的驱动能力。
3、下拉输入模式
当配置为下拉输入模式时,单片机内部的下拉电阻起作用,此时由于下拉电阻的存在,IO口得电平默认为低电平。下拉电阻是用来吸收电流的,也就是通常所说的灌电流,能够提高低电平的驱动能力。
4、模拟输入
当配置为模拟输入模式的时候,禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强置为’0’;输入数据直接到片上外设也就是芯片内部的ADC。
5、推挽输出
当配置输出模式时,单片机内部的施密特触发器依旧被激活,仍可以通过读取输入数据寄存器的状态来判断当前IO口的电平是高还是低。当配置为推挽电路时,两个MOS管同时工作,寄存器输出1时,P-MOS管激活,IO口输出高电平,寄存器输出0时,N-MOS管激活,IO口输出低电平。
具体推挽电路分析可以看下图:
6、开漏输出
当配置为开漏输出时,P-MOS管不工作,输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将端口置于高阻状态(P-MOS从不被激活,就相当于是断路)。
具体工作方式参考下图
寄存器输出1时:
7、复用推挽输出和复用开漏输出
复用推挽输出和复用开漏输出两种工作模式其核心部分和上述两种模式无差异,只有输入数据源发生了改变,由寄存器变成了由外设输出,这里的外设可以有很多,例如串口,定时器等
9、I/O驱动能力
关乎MCU输出电流的大小,它决定了在维持Voh和Vol标准下的最大电流。当输出高电平时,电流从VDD经PMOS流向I/O引脚;低电平时,电流通过N-MOS流向VSS。驱动能力受MOS管特性影响,更大的电流可能导致电压下降,且强驱动能力的I/O通常占芯片面积大,成本高。当输出高电平1时,I/O内部VDD经过PMOS流向I/O引脚,如下图红色箭头所示:
P-MOS管的源极(S)接VDD,当MCU输出1时,P-MOS管导通,电流从源极(S)流向漏极(D)。I/O引脚外接负载大小不同,流过P-MOS管的电流、VDS(源漏电压)就会不同。输出电流越大,VDS越大,I/O电压就越小。当电压低到Voh时的这个输出电流,就表示驱动能力。
当输出低电平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都做成了高驱动能力。说了这么多,其实可以用下面这个简单的电路来解释,
MCU的IO引脚上外接一个电阻到GND,只要这个电阻不是太小,那么IO引脚的电压是基本不变的,只是微小的下降。电阻很小、电流较大时,电压会明显下降。感兴趣的可以实际测试下,不过要注意别把电流整太大烧坏IO