GPIO八种IO端口输入输出模式解析

参考了一些网上的文章和视频,总结如下:
1. 先看下STM32的八种IO口模式
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 复用推挽输出。
2. 模拟输入GPIO_Mode_AIN(电压值)
在这里插入图片描述
2.1 在模拟输入模式下,VDD和VSS对应的两个开关断开;
2.2 模拟输入就是AD转换,外部I/O端口输入电压(不是高低电平!只有0或1),电压范围一般为0~3.3v。
3. 浮空输入GPIO_MODE_IN_FLOATING(电平值)
在这里插入图片描述
3.1 在浮空输入模式下,VDD和VSS对应的两个开关断开;
3.2 TTL施密特触发器打开,I/O端口的电平直接传到输入数据寄存器;
3.3 最后CPU读取外部输入的电平值。
浮空输入一般用于外部按键输入,结合图上的输入部分电路,在浮空输入状态下,IO 的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的。
4. 下拉输入GPIO_Mode_IPD(电平值)
在这里插入图片描述
4.1 下拉输入跟浮空输入的区别是,VSS开关闭合;
4.2 下拉电阻的目的是为了保证在无信号输入时输入端的电平为低电平;而在信号输入为高电平时输入端的电平应该也为高电平。
5. 上拉输入GPIO_Mode_IPU(电平值)
在这里插入图片描述
5.1 上拉输入跟浮空输入的区别是,VDD开关闭合,接通一个30~50k的电阻;
5.2 上拉电阻的目的是为了保证在无信号输入时输入端的电平为高电平;而在信号输入为低电平时输入端的电平应该也为低电平。
6. 开漏输出GPIO_Mode_Out_OD
在这里插入图片描述
6.1 寄存器包括:位设置/清除寄存器GPIOx_BSRR,输出数据寄存器GPIOx_ODR;
6.2 若给输出控制电路输入1时,则N-MOS管处于关闭状态,则I/O端口的电平由外部的上拉/下拉电阻决定(此时I/O端口处于浮空状态),因为输入的1已经被N-MOS管截止了;
6.3 若给输出控制电路输入0时,则N-MOS管处于开启状态,则I/O端口的电平会被N-MOS管拉到VSS,即低电平0;
6.4 其他资料参考
6.4.1 输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行,适合于做电流型的驱动,其吸收电流的能力相对强(一般 20ma 以内)。
6.4.2 开漏形式的电路有以下几个特点:
1) 利用外部电路的驱动能力,减少IC内部的驱动。当IC内部MOSFET导通时,驱动电流是从外部的VCC流经R pull-up ,MOSFET到GND。IC内部仅需很小的栅极驱动电流;
2) 一般来说,开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平,如果需要同时具备输出高电平的功能,则需要接上拉电阻,很好的一个优点是通过改变上拉电源的电压,便可以改变传输电平。比如加上上拉电阻就可以提供 TTL/CMOS 电平输出等。(上拉电阻的阻值决定了逻辑电平转换的沿的速度。阻值越大,速度越低功耗越小,所以负载电阻的选择要兼顾功耗和速度);
3) 开漏输出提供了灵活的输出方式,但也有弱点,就是带来上升沿的延时。因为上升沿是通过外接上拉无源电阻对负载充电,所以当电阻选择小时延时就小,但功耗大;反之延时大功耗小。所以如果对延时有要求,则建议用下降沿输出;
4) 可将多个开漏输出的Pin连接到一条线上。通过一只上拉电阻,在不增加任何器件的情况下,形成“与逻辑”关系。这也是I2C,SMBus等总线判断总线占用状态的原理。
补充:什么是“线与”?
在一个结点(线)上, 连接一个上拉电阻到电源VCC或VDD和n个NPN或NMOS晶体管的集电极C或漏极D, 这些晶体管的发射极E或源极S都接到地线上, 只要有一个晶体管饱和,这个结点(线)就被拉到地线电平上. 因为这些晶体管的基极注入电流(NPN)或栅极加上高电平(NMOS),晶体管就会饱和, 所以这些基极或栅极对这个结点(线)的关系是或非 NOR 逻辑. 如果这个结点后面加一个反相器, 就是或OR逻辑。
6.4.3 简单的理解为:在所有引脚连在一起时,外接一上拉电阻,如果有一个引脚输出为逻辑0,相当于接地,与之并联的回路“相当于被一根导线短路”,所以外电路逻辑电平便为0,只有都为高电平时,与的结果才为逻辑1。
7. 推挽输出GPIO_Mode_Out_PP
在这里插入图片描述
7.1 若给输出控制电路输入1时,则N-MOS管处于关闭状态,P-MOS管处于开启状态,则I/O端口的电平会被P-MOS管拉到VDD,即高电平1;
7.2 若给输出控制电路输入0时,则N-MOS管处于开启状态,P-MOS管处于关闭状态,则I/O端口的电平会被N-MOS管拉到VSS,即低电平0;
7.3 关于推挽输出和开漏输出,最后用一幅最简单的图形来概括(参考资料):
在这里插入图片描述
图中左边的是推挽输出模式,比较器输出高电平时下面的PNP三极管截止,而上面NPN三极管导通,输出电平VS+。当比较器输出低电平时则恰恰相反,PNP三极管导通,输出和地相连,输出低电平。右边的则可以理解为开漏输出形式,需要接上拉。
8. 复用开漏输出GPIO_Mode_AF_OD
在这里插入图片描述
8.1 与开漏输出的区别是,输出控制电路之前的来源由片上复用功能的外设决定(开漏输出是通过CPU写入寄存器值来决定的)。
9. 复用推挽输出GPIO_Mode_AF_PP
在这里插入图片描述
9.1 与复用输出的区别是,输出控制电路之前的来源由片上复用功能的外设决定。
10. 补充参考资料
10.1 在STM32中选用IO模式:
1) 浮空输入_IN_FLOATING ——浮空输入,可以做KEY识别,RX1;
2) 带上拉输入_IPU——IO 内部上拉电阻输入;
3) 带下拉输入_IPD——IO 内部下拉电阻输入;
4) 模拟输入_AIN ——应用ADC模拟输入,或者低功耗下省电;
5) 开漏输出_OUT_OD ——IO输出0接GND,IO输出1,悬空,需外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。可以读IO输入电平变化,实现C51的IO双向功能;
6) 推挽输出_OUT_PP ——IO 输出 0接 GND,IO输出1接VCC,读输入值是未知的;
7) 复用功能的推挽输出_AF_PP ——片内外设功能(I2C 的 SCL,SDA);
8) 复用功能的开漏输出_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS)。
10.2 通常有 5 种方式使用某个引脚功能,配置方式如下:
1) 作为普通GPIO输入:根据需要配置引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时不要使能该引脚对应的所有复用功能模块;
2) 作为普通 GPIO 输出:根据需要配置该引脚为推挽输出或开漏输出,同时不要使能该引脚对应的所有复用功能模块;
3) 作为普通模拟输入:配置该引脚为模拟输入模式,同时不要使能该引脚对应的所有复用功能模块;
4) 作为内置外设的输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时使能该引脚对应的某个复用功能模块;
5) 作为内置外设的输出:根据需要配置该引脚为复用推挽输出或复用开漏输出,同时使能该引脚对应的所有复用功能模块。注意如果有多个复用功能模块对应同一个引脚,只能使能其中之一,其它模块保持非使能状态。
10.3 stm32 复位后,IO端口处于输入浮空状态;JTAG 引脚复位以后,处于上拉或者下拉状态;
10.4 所有 IO 端口都具有外部中断能力,端口必须配置成输入模式,才能使用外部中断功能;
10.5 IO 端口复用功能配置:
10.5.1 对于复用功能输入,端口可以配置成任意输入模式或者复用功能输出模式;
10.5.2 对于复用功能输出,端口必须配置成复用功能输出;
10.5.3 对于双向复用功能,端口必须配置成复用功能输出。

猜你喜欢

转载自blog.csdn.net/Leisure_ksj/article/details/106195342