STM32--GPIO八种模式的区别与应用场合

一.概述
GPIO全称为通用输入/输出端口。是stm32用于输出信号,输入信号的通道。他有以下八种模式:

输入方式

浮空输入 GPIO_Mode_IN_FLOATING
上拉GPIO_Mode_IPU
下拉GPIO_Mode_IPD
模拟输入 GPIO_Mode_AIN
输出方式

开漏输出GPIO_Mode_AF_OD
开漏复用GPIO_Mode_AF_OD
推挽式输出GPIO_Mode_Out_PP
推挽式复用功能GPIO_Mode_AF_PP
我们分别介绍一下他们各自的原理以及用途。还是首先祭出这张总的原理图:

我们先来讲一下这个结构图。我们可以看到虚线所框住的两个部分,即分别为输入输出的驱动器。输入驱动器的主要元件是TTL施密特(肖特基)触发器。这个触发器的主要作用是:设定电压阈值,超过/低于该电压,才可通过。输出驱动器的主要元件是P-MOS管和一个N-MOS管。

这里先介绍一下MOS管。对于我们后面理解电路有很大的帮助。

MOS管是由加在输入端栅极的电压(GU)来控制输出端漏极的电流(DI)的元器件。它类似于三极管,有三个极,分别为栅极/门极(G),源极(Source)和漏极(Drain)。按沟道半导体材料的不同,结型和绝缘栅型各分N沟道和P沟道两种。若按导电方式来划分,场效应管又可分红耗尽型与加强型。结型场效应管均为耗尽型,绝缘栅型场效应管既有耗尽型的,也有加强型的。如下图:

我们可以从上图看到N沟的MOS管的箭头指向绝缘板。mos管有一个重要的参数就是开启电压。对于N-mos管来说,这里我们要想让源极S和漏极D之间开始通电,则栅极和源级之间的电压必须大于开启电压。同理,对于P-mos管,栅极和源级电压必须小于开启电压。比如说,这里我们开启电压是5v,源级电压是12V,栅极电压要12+5=17V才能导通。

导通特性 :

NMOS的特性,Vgs大于一定的值就会导通,适合用于漏极D接电源,源极S接地时的情况(低端驱动),只要栅极电压达到4V或10V就可以了。需要注意的是,Vgs指的是栅极G与源极S的电压。
PMOS的特性,Vgs小于一定的值就会导通,适合用于源极接VCC时的情况(高端驱动)。但是,虽然PMOS可以很方便地用作高端驱动,但由于导通电阻大,价格贵,替换种类少等原因,在高端驱动(大功率)中,通常还是使用NMOS。
二.详解
1.浮空输入
1)原理图

这里我们可以看到,外部的电平信号通过左边编号1的I/O端口进入STM32,经过编号2的施密特触发器的整形送入编号3的“输入数据寄存器”,在“输入数据寄存器”的另一端(编号4),CPU可以随时读出I/O端口的电平状态。

2)适用场合

(1)按键识别

(2)串口RX1 

2.输入上拉模式
1)原理图

与前面的浮空输入模式相比,仅仅是在数据通道上部,接入了一个上拉电阻,并接到设备电压(VDD)。根据STM32的数据手册,这个上拉电阻阻值介于30K~50K欧姆。同样,CPU可以随时在“输入数据寄存器”的另一端,读出I/O端口的电平状态。

该输入模式中,上拉电阻的目的是为了保证在无信号输入时IO口的电平为高电平。同时,当信号输入为低电平时,IO口的电平应该也为低电平。如果没有上拉电阻,在没有外界输入的情况下输入端是悬空的,它的电平是未知的无法保证的,上拉电阻就是为了保证无信号输入时输入端的电平为高电平。同样还有下拉电阻它是为了保证无信号输入时输入端的电平为低电平。

2)适用场合

IO内部上拉电阻输入

3.输入下拉模式
1)原理图

数据通道的下部,接入了一个下拉电阻,并接到电路共地端(VSS)。根据STM32的数据手册,这个下拉电阻阻值也是介于30K~50K欧姆。

2)适用场合

 IO内部下拉电阻输入

4.模拟输入通道
1)原理图

模拟通道输入的配置则更加简单,信号从左边编号1的端口进入,从右边编号2的一端直接进入ADC模块。 
这里看到所有的上拉、下拉电阻和施密特触发器,均处于断开状态,因此“输入数据寄存器”将不能反映端口上的电平状态,也就是说,模拟输入配置下,CPU不能在“输入数据寄存器”上读到有效的数据。这也是为什么我们在选择ADC采集时,不能通过直接读取GPIO输入数据寄存器来获得模拟电压值。而是必须读取ADC数据寄存器的值。

2)适用场合

应用ADC模拟输入,或者低功耗下省电 

5.开漏输出GPIO_Mode_Out_OD
1)原理图

这是开漏输出模式的配置,当CPU在左边的编号1端通过位设置/清除寄存器或输出数据寄存器写入数据后,该数据位将通过编号2的输出控制电路控制3,将信号传送到编号4的I/O端口。

如果CPU写入的是逻辑“1”,则编号3的N-MOS管将处于关闭状态,此时I/O端口的电平将由外部的上拉电阻决定,如果CPU写入的是逻辑“0”,则编号3的N-MOS管将处于开启状态,此时I/O端口的电平被编号3的N-MOS管拉到了VSS的零电位。 
同时,根据蓝色线路,施密特触发器处于开启状态,这意味着CPU可以在“输入数据寄存器”的另一端,随时监控I/O端口的状态;通过这个特性,还实现了虚拟的I/O端口双向通信:只要CPU输出逻辑“1”,由于编号3的N-MOS管处于关闭状态,I/O端口的电平将完全由外部电路决定,因此,CPU可以在“输入数据寄存器”读到外部电路的信号,而不是它自己输出的逻辑“1”。 
开漏形式的电路有以下几个特点: 
1、 利用外部电路的驱动能力,减少IC内部的驱动。当IC内部MOSFET导通时,驱动电流是从外部的VCC流经电阻上拉后 ,从MOSFET到GND。IC内部仅需很小的栅极驱动电流。 
2、 一般来说,开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平,如果需要同时具备输出高电平的功能,则需要接上拉电阻,很好的一个优点是通过改变上拉电源的电压,便可以改变传输电平。比如加上上拉电阻就可以提供TTL/CMOS电平输出等。(上拉电阻的阻值决定了逻辑电平转换的沿的速度 。阻值越大,速度越低功耗越小,所以负载电阻的选择要兼顾功耗和速度。) 
3、开漏提供了灵活的输出方式,但是也有其弱点,就是带来上升沿的延时。因为上升沿是通过外接上拉无源电阻对负载充电,所以当电阻选择小时延时就小,但功耗大;反之延时大功耗小。所以如果对延时有要求,则建议用下降沿输出。 
4、可以将多个开漏输出的Pin,连接到一条线上。通过一只上拉电阻,在不增加任何器件的情况下,形成“与逻辑”关系。这也是I2C,SMBus等总线判断总线占用状态的原理。

2)适用场合

IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。可以读IO输入电平变化,实现C51的IO双向功能 

 因为通常需要再加一个上拉电阻,所以不怎么用。

6.开漏复用GPIO_Mode_AF_OD
1)原理图

开漏复用输出模式与开漏输出模式的配置基本相同。不同的是编号2的输出控制电路的输入与复用功能的输出端相连,此时输出数据寄存器被从输出通道断开了。

同样,CPU可以从“输入数据寄存器”读到外部电路的信号。

2)适用范围

片内外设功能(TX1,MOSI,MISO.SCK.SS)

7.推挽式输出GPIO_Mode_Out_PP
1)原理图

在开漏输出模式的基础上,推挽输出模式仅仅是在编号2的输出控制电路之后,增加了一个P-MOS管。 

补充图片:

当输出逻辑“1”时,编号3处的P-MOS管导通,而下方的N-MOS管截止,达到输出高电平的目的。 
当输出逻辑“0”时,编号3处的P-MOS管截止,而下方的N-MOS管导通,达到输出低电平的目的。
在这个模式下,CPU仍然可以从“输入数据寄存器”读到外部电路的信号。 
推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由IC的电源低定。 
推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。

2)适用场合

IO输出0-接GND, IO输出1 -接VCC,读输入值是未知的 

8.推挽式复用功能GPIO_Mode_AF_PP


最后是推挽复用输出模式,同样的道理,编号2的输出控制电路的输入,与复用功能的输出端相连,此时输出数据寄存器被从输出通道断开了。 
其它部分与前述模式一致,包括对“输入数据寄存器”的读取。

2)应用场合

片内外设功能(I2C的SCL,SDA)

三、小结
如果接按键,则配置成上拉输入;如果是上拉,无键下1,按下0,扫描要用0扫描。如果是下拉,要用1扫描。

一般输出尽量用推挽,输出电流大20mA左右,比如接上一个LED灯;输入尽量用浮空;双向比如DS18B20,和特殊要求比如IIC用开漏;AD用模拟;第2功能用复用;上下拉也可以作为输出,但是推挽的驱动能力更好。

浮空,顾名思义就是浮在空中,上面用绳子一拉就上去了,下面用绳子一拉就沉下去了。
开漏,就等于输出口接了个NPN三极管,并且只接了e,b.。而c极是开路的,你可以接一个电阻到3.3V,也可以接一个电阻到5V,这样,在输出1的时候,就可以是5V电压,也可以是3.3V电压了。但是不接电阻上拉的时候,这个输出高就不能实现了。 
推挽,就是有推有拉,任何时候IO口的电平都是确定的,不需要外接上拉或者下拉电阻。
 ———————————————— 
版权声明:本文为CSDN博主「quinn1994」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/quinn1994/article/details/82288511

你可能感兴趣的:(嵌入式C语言)