前言
(1)GPIO_Mode_AIN 模拟输入
(2)GPIO_Mode_IN_FLOATING 浮空输入
(3)GPIO_Mode_IPD 下拉输入
(4)GPIO_Mode_IPU 上拉输入
(5)GPIO_Mode_Out_OD 开漏输出
(6)GPIO_Mode_Out_PP 推挽输出
(7)GPIO_Mode_AF_OD 复用开漏输出
(8)GPIO_Mode_AF_PP 复用推挽输出
目录
通用输入模式
在通用输入模式下,输出驱动电路被禁止,输出通道对I/O引脚的状态无影响。在输入通道上,施密特触发器被打开,从引脚输入的信号经过施密特触发器整形后,被送入输入寄存器(IDR)I/O引脚的状态在每个APB2时钟周期被采样,采样数据送入输入寄存器。
通过配置输入通道上的上拉及下拉开关,可以设置GPIO的工作浮空、上拉及下拉模式。如图1所示为GPIO结构图。
图1 GPIO结构图
浮空输入
浮空输入需要同时断开上拉电阻开关和下拉电阻的开关。此时,在没有接输入信号的时候,I/O口的电平会处于一个不确定的值,电平会处于跳变的状态,一会高,一会低。只有当输入一个高/低电平时,I/O口的状态才会被确定下来。
上拉输入
当我们闭合上拉电阻开关,断开下拉电阻的开关时,也就是上拉通路导通。此时,如果I/O不接外设,上拉电阻相当于不存在,此时I/O口的电位就被钳制在VDD,于是I/O口呈现高电平。
下拉输入
同理,当我们断开上拉电阻开关,闭合下拉电阻的开关时,也就是下拉通路导通。此时,如果I/O不接外设,下拉电阻相当于不存在,此时I/O口的电位就被钳制在VSS,于是I/O口呈现低电平。
由于上拉及下拉电阻的阻值非常大,上拉及下拉电流较小,为弱上拉或弱下拉。因此在通用上拉或通用下拉输入模式下,I/O引脚开路时状态通过上拉或下拉固定下来,避免了浮空高阻状态下引脚引入的干扰。
通用输出模式
在通用输出模式下,来自内部总线的数据可以被直接写入输出数据寄存器(ODR),或者通过位置位/复位寄存器(BSRR)或复位寄存器(BRR)设置输出数据寄存器(ODR)的状态,该状态通过输出驱动电路输出到I/O引脚上。输出驱动电路可以被设置为推挽输出状态或开漏输出状态。
推挽输出
推挽输出就是利用两个不同的MOS管来实现的。在推挽输出状态下,当给栅极G一个高电平信号时,NMOS导通,PMOS截至,I/O引脚下拉为低电平,引脚电流为灌电流;当给栅极G一个低电平信号时,NMOS截至,PMOS导通,I/O引脚被强推为高低平,引脚电流为拉电流。因此,在通用推挽输出模式下,I/O引脚状态是由内部的推挽电路直接支配的。
推挽输出的优势是驱动力比较强。图2所示为推挽电路图。
图2 推挽电路
开漏输出
在开漏输出模式下,输出驱动电路(output dirver)的双MOS结构中,PMOS始终截至。当给栅极G一个高电平信号时,NMOS导通,I/O引脚输出低电平,承担灌电流;当给栅极G一个低电平信号时,NMOS截至,I/O引脚不受内部驱动电路的支配,处于高阻状态。如图3所示,这种电路的缺点是不可以输出高电平。
图3 开漏电路
图4所示为加上拉电阻的开漏电路。当给栅极G一个低电平信号时,NMOS截至,I/O引脚的状态由上拉电阻确定。
图4 加上拉电阻的开漏电路
这里需要注意的是:在开漏输出时I/O引脚真正的状态可能还取决于I/O引脚的外部连接状态。在一般情况下,通用输出采用推挽输出。但在IIC总线上,输出必须用开漏,原因是开漏输出可以实现“线与”的功能。这种输出模式的特点是在总线上可以挂载多个设备。
复用功能模式
在复用功能模式下,GPIO作为片内外设与外部交换信息的通道。有些片内外设需要输出数据,有些需要输入数据,有些则需要双向传输数据,因此,此时的GPIO应满足这些功能。
复用输出模式
在该模式下,输出驱动电路(output dirver)的信号源来自片内外设的输出,相应口的输出数据寄存器被断开。输出驱动电路可以设置为推挽输出状态或开漏输出状态,既复用推挽输出和复用开漏输出。
在输出模式下,输入通道上的施密特触发器处于导通状态,通道上的上拉电阻和下拉电阻断开,I/O引脚的状态在每个APB2时钟周期被采样,采样数据被送入输入数据寄存器(IDR),这样一来,输出的状态能够通过输入通道读取。
模拟输入模式
模拟量输入是一种特殊的复用功能模式。在这种模式下,需要把外部的模拟信号输入到内部的模数模块,输入时应避免其他信号对模拟信号的干扰。如图5所示为模拟输入模式下GPIO的结构图。
图5 模拟量输入模式下的GPIO结构图
在模拟输入模式下,数据输出通道被禁止,输入通道的上拉电阻和下拉电阻备被断开,施密特触发器关闭,I/O引脚上的模拟信号直接送到片上的模拟外设(通常就是ADC)。