GPIO是general purpose input output,即通用输入输出端口,作用是负责外部器件的信息和控制外部器件工作。
GPIO有如下几个特点:1.不同型号的IO口数量不同;2,反转快速,每次翻转最快只需要两个时钟周期,以STM32F1系列为例,最快速度可达50MHz;3.每个IO口都可以做中断。
接下来介绍GPIO的电气特性:1.工作电压范围为:[2, 3.3]V ;2.识别电压范围(CMOS端口):-0.3V <= VIL <= 1.164V , 1.833V <= VIH <= 3.6V;3.输出电流单个IO口最大25mA。
下图为GPIO的结构图:
GPIO的上半部分为输入部分,下半部分为输出部分。
接下来简要介绍其工作流程
1.输入:信号从IO脚输入,经过保护电路后进入GPIO内部,然后进入上下拉电路(只是在输入状态时候设置,因此在芯片处在输出状态时不需要设置上下拉,比如我们的LED实验),然后兵分两路,上面的是模拟输入(ADC/DAC),下面再分为两路,上面是复用输入至片上外设,下面进入输入寄存器(IDR),CPU就能读取其中的信号获得信息。
2.输出:
i) 执行机构:如果需要输出高电平,就使PMOS管导通,从VDD接进高电平输出3.3V,如果需要输出低电平就使NMOS管导通将VSS(0V)导通至外部。
ii)控制机构:上面的是连接输出寄存器(ODR),可以通过位清除寄存器(BSRR)对ODR进行读写,也可以直接进行读写操作,然后进入二选一选择器,再进入输出控制器。
接下来介绍几个重要的元件:
1.保护二极管:当输入过高的电压(比如5V,PS:必须串联一个电阻,不然会烧)的时候,下面的保护二极管截止,上面的保护二极管导通,因为保护二极管的压降为0.3V,VDD为3.3V,所以实际输入的电压为3.6V,防止了过高的电压输入;如果输入一个过低的电压(比如-5V,同理要接电阻),上面的保护二极管截止,下面的保护二极管导通,因为VSS为0V,所以实际输入的电压为0.3V。
2.内部上下拉电阻:内部上下拉电阻值为30~50kOhm,当未接入的时候处于高阻态,电平由外部状态控制,是非稳定的状态。当该器件初始状态是高电平的时候,需要一个稳定的高电位来维护这个状态,于是我们选用上拉电阻(如KEY0);当该器件的初始状态是低电平的时候,需要一个稳定的低电位来维护这个状态,于是我们选用下拉电阻(如WAKE_UP_KEY)。
3.施密特触发器:为一种整形电路,可以将非标准波整形成方波。如图,施密特触发器有一个正向阈值电压和一个负向阈值电压。当电压高于正向阈值电压,输出为高电平;当电压低于负向阈值电压的时候,输出为低电平;当电压处于正向和负向阈值电压之间的时候,输出不改变。
4.P/N-MOS管:MOS管是压控型元件,通过控制栅源电压实现导通或关闭。
G:栅极;S:源极;D:漏极
对PMOS管来说,当Vgs<0时导通,因为VDD为3.3V,所以G极必须低于3.3V,即G输出低电平时,PMOS管才导通。
对NMOS管来说,当Vgs>0时导通,因为VDD为0V,所以G极必须高于3.3V,即G输出高电平时,NMOS管才导通。
接下来详细介绍八种模式分析
GPIO_MODE_INPUT:前三种都属于
1.输入浮空(GPIO_NOPULL):输入用,完全浮空,状态不定。
上下拉电阻关闭,施密特触发器打开,模拟输入关闭,双MOS管不导通。空闲时(高阻态),IO状态不稳定,由外部环境决定。
2.输入上拉(GPIO_PULLUP):输入用,用内部上拉,默认为高电平。
使用上拉电阻,下拉电阻关闭,施密特触发器打开,模拟输入关闭,MOS管不导通。空闲时,IO呈现高电平。
3.输入下拉(GPIO_PULLDOWN):输入用,用内部下拉,默认为低电平。
使用下拉电阻,上拉电阻关闭,施密特触发器打开,模拟输入关闭,MOS管不导通。空闲时,IO呈现低电平。
PS:GPIO_NOPULL,GPIO_PULLUP,GPIO_PULLDOWN都是在GPIO_PULL中进行设置的。
4.模拟(复用)输入(GPIO_MODE_AF_INPUT):ADC/DAC
上下拉电阻关闭,施密特触发器关闭,模拟输入打开,双MOS管不导通。专门用于模拟信号输入。
5.开漏输出(GPIO_MODE_OUTPUT_OD):软件IIC的SDL,SCL等。
上下拉电阻关闭,施密特触发器打开,PMOS管关闭,在ODR对应位写0时,NMOS管导通,输出低电平,写1时不导通,不导通时为高阻态。不能输出高电平,必须有外部上拉电阻才能输出高电平。
6.推挽输出(GPIO_MODE_OUTPUT_PP):驱动能力强,25mA(MAX),通用输出。
上下拉电阻关闭,施密特触发器打开,ODR对应位写0时,NMOS管导通,输出低电平,写1则PMOS管导通,输出高电平。可输出高低电平,驱动能力强。
7.开漏复用输出(GPIO_MODE_AF_OD):片上外设(软件IIC的SDL,SCL等)
上下拉电阻关闭,施密特触发器打开,PMOS管关闭,在外设复用输出写0时,NMOS管导通,写1时不导通,不导通时为高阻态。不能输出高电平,必须有外部上拉电阻才能输出高电平。
8.推挽复用输出(GPIO_MODE_AF_PP):片上外设(SPI的SCK,MISO,MOSI等)
上下拉电阻关闭,施密特触发器打开,外设复用功能写0时,NMOS管导通,输出低电平,写1则PMOS管导通,输出高电平。可输出高低电平,驱动能力强。
至此,对GPIO的简单介绍就完成了。