基本框图:
主要是针对STM32的GPIO来讲的,当然,各家芯片对于IO的设计大差不差,很多知识点都是通用的。将整个GPIO章节拆成以下几个部分来讲:GPIO工作模式(输入、输出、模拟),保护二极管,施密特触发器,复用功能,GPIO输出速度,干货满满,可以认真阅读下~
GPIO工作模式:
输入
上拉输入
上拉输入时,IO内部的上拉电阻开启,此时,IO的输入阻抗就是上拉电阻的阻值,内部上拉电阻阻值大概在40k左右,在IO外部无驱动的情况下,IO的输入状态由于上拉电阻的存在,会一直默认为高,如果想要驱动为低,外面所接的负载不能太大,如图所示:
可以看到,测量的IO的电平状态其实就是测量的P点电压,如果此时Key是断开状态,那么P点电压为VDD。
如果Key闭合,则P点电压由R和Rup决定,分压公式如下:Vp=VDD*R/(R+Rup)
一般来说,我们认为的低电平应该不高于0.1VDD,所以内部上拉电阻应该在负载的十倍以上。
下拉输入
下拉输入时,内部下拉电阻开启,在IO外部无驱动情况下,默认为低电平,STM32的IO下拉电阻典型值在40K左右。
如果key断开,P点电压为VSS,如果key闭合,P点电压由R和Rdown决定:Vp=VDD*Rdown/(R+Rdown)
芯片对于高电平的判定,一般来说最好在0.9VDD以上,所以R尽量要小,但也应该要考虑到IO本身能接收的灌电流能力,防止IO被损坏。
浮空输入
浮空输入,即不接上拉也不接下拉,无外部驱动时IO处于浮空状态,此时,数据输入寄存器读到的值可能为高电平,也可能为低电平。
应用电路中,不被使用的IO配置为浮空输入时,可能由于噪声和累积电荷,也可能产生电流消耗,可以尝试配置成模拟输入。
输出
开漏输出
开漏输出是直接将MOS管的漏极作为输出的电路,开漏分为MMOS开漏和PMOS开漏。NMOS开漏:
MOS管不导通的情况下漏极输出高阻态,导通时漏极输出低电平,要输出高电平需要在漏极输出端加上拉电阻。
PMOS开漏:
PMOS管不导通的情况下漏极输出高阻态,导通时漏极输出高电平,要输出低电平需要在漏极输出端加下拉电阻。
一般来说,NMOS开漏使用比较多,芯片用的就是NMOS开漏,此时,上管的PMOS处于截止状态,开漏输出具有线与特性,即只要总线上有一个低电平输出,整条总线的状态就为低电平,正是由于这种特性,开漏输出用在很多总线协议中,例如I2C,ISO7816等。
推挽输出
推挽输出既可以输出高电平,也可以输出低电平,当上管PMOS导通,下管NMOS截止,IO输出高电平,当上管PMOS截止,下管NMOS导通,IO输出低电平。
模拟功能
模拟功能包含模拟输入和模拟输出。配置为模拟功能时:
输出缓冲器被禁止
施密特触发器输入停用,输出强制处理为0(对输入寄存器读访问值为0)
内部上拉和下拉被关闭
IO引脚每个模拟输入功耗变为零(低功耗产品不用的IO可以考虑配置此选项)
保护二极管
当IO口输入异常电压时,保护二极管保护IO口不受损坏:
当引脚电压高于VDD+0.7V(假定0.7V是该二极管的导通压降)时,上方的二极管导通,此时IO引脚电压被钳位到VDD+0.7V,当引脚电压低于Vss-0.7V时,下方保护二极管导通,此时IO引脚电压被钳位到Vss-0.7V。
PS:不了解的小伙伴可以去b站搜下钳位保护电路原理。
施密特触发器
施密特触发器是和输入绑定的,配置GPIO为输入模式的时候,可以选择开启施密特触发器或者关闭。
施密特触发器在这个电路中的作用主要是利用了它的滞回特性,通俗易懂的说,开启施密特触发器以后,当芯片引脚接收到一个电平信号,由0V慢慢上升,当上升到1.5V(假设值)被芯片识别为高电平,此时,如果降低电压,则直到1.4V(假设值)以下才会被芯片识别为低电平,即它的上升和下降的门槛电压不同。
开启施密特的好处就是,IO的输入电压在高低电平门限附近时,不会由于信号的小波动就导致读取到的输入电平变化。
复用功能输入/输出
选择复用功能后,IO的状态不由IO的输入/输出寄存器控制,而是由对应选择的外设来控制。
GPIO输出速度
GPIO的引脚驱动速度有2MHz,10MHz,50MHz,这个指的是IO的驱动电路的响应速度,也就是GPIO输出信号的带宽。
从数据手册上来理解下GPIO的引脚驱动速度是如何定义出来的:
信号输出时,高电平/低电平的保持时间至少要大于1/6个周期时间,所以输出的最大频率的受制于上升时间和下降时间。
最大频率2MHz时,上升时间和下降时间为125ns,若为最大频率,上升时间+下降时间占一个周期的2/3:
单个周期时间为375us,那么频率则约为2.6M:
最大速度的定义为2M,上升/下降时间为125us,是符合计算结果预期的。
最大频率的选择根据我们的应用场景来选择,较低的速度可以耗电少,噪声小,较高的速度耗电多,噪声大,为了波形的完整性,最大速度和我们所需要的速度之间还需要再留下些冗余,如果输出速度和配置最大输出速度较为临界的时候(不建议),可以用示波器测量下输出波形是否失真。
以上就是个人对GPIO的一些理解,如果有错误、遗漏或不理解的地方,可以在评论区指正,看到后会重新编辑,提升文章质量,感谢您的阅读~