GPIO基本知识
GPIO是通用输入/输出端口的简称,是STM32可控制的引脚。GPIO的引脚与外部硬件设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。那STM32引脚是如何分类的?GPIO内部结构是怎样的,随海翎光电的小编一起看看吧!
一、GPIO是什么?
GPIO(英语:General-purpose input/output)
通用输入输出端口的简称。可以通过软件控制其输出和输入。stm32芯片的GPIO引脚与外部设备连接起来,GPIO既然一个引脚可以用于输入、输出或其他特殊功能,那么一定有寄存器用来选择这些功能。对于输入,一定可以通过读取某个寄存器来确定引脚电位的高低;对于输出,一定可以通过写入某个寄存器来让这个引脚输出高电位或者低电位;对于其他特殊功能,则有另外的寄存器来控制它们。
二、STM32引脚分类
三、GPIO内部结构
引脚内部加上这两个保护二级管可以防止引脚外部过高或过低的电压输入。 当引脚电压高于 VDD_FT 或 VDD 时,上方的二极管导通吸收这个高电压。 当引脚电压低于 VSS 时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。
上拉和下拉电阻上都有一个开关,通过配置上下拉电阻开关,可以控制引脚的默认状态电平。 当开启上拉时引脚默认电压为高电平, 开启下拉时,引脚默认电压为低电平,这样就可以消除引脚不定状态的影响。 将上拉和下拉的开关都关断,这种状态我们称为浮空模式,一旦配置成这个模式,引脚的电压是不确定的,如果用万用表测量此模式下管脚电压时会发现只有 1 点几伏,而且还不时改变,所以一般情况下我们都会给引脚设置成上拉或者下拉模式,使它有一个默认状态。 STM32 上下拉及浮空模式的配置是通过GPIOx_CRL 和 GPIOx_CRH 寄存器控制的。 STM32 内部的上拉其实是一个弱上拉,也就是说通过此上拉电阻输出的电流很小,如果想要输出一个大电流,那么就需要外接上拉电阻了。
GPIO 引脚经过两个保护二极管后就分成两路, 上面一路是“输入模式”,下面一路是“输出模式”。 输出模式,线路经过一个由 P-MOS 和 N-MOS管组成的单元电路,这让 GPIO 引脚具有了推挽和开漏两种输出模式。 推挽输出模式,是根据 P-MOS 和 N-MOS 管的工作方式命名的。 在该结构单元输入一个高电平时,P-MOS 管导通,N-MOS 管截止,对外输出高电平(3.3V)。 在该单元输入一个低电平时,P-MOS 管截止,N-MOS 管导通,对外输出低电平(0V)。 如果当切换输入高低电平时,两个 MOS 管将轮流导通,一个负责灌电流(电流输出到负载),一个负责拉电流(负载电流流向芯片),使其负载能力和开关速度都比普通的方式有很大的提高。下图为推挽输出模式的等效电路。
在开漏输出模式时,不论输入是高电平还是低电平,P-MOS 管总处于关闭状态。 当给这个单元电路输入低电平时,N-MOS 管导通,输出即为低电平。 当输入高电平时,N-MOS 管截止,这个时候引脚状态既不是高电平,又不是低电平,我们称之为高阻态。 如果想让引脚输出高电平,那么引脚必须外接一个上拉电阻,由上拉电阻提供高电平。开漏输出模式等效电路图如下图所示。
-
在开漏输出模式中还有一个特点,引脚具有“线与”关系。即多个开漏输出模式的引脚接在一起,只要有一个引脚为低电平,其他所有管脚都为低电平,即把所有引脚连接在一起的这条总线拉低了。
只有当所有引脚输出高阻态时这条总线的电平才由上拉电阻的 VDD 决定。如果 VDD 连接的是 3.3V,那么引脚输出的就是 3.3V,如果 VDD 连接的是 5V,那么引脚输出的就是 5V。因此如果想要让 STM32 管脚输出 5V,可以选择开漏输出模式,然后在外接上拉电阻的电源 VDD 选择 5V 即可,前提是这个 STM32 引脚是容忍 5V 的。开漏输出模式一般应用在 I2C、SMBUS 通讯等需要“线与”功能的总线电路中。还可以用在电平不匹配的场合中,就如上面说的输出 5V 一样。 推挽输出模式一般应用在输出电平为 0-3.3V 而且需要高速切换开关状态的场合。除了必须要用开漏输出模式的场合,我们一般选择推挽输出模式。要配置引脚是开漏输出还是推挽输出模式可以使用GPIOx_CRL 和 GPIOx_CRH 寄存器。
四、GPIO具有8种模式,四种输入模式,四种输出模式。
输入模式:
输出模式:
开漏输出(上拉或者下拉)GPIO_Mode_Out_OD
开漏复用功能(上拉或者下拉)GPIO_Mode_AF_OD
推挽式输出(上拉或者下拉)GPIO_Mode_Out_PP
推挽式复用功能(上拉或者下拉)GPIO_Mode_AF_PP
四种最大输出速度:
2MHZ
25MHZ
50MHZ
1000MHZ
五、GPIO8种模式含义
输入浮空:浮空就是逻辑器件与引脚即不接高电平,也不接低电平。由于逻辑器件的内部结构,当它输入引脚悬空时,相当于该引脚接了高电平。一般实际运用时,引脚不建议悬空,易受干扰。通俗讲就是浮空就是浮在空中,就相当于此端口在默认情况下什么都不接,呈高阻态,这种设置在数据传输时用的比较多。浮空最大的特点就是电压的不确定性,它可能是0V,页可能是VCC,还可能是介于两者之间的某个值(最有可能) 浮空一般用来做ADC输入用,这样可以减少上下拉电阻对结果的影响。
输入上拉模式:上拉就是把点位拉高,比如拉到Vcc。上拉就是将不确定的信号通过一个电阻嵌位在高电平。电阻同时起到限流的作用。弱强只是上拉电阻的阻值不同,没有什么严格区分。
输入下拉:就是把电压拉低,拉到GND。与上拉原理相似。
模拟输入:模拟输入是指传统方式的输入,数字输入是输入PCM数字信号,即0,1的二进制数字信号,通过数模转换,转换成模拟信号,经前级放大进入功率放大器,功率放大器还是模拟的。
开漏复用功能:可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用)。端口必须配置成复用功能输出模式(推挽或开漏)
推挽式输出:可以输出高,低电平,连接数字器件;推挽结构一般是指两个三级管分别受到互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由IC的电源低定。
推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形方法任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小,效率高。输出即可以向负载灌电流。推拉式输出级即提高电路的负载能力,又提高开关速度。
推挽式复用功能:可以理解为GPIO口被用作第二功能时的配置情况(并非作为通用IO口使用)
GPIO的主要寄存器
每个I/O端口位可以自由编程,然而I/O端口寄存器必须按32位字被访问(不允许半字或字节访问),**一些寄存器的使用功能可以通过立创商场查找相应单片机芯片的数据手册来查阅,然后进行相应的端口配置,以达到IO口初始化的效果。**也可以通过以下链接来查看GPIO相关寄存器配置详情。
GPIO相关寄存器
六、在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中的一些底层函数,这样才有更好的提升。好了,海翎光电的小编今日分享就到这里。