目录
简介
GPIO主要有八种模式,分别为推挽输出、开漏输出、复用推挽输出、复用开漏输出、浮空输入、上拉输入、下拉输入、模拟输入。
下面先解释一下,图1中右侧的保护二极管和左侧的寄存器。
图1 I/O口基本结构
图中右边两个保护二极管,当有静电或瞬间电压波动进入I/O引脚时,若此电压大于VDD(3.3V),则上方的保护二极管导通,将电压引入电源由电源网络吸收,而波动电压小于VSS(0V)时,下方保护二极管导通,波动电压被引入GND中。但此结构只能抵御一瞬间的电压波动,若较长时间将较高的电压接入I/O口依旧会损坏芯片。
在STM32中部分引脚能够承受5V电压。如图2数据手册中,标出FT的引脚就能够承受5V电压。
图2 数据手册
寄存器是程序与电路之间的桥梁,可以通过程序对寄存器的数据进行修改,或通过程序读取电路的状态。
一、推挽输出
在图1中我们可以看到输出驱动器中,输出控制模块控制着两个MOS管,分别为P-MOS和N-MOS,其作用可以简化为两个开关。要使I/O引脚输出高电平,则P-MOS闭合,N-MOS断开,反之,则P-MOS断开,N-MOS闭合。
二、开漏输出
在开漏输出模式下,只有N-MOS工作,P-MOS一直处于断开状态。
当输出控制输出高电平时,N-MOS闭合小灯泡点亮;当输出控制输出低电平时,N-MOS断开,小灯泡熄灭。注意,这里外接电源为5V,因此,要使用5V容忍的I/O口,否则上方保护二级管长期导通将5V引入到电源中造成损坏。
推挽输出 | 开漏输出 | |
高电平 | P-MOS激活,N-MOS断开, 输出电压3.3V | P-MOS断开,N-MOS断开, 输出电压由外部电路决定 |
低电平 | P-MOS断开,N-MOS激活 输出电压0V | P-MOS断开,N-MOS激活 输出电压0V |
优点 | 可以直接输出3.3V | 配合外部电路,更加灵活 |
缺点 | 只能输出3.3V | 低电平实际是高阻态,无法输出电流 |
三&四、复用推挽输出和复用开漏输出
从图1左侧我们可以看到,输出控制由‘写入’和‘来自片上外设’进行控制。‘写入’路线则是我们常用的HAL_GPIO_WritePin函数控制的输出寄存器,另一个‘来自片上外设’则是如串口、IIC模块控制。由于同时控制会导致输出控制模块不知听谁的,因此产生了复用推挽输出和复用开漏输出。
五、浮空输入
如图1所示, 输入驱动器的虚线框内,两个开关都断开。此时读入的数据和I/O状态一致。
浮空输入的缺陷为当没有数据输入时,读取数据不稳定。
六、上拉输入
如图1所示, 输入驱动器的虚线框内,上面VDD的开关闭合,VSS的开关断开,则为上拉输入。若I/O口为高点平则读取的为高电平,若I/O口为低电平则读取的为低电平。
上拉输入的优势为当I/O口没有信号输入时,它可以将数据稳定在高电平。
七、下拉输入
如图1所示, 输入驱动器的虚线框内,上面VDD的开关断开,VSS的开关闭合,则为下拉输入。若I/O口为高点平则读取的为高电平,若I/O口为低电平则读取的为低电平。
下拉输入的优势为当I/O口没有信号输入时,它可以将数据稳定在低电平。
八、模拟输入
模拟输入是我们需要对一个模拟信号进行读取。
在我们使用单片机的时候,我们有时候需要用AD采集到IO口上面的真实电压。这就有了我们所需要的模拟输入。为了让外部的电压真实的读取到单片机的AD模块,我们既不能闭合上拉和下拉的开关,也不能让信号经过施密特触发器。