STM32F10X管脚在STM32F103ZET6上共有7组IO端口,每组有16个IO端口,分别为GPIOA~GPIOG,每组分别为PA0到PA16,STM 32 f 103 ref 它们分别是GPIOA到GPIOD,不同的是这种芯片,这就是一般的F1系列芯片引脚,其中大部分不仅可以作为GPIO使用,还可以作为串行引脚(USART、勤快哆啦A梦等外围功能引脚)进行复用
GPIO的基本结构和动作方式I/O端口位的基本结构
与51相比,STM32的IO端口非常复杂,因此使用起来也非常困难。 首先是STM32的IO端口
软件可以由以下八种模式组成:
(1) GPIO_Mode_IN_FLOATING输入浮动模式
)2) GPIO_Mode_IPU输入上拉模式
(3) GPIO_Mode_IPD输入下拉模式
(4) GPIO_Mode_AIN模拟输入模式
)5)打开/关闭GPIO_Mode_Out_OD输出模式
(6) GPIO_Mode_AF_OD开放泄漏复用输出模式
(7) GPIO_Mode_Out_PP推挽输出模式
(8) GPIO_Mode_AF_PP推挽复用模式
输入浮空模式
在这种状态下,I/O端口的电平信号进入输入数据寄存器。 此时的I/O电平信号不确定,完全由外部输入决定。 如果此管脚悬浮在空中(没有信号输入),则读取该端口的级别是不确定的。 电压有不确定性。
输入上拉模式
上拉是指将不确定的信号引入一定的值。 如上图所示,来自I/O端口的信号通过上拉电阻被引入VDD。 因此,与浮动输入相比,在I/O端口悬空的状态下,可以将输入端的电平保持为高电平。
输入下拉模式
下拉与上拉相同,通过I/O端口的信号被下拉电阻拉至VSS,在I/O端口悬空的状态下,可以将输入端的电平保持在低电平。
模拟输入模式
在模拟输入模式下,I/O端口模拟信号(电压信号而不是电平信号)直接模拟输入到片上外围模块,如ADC模块。
开路漏极输出模式
输出寄存器的‘0’激活N-MOS,输出寄存器的‘1’使端口进入高阻抗状态(P-MOS不被激活)。
N-MOS管,当设置输出的值为高电平的时候,N-MOS管处于关闭状态,此时I/O端口的电平就不会由输出的高低电平决定,而是由I/O端口外部的上拉或者下拉决定;当设置输出的值为低电平的时候,N-MOS管处于开启状态,此时I/O端口的电平就是低电平。
因此,开路漏极输出只能输出强低电平,高电平必须通过外部电阻来提高。
开路漏极多路输出模式
开路漏极多路复用与开路漏极类似,只是电平信号的来源来自片上外围设备模块,而不是如图所示的CPU输出数据寄存器。
推挽输出模式
输出寄存器的‘0’激活N-MOS,输出寄存器的‘1’激活P-MOS。
P-MOS管和N-MOS管,当设置输出的值为高电平的时候,P-MOS管处于开启状态,N-MOS管处于关闭状态,此时I/O端口的电平就由P-MOS管决定:高电平;当设置输出的值为低电平的时候,P-MOS管处于关闭状态,N-MOS管处于开启状态,此时I/O端口的电平就由N-MOS管决定:低电平。
从而,推挽输出可以输出强高低电平,连接数字设备。
推挽多路输出模式
推挽复用类似于推挽,但电平信号的来源不是来自如图所示的CPU的输出数据寄存器,而是来自片上外围设备的模块。
GiO功能是漂浮在空中的总结,顾名思义是漂浮在空中。 上面用绳子拉会上升,下面用绳子拉会下沉。
进行泄漏是指输出端口上连接了NPN晶体管,且仅连接了e。 b. c极是开放的。 可以将电阻连接到3.3V,也可以将电阻连接到5V。 这样,输出1时既可以是5V的电压,也可以是3.3V的电压。 但是,不连接电阻上拉时,无法实现该输出高度。
推挽是指有推有拉,随时确定IO端口的电平,不需要上拉和下拉电阻。
推挽电路是两个参数相同的晶体管或MOSFET,以推挽方式存在于电路中,分别负责正负半周的波形放大。 电路工作时,对称的2根功率开关管一次只导通1个,因此导通损耗小,效率高。 输出既可以使电流通过负载,也可以从负载中引出电流。 推挽型输出级在提高电路负载能力的同时,提高开关速度。
开路漏极输出:的输出端相当于晶体管的集电极,需要上拉电阻才能获得高电平状态,适合电流型驱动,吸收电流的能力相对较高(通常在20ma以内)。
开路泄漏形式的电路具有以下特点。
利用外部电路的驱动能力,减少IC内部的驱动。 IC内部的MOSFET导通时,驱动电流从外部的VCC流向R pull-up,从MOSFET流向GND。 IC内部只需要非常低的栅极驱动电流。 一般来说,开路漏极用于连接不同等级的器件并匹配等级。 开路漏极引脚上不连接外部上拉电阻的话,只能输出低电平,所以需要同时具备输出高电平的功能时,需要连接上拉电阻。 具有通过改变上拉电源的电压,可以改变传输电平的优秀优点。 例如可以通过施加上拉电阻来提供
TTL/CMOS电平输出等。(上拉电阻的阻值决定了逻辑电平转换的沿的速度 。阻值越大,速度越低功耗越小,所以负载电阻的选择要兼顾功耗和速度。)OPEN-DRAIN提供了灵活的输出方式,但是也有其弱点,就是带来上升沿的延时。因为上升沿是通过外接上拉无源电阻对负载充电,所以当电阻选择小时延时就小,但功耗大;反之延时大功耗小。所以如果对延时有要求,则建议用下降沿输出。可以将多个开漏输出的Pin,连接到一条线上。通过一只上拉电阻,在不增加任何器件的情况下,形成“与逻辑”关系。这也是I2C,SMBus等总线判断总线占用状态的原理。补充:什么是“线与”?:在一个结点(线)上, 连接一个上拉电阻到电源 VCC 或 VDD 和 n 个 NPN 或 NMOS 晶体管的集电极 C 或漏极 D, 这些晶体管的发射极 E 或源极 S 都接到地线上, 只要有一个晶体管饱和, 这个结点(线)就被拉到地线电平上. 因为这些晶体管的基极注入电流(NPN)或栅极加上高电平(NMOS),晶体管就会饱和, 所以这些基极或栅极对这个结点(线)的关系是或非 NOR 逻辑. 如果这个结点后面加一个反相器, 就是或 OR 逻辑.
其实可以简单的理解为:在所有引脚连在一起时,外接一上拉电阻,如果有一个引脚输出为逻辑0,相当于接地,与之并联的回路“相当于被一根导线短路”,所以外电路逻辑电平便为0,只有都为高电平时,与的结果才为逻辑1。
由于浮空输入一般多用于外部按键输入,结合图上的输入部分电路,我理解为浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的。
上拉输入/下拉输入/模拟输入:这几个概念很好理解,从字面便能轻易读懂。
复用开漏输出、复用推挽输出:可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用)
最后总结下使用情况:
在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)
STM32设置实例:
(1)模拟I2C使用开漏输出_OUT_OD,接上拉电阻,能够正确输出0和1;读值时先GPIO_SetBits(GPIOB, GPIO_Pin_0);拉高,然后可以读IO的值;使用GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0);
(2)如果是无上拉电阻,IO默认是高电平;需要读取IO的值,可以使用带上拉输入_IPU和浮空输入_IN_FLOATING和开漏输出_OUT_OD;
STM32的每个 IO 口可以自由编程,但 IO 口寄存器必须要按 32 位字被访问。STM32 的每个 IO 端口都有 7 个寄存器来控制。他们分别是:配置模式的 2 个 32 位的端口配置寄存器 CRL 和 CRH;2 个 32 位的数据寄存器 IDR 和 ODR;1 个 32 位的置位/复位寄存器BSRR;一个 16 位的复位寄存器 BRR;1 个 32 位的锁存寄存器 LCKR。
CRL 和 CRH 控制着每个 IO 口的模式及输出速率。
参考资料:
《STM32不完全手册》-GPIO介绍
《STM32中文参考手册_V10》-第8章通用和复用功能IO(GPIO和AFIO )
https://blog.csdn.net/qq_38410730/article/details/79858906
http://www.openedv.com/posts/list/21980.htm