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就就被拉低;
但是要想输出高电平怎么办?
方法是外接上拉电阻
3. 开漏模式优势和缺点
优点:
缺点:
7. 复用推挽输出
先理解一下“复用”:
复用推挽定义
复用推挽输出 是指将其功能设置为某个特定的复用功能,并将GPIO引脚配置为推挽输出模式
复用推挽模式下引脚的io的操作由相应的功能模块来完成,普通推挽表示你需要通过gpio寄存器来操作引脚
举例
例如STM32f103c8t6的PA9不仅可以作为普通的GPIO口,还可以作为USART1的TX端(即复用为TX端口)。只需要将PA9设置为复用推挽输出模式,片上外设USART和PA9连上了,就可以通过该端口发送数据了;
1. 为什么不设置为推挽输出?
2. 当PA9被配置为复用推挽输出时,单片机内部发生了什么?
GPIO_Mode_AF_PP
)后,GPIO和USART模块在内部连接起来。USART模块的TX信号可以通过配置好的GPIO引脚输出,从而USART和GPIO引脚“打通”了。8. 复用开漏输出
开启端口的复用功能,由片上外设控制IO口电平,且输出模式为开漏输出
例如配置硬件I2C时,SCL和SDA对应的引脚要配置为复用开漏输出模式,当配置为这种模式时,干了两件事
- 复用PAx为硬件I2C的SDA端口(将 片上外设—硬件I2C 的SDA与该端口打通了)
- 设置该引脚为开漏输出
相应的GPIO口要配置为复用开漏输出,也就是启用这个IO口的复用功能,不把他当成普通IO口用了。
此时由硬件I2C自己来控制IO口的高低电平,如下图
有几篇文章写的很不错:
http://t.csdnimg.cn/0aLy3
https://www.cnblogs.com/Wayne123/p/18114128
http://t.csdnimg.cn/Ofh3R
作者:nick9876