一文搞懂STM32所有GPIO输入、输出模式(推挽输出、开漏输出、上拉输入、浮空输入等)

1. 上拉输入

整个图片分为上下两部分,输入模式对应上半部分,因此只看高亮处;

上拉输入即上面的开关闭合(接电源Vdd),下面的开关断开,当IO口啥都不接时,单片机读取到的就是Vdd,即高电平;(开关一般用MOS管来实现)

因此上拉输入默认读取的就是高电平,即ReadInputDataBit = 1;;

一般用于检测按键,例如按下按键,模拟检测电路(施密特触发器)就会检测到低电平,从而向单片机MCU传递低电平信号,即ReadInputDataBit = 0;

2. 下拉输入

3. 浮空输入(很少用)

上下开关都断开。

当IO口没有外部输入的时候,单片机读取到的值处于不确定状态,即浮动,一会儿1,一会儿0,

只有输入了一个高/低电平才会确定下来。

因此容易受到外部干扰;

 4. 模拟输入

从图中可以看出,没有上下拉,也没有经过施密特触发器(用于将模拟信号转为0/1),直接把IO口电压传输给AD转换器。

因此该模式常用于外部输入电压检测,例如温度传感器、光照传感器;

5. 推挽输出

既可以输出高电平,也可以输出低电平;

所谓推挽输出的,就是上面的pmos导通,电源Vdd直接接到了IO口给外设供电,电流从Vdd流向IO口,称之为“推”;

“挽”是挽回的挽,就是下面的nmos导通,GND(Vss)直接与IO相连,电流可以从IO口流向GND,称之为“挽”;(IO接地了,因此向外设输出低电平)

因此推和挽就是电流的流向;

万金油模式,可以用于驱动LED、蜂鸣器等;

6. 开漏输出

1. 前置知识:

开漏输出的“开”指的是开路,即pmos和nmos都断开,外设相当于什么都没接,就是开路;

“漏”指的是MOS管的漏极输出;

MOS管就像一个水龙头,栅极G就类似于一个水龙头开关,控制MOS管的导通与关断;

(导通原理:对于NMOS,当给栅极高电平时,电子被吸引到栅极附近形成N沟道,因此MOS管导通)

2. 开漏模式介绍

开漏输出有两种输出状态:

  • 低电平
  • 高阻态 

在开漏输出模式下,PMOS一直处于关断状态,只需要关注NMOS管;

(1) 当NMOS导通时,IO口接地,对外输出低电平:

(2)当NMOS也关断时,IO口什么都没接,即单片机输出高阻态

此时外设相当于接了个寂寞,也可以说是开路:

这样看来好像开漏输出没什么用,只能输出低电平,不能输出高电平。

但在某些场景下开漏输出很有用,例如I2C通信协议中,作为SCL和SDA的GPIO口设置必须设置为开漏模式。

由于从设备全部连接到一根线也就是SDA上,那么只要有一个输出低电平,SDA就就被拉低;

但是要想输出高电平怎么办?

方法是外接上拉电阻

  • 当外接上拉电阻时,默认情况下就输出高电平,而且这个Vcc由我们自己决定,根据外设需要来确定Vcc;
  • NMOS导通时输出低电平;

3. 开漏模式优势和缺点

优点:

  • 线与功能,在通信总线中,有一个设备是低电平,总线就被拉低;
  • 上拉的电源由我们确定,可以驱动需要大电压的外设;

缺点:

  • 高低电平切换速度比推挽输出慢(上拉电阻的阻值和引脚上的负载电容会影响引脚从低电平到高电平的切换速度)

7. 复用推挽输出

先理解一下“复用”:

  • 在嵌入式系统和微控制器中,复用(Alternate Function)指的是某些GPIO口除了作为普通输入输出引脚外,还可以被配置为执行其他特定外设功能

复用推挽定义

复用推挽输出 是指将其功能设置为某个特定的复用功能,并将GPIO引脚配置为推挽输出模式

复用推挽模式下引脚的io的操作由相应的功能模块来完成,普通推挽表示你需要通过gpio寄存器来操作引脚

举例

例如STM32f103c8t6的PA9不仅可以作为普通的GPIO口,还可以作为USART1的TX端(即复用为TX端口)。只需要将PA9设置为复用推挽输出模式,片上外设USART和PA9连上了,就可以通过该端口发送数据了;

1. 为什么不设置为推挽输出?

  • 设置成普通推挽的话,GPIO还是受寄存器来控制,USART模块并没有和GPIO打通,不能通过该端口发送信号;

2. 当PA9被配置为复用推挽输出时,单片机内部发生了什么?

  • 当配置为复用模式(如 GPIO_Mode_AF_PP)后,GPIO和USART模块在内部连接起来。USART模块的TX信号可以通过配置好的GPIO引脚输出,从而USART和GPIO引脚“打通”了。

8. 复用开漏输出

开启端口的复用功能,由片上外设控制IO口电平,且输出模式为开漏输出

例如配置硬件I2C时,SCL和SDA对应的引脚要配置为复用开漏输出模式,当配置为这种模式时,干了两件事

  1. 复用PAx为硬件I2C的SDA端口(将 片上外设---硬件I2C 的SDA与该端口打通了)
  2. 设置该引脚为开漏输出

相应的GPIO口要配置为复用开漏输出,也就是启用这个IO口的复用功能,不把他当成普通IO口用了。

此时由硬件I2C自己来控制IO口的高低电平,如下图

有几篇文章写的很不错:

http://t.csdnimg.cn/0aLy3

https://www.cnblogs.com/Wayne123/p/18114128

http://t.csdnimg.cn/Ofh3R

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值