GPIO的8种工作模式

 

1、推挽输出模式

#define GPIO_MODE_OUTPUT_PP 0x00000001U    / *!<输出推拉模式* /

推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止。

这种结构既可以输出高电平,也可以输出低电平,可以用于连接数字器件。

推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,

所以导通损耗小,效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。

2、开漏输出模式

#define GPIO_MODE_OUTPUT_OD 0x00000011U  / *!<输出开漏模式* /

如果外部不接上拉电阻时,只能输出低电平,所以要想输出高电平必须要外接上拉电阻。

i、一般来说,开漏是用来连接不同电平的器件,匹配电平用的,因为如果外部不接上拉电阻时,只能输出低电平,所以要想输出高电平必须要外接上拉电阻。

很好的一个优点是通过改变上拉电源的电压,便可以改变传输电平,用于不同电压的系统之间的通信。比如加上上拉电阻就可以提供TTL/CMOS电平输出等。

(上拉电阻的阻值决定了逻辑电平转换的速度。阻值越大,速度越低功耗越小,所以负载电阻的选择要兼顾功耗和速度。)

ii、利用外部电路的驱动能力,减小内部电流,当IC内部MOSFET导通时,驱动电流是从外部的VCC流经上拉电阻、MOSFET到GND。内部只需要很小的栅极驱动电流。

iii、开漏输出提供了灵活的输出方式,但是也有其弱点,就是带来上升沿的延时,通信的速度也受到上拉电阻阻值的影响。因为上升沿是通过外接上拉无源电阻

对负载充电,所以当电阻选择小时延时就小,通信速度可以很快,但功耗大;反之延时大通信速度变慢功耗小。所以如果对延时有要求,则建议用下降沿输出。

iv、可以将多个开漏输出连接到一条线上。通过一只上拉电阻,在不增加任何器件的情况下,形成“与逻辑”关系,即“线与”。

可以简单的理解为:在所有引脚连在一起时,外接一上拉电阻,如果有一个引脚输出为逻辑0,相当于接地,

与之并联的回路“相当于被一根导线短路”,所以外电路逻辑电平便为0,只有都为高电平时,与的结果才为逻辑1。

关于推挽输出和开漏输出,最后用一幅最简单的图形来概括:

该图中左边的便是推挽输出模式,其中比较器输出高电平时下面的PNP三极管截止,而上面NPN三极管导通,输出电平VS+;

当比较器输出低电平时则恰恰相反,PNP三极管导通,输出和地相连,为低电平。推挽输出可以提高电路的负载能力,提高开关速度。

右边的则可以理解为开漏输出形式,需要接上拉。

开漏输出:只可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极。适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内);

推挽输出:可以输出强高、低电平,连接数字器件。

3、复用推挽输出、复用开漏输出

#define GPIO_MODE_AF_PP 0x00000002U   / *!<备用功能推拉模式* /

#define GPIO_MODE_AF_OD 0x00000012U   / *!<备用功能开漏模式 * /

这两种模式,可以理解为把GPIO配置为第二功能使用的时候的配置,并非作为通用IO口使用。

比如使用外设I2C时,需要把GPIO配置为复用开漏输出,用于数据通信功能。

再比如串口通信的TX,以及SPI外设的GPIO使用就要把引脚设置为复用推挽输出。

4、浮空输入模式

#define GPIO_MODE_INPUT 0x00000000U    / *!<输入浮动模式* /

浮空输入模式下,I/O端口的电平信号直接进入输入数据寄存器。也就是说,I/O的电平状态是不确定的,完全由外部输入决定;

如果在该引脚悬空(在无信号输入)的情况下,读取该端口的电平是不确定的。浮空输入一般多用于外部按键输入。

5、模拟输入模式

#define GPIO_MODE_ANALOG 0x00000003U   / *!<模拟输入模式* /

I/O端口的模拟信号(电压信号,而非电平信号)直接模拟输入到片上外设模块,比如ADC模拟输入等。不像其他输入模式只有0和1,模拟输入模式可以读取到很细微变化的值。

6、带上拉,下拉输入模式

#define GPIO_MODE_IT_RISING 0x10110000U     / *!<具有上升沿触发检测的外部中断模式* /

#define GPIO_MODE_IT_FALLING 0x10210000U   / *!<具有下降沿触发检测的外部中断模式* /

#define GPIO_MODE_IT_RISING_FALLING 0x10310000U   / *!<具有上升沿/下降沿触发检测的外部中断模式* /

关于上下拉的电阻的介绍是电阻阻值都在30-50K之间。

上拉就是使IO口接上拉电阻到VCC了;下拉就是使IO口接下拉电阻到GND了;浮空就是即不接上拉,也不接下拉,这样的话IO默认输入电平不确定。

因为浮空模式时,在GPIO外部连接的电路未工作时,STM32读取的GPIO状态是不确定的,所以可以采用带上拉或者下拉输入的模式先给MCU一个确定的状态,

当外部电路电平状态发生变化时,易于MCU的判断。这样可以增强MCU的抗干扰能力。

上拉输入模式下,I/O端口的电平信号直接进入输入数据寄存器。但是在I/O端口悬空(在无信号输入)的情况下,输入端的电平可以保持在高电平

并且在I/O端口输入为低电平的时候,输入端的电平也还是低电平。

下拉输入模式下,I/O端口的电平信号直接进入输入数据寄存器。但是在I/O端口悬空(在无信号输入)的情况下,输入端的电平可以保持在低电平

并且在I/O端口输入为高电平的时候,输入端的电平也还是高电平。

 

 

在STM32中选用怎样选择I/O模式?

1--浮空输入_IN_FLOATING ——浮空输入,可以做KEY识别,RX;一般实际运用时,引脚不建议悬空,易受干扰。

2--带上拉输入_IPU——IO内部上拉电阻输入。

3--带下拉输入_IPD—— IO内部下拉电阻输入。

4--模拟输入_AIN ——应用ADC模拟输入,或者低功耗下省电。

5--推挽输出_OUT_PP ——IO输出0接GND, IO输出1 接VCC,读输入值是未知的。

6--开漏输出_OUT_OD ——IO输出0接GND,IO输出1悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,

这样IO口也就可以由外部电路改变为低电平或不变。可以读IO输入电平变化,实现IO双向功能,适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内)。 

7--复用推挽输出_AF_PP ——片内外设功能(TX1、SPI)

8--复用开漏输出_AF_OD——片内外设功能(I2C)

posted @   listxue  阅读(6620)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示