GPIO的简介

发布于:2025-03-06 ⋅ 阅读:(20) ⋅ 点赞:(0)

目录

一、GPIO简介

二、GPIO基本结构

三、GPIO位结构 

1、整体结构和内部各结构

2、输入部分

1.保护二极管

2.输入模式

3.浮空/上拉/下拉配置

​编辑

4.模拟输入

 5.施密特触发器

3、输出部分

1.输出部分前段

2.输出模式

3.开漏/推挽输出

4.复用开漏/推挽输出

四、硬件电路

1、基础常识

2、硬件电路


一、GPIO简介

  • GPIO(General Purpose Input Output)通用输入输出口。
  • 可配置为8种输入输出模式 引脚电平:0V~3.3V,部分引脚可容忍5V(即在这个端口输入5V 的电压,也认为是高电平,但是对输入而言,最大只能输出3.3v的,因为供电只有3.3v,可以容忍5v的需要在引脚定义中带FT(Five Tolerate))。
  • 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等。
  • 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等

二、GPIO基本结构

         左边是APB2外设总线,在STM32中,所有的GPIO都是挂载在APB2外设总线上,GPIO的名称是按照GPIOA,B,C这样来命名的,每个GPIO外设总共有16个引脚,编号是从0~15,因为stm32中只用低16位,高16位是没有用到的,GPIO模块内,主要包含寄存器和驱动器,寄存器就是特殊的存储器,内核可以通过APB2总线对寄存器进行读写,完成输出电平和读取电平的功能,寄存器的每一位对应一个引脚(例如输出寄存器写1,对应引脚就会输出高电平,写0就会输出低电平,输入同理),驱动器是用来增加信号的驱动能力,寄存器值负责存储数据,点灯之类的操作需要驱动器来负责增加驱动能力,就是下图系统结构中红色圈起来的部分:

三、GPIO位结构 

1、整体结构和内部各结构

2、输入部分

1.保护二极管

        如上图最右边的IO引脚,接了两个保护二极管,这是对输入电压进行限幅的,上面的二极管接VDD,3.3v,下面接VSS,0v。如果输入电压比3.3v高,那上方这个二极管就会导通,输入电压产生的电流就会直接流入VDD而不流入内部电路,这样可以避免过高的电压对内部电路造成伤害,如果相对于VSS而言,比0v还低,那此时下方这个二极管就会导通,电流会从VSS直接流出去,而不会从内部电路汲取电流,也可以保护内部电路;如果输入电压在0~3.3v之间,那这两个二极管均不会导通,这个时候二极管对电路没有影响,这个就是保护二极管的用途。

2.输入模式

        由上图可知,上拉电阻连接到VDD,下拉电阻接到VSS。

  • 上面导通,下面断开,就是上拉输入模式。
  • 下面导通,上面断开,就是下拉输入模式。
  • 当两个者都断开,就是浮空输入模式。

        这三个都是为了给输入和输出提供一个默认的输入电平,因为对应一个数字的端口,输入不是高电平就是低电平。如果输入引脚啥都不接,那怎么算?如果啥都不接,此时输入就会处于一种浮空输入模式,引脚电平及其容易受外界干扰而改变,为了避免引脚悬空而导致的输入数据不确定,就需要加入上拉或者下拉。

        上拉电阻:引脚悬空时,还有上拉电阻来保证引脚的高电平,默认为高电平的输入模式。
下拉电阻默认为低电平的输入模式。上下拉电阻的阻值都是比较大的,是一种弱上拉和弱下拉,目的是不影响正常的输入操作。

模式名称 性质 特征
浮空输入 数字输入 可读取引脚电平,若引脚悬空,则电平不确定
上拉输入 数字输入 可读取引脚电平,内部连接上拉电阻,悬空时默认高电平
下拉输入 数字输入 可读取引脚电平,内部连接下拉电阻,悬空时默认低电平
模拟输入 模拟输入 GPIO无效,引脚直接接入内部ADC

        输入模式对应的库函数:

#模拟输入模式
GPIO_Mode_AIN (0x0)

#浮空输入模式
GPIO_Mode_IN_FLOATING (0x04)

#内部下拉模式
GPIO_Mode_IPD (0x28)

#内部上拉模式
GPIO_Mode_IPU (0x48)

3.浮空/上拉/下拉配置

        从上图中可以看出,在输入模式下输出驱动时断开的,端口只能输入而不能输出。

4.模拟输入

        模拟输入模式的特征从上面的表中可以知道,就是GPIO无效,引脚直接接入内部ADC,模拟输入可以说是ADC模数转换器的专属配置。

        在模拟输入中,输出也是断开的,输入的施密特触发器也是关闭的无效转态,所以在使用ADC的时候,将引脚配置为模拟输入就可以了,即在模拟输入的时候,只剩下下图红色的线可以使用

 5.施密特触发器

         肖特基触发器是翻译错误,正确的是施密特触发器,作用是对输入的电压进行整形,当执行逻辑是输入电压大于某一阈值,输出会瞬间升为高电平,如果输入电压小于某一阈值,输出会瞬间降为低电平,即高于上限输出高,低于下限输出低。如下图所示,两根红线代表的是高阈值和低阈值,黄色的线是输入电压,绿色的线是经过施密特整形之后的电压。

        经过施密特整形之后的波形就可以直接写入输入数据寄存器,再用程序读取输入数据寄存器对应某一位的数据,就可以知道端口的输入电平,
        模拟输入连接到ADC上,因为ADC需要接收模拟量,所以接到施密特触发器之前
        复用功能输入:连接到其他需要读取端口的外设上,如串口的输入引脚等,这根线接收的是数字量,所以在施密特之后。

3、输出部分

1.输出部分前段

        数字部分可以由输出数据寄存器或者片,上外设控制,两种方式通过这个数据选择器接到了输出控制部分,如果选择通过输出数据寄存器进行控制,就是普通IO口输出,写这个数据寄存器的某一位就可以操作对应的某一个端口。

        位设置清除寄存器:可以用来单独操作输出数据寄存器的某一位,而不影响其他位,因为输出数据寄存器同时控制16个端口,并且这个寄存器只能整体读写。

        如果想单独控制其中某一个端口而不影响其他端口,就需要下面的一些操作:

        第一种事先读出这个寄存器,然后按位与和按位或的方式更改某一位,最后再将更改后的数据写回去,即就是|=和&=的操作,麻烦,效率低,对IO口操作不合适。
        第二种是位设置和清除寄存器,如果要对某一位进行置1的操作,在位设置寄存器的对应位写1就可以了,剩下不需要操作的位写0,这样内部有电路自动将输出数据寄存器中对应位置为1,而剩下写0的位则保持不变,这样保证只操作了其中某一位而不影响其他位,并且一步到位,如果想对某一位进行清0操作,就在位清楚寄存器的对应位写1就可以,这样内部电路就会把某一位清0了
        第三种是读取位带操作的方式,在stm32 中专门分配的有一段地址区,这段地址映射了RAM和外设寄存器所有的位,读写这段地址中的数据,就相当于读写所映射位置的某一位库函数使用的是读写位设置和位清除寄存器。

注意:库函数使用的是读写位设置和位清楚寄存器的方式。

2.输出模式

        由上图可知,上面是P-MOS,下面是N-MOS,这个MOS管就是一种电子开关,信号来控制开关的导通和关闭,开关负责将IO口接到VDD或者VSS。这里可以使用选择推挽、开漏或者关闭三种方式。

        推挽输出模式:P-MOS和N-MOS都是有效的,数据寄存器为1时,上管(P-MOS)导通,下管(N-MOS)断开,输出直接接到VDD,就是输出高电平;数据寄存器为0时,上管断开,下管导通,输出接到VSS,就是输出低电平。这个模式下高低电平都具有强大的驱动能力,所以推挽输出也可以叫强推输出模式。在推挽输出模式下,STM32具有对IO口绝对的控制权,高低电平都是由STM32决定。

        开漏输出模式:此时P-MOS是无效的,只有N-MOS是在工作的。数据寄存器为1时,下管断开,此时相当于断开,也就是高阻模式;数据寄存器为0时,下管导通,输出直接接到VSS,也就是输出低电平,这种模式下只有低电平有驱动能力,高电平是没有驱动能力的。可以作为通信协议的驱动方式,如I2C通信的引脚就是开漏输出模式,在多机通信的情况下,这个模式可以避免各个设备的相互干扰。

        另外开漏模式还可以用于输出5V的电平,比如在IO口外接一个上拉电阻到5V电源,当输出低电平的时候,由内部的N-MOS直接接VSS,当输出高电平的时,由外部的上拉电阻拉高到5V,这样就可以输出5v电平信号,如下图所示:

输出低电平时电路

       

输出高电平时电路

        剩下的一种转态就是关闭,当引脚配置为输入模式的时候,两个MOS管都是无效的,也就是输出关闭,端口的电平有外部信号控制。

        下表是输出模式的总结:

模式名称 性质 特征
开漏输出 数字输出 可输出引脚电平,高电平为高阻态,低电平接VSS
推挽输出 数字输出 可输出引脚电平,高电平接VDD,低电平接VSS
复用开漏输出 数字输出 由片上外设控制,高电平为高阻态,低电平接VSS
复用推挽输出 数字输出 由片上外设控制,高电平接VDD,低电平接VSS

        输出模式对应的库函数:

#开漏输出模式
GPIO_Mode_Out_OD (0x14)

#推挽输出模式
GPIO_Mode_Out_PP (0x10)

#复用开漏输出模式
GPIO_Mode_AF_OD (0x1C)

#复用推挽输出模式
GPIO_Mode_AF_PP (0x18)

3.开漏/推挽输出

         开漏输出和推挽输出的电路结构基本相同,都是数字输出端口,可以用于输出高低电平。

区别:

  • 开漏输出的高电平呈现高阻态,没有驱动能力。
  • 而推挽输出的高低电平都具有驱动能力。

         开漏和推挽输出都是由输出数据寄存器控制,如果P-MOS无效就是开漏输出,如果P-MOS和N-MOS都有效,就是推挽输出。

        同时由上图可知,当在输出模式下,输入模式是有效的,这是因为一个端口只能有一个输出,但是可以有多个输入。即当配置输出模式时,内部也可以输入,这是没有影响的,复用开漏和复用推挽与普通的开漏和推挽输出相,只是复用输出中,引脚电平有片上外设控制。

4.复用开漏/推挽输出

         在复用模式中,红色框1的部分是没有连接的,引脚的控制权转移到了片上外设,由片上外设来控制,如红线2。

        在输入部分,片上外设也可以读取引脚的电平,如红线3,同时普通的功能也是有效的,红线4。

注意:在GPIO的8中模式中,出了模拟输入这个模式会关闭数字的输入功能,其他7中模式中,所有输入都是有效的。


四、硬件电路

1、基础常识

        小灯泡正极与负极的区分:

方法一:通常情况下,引脚长的位正极,短的为负极。

方法二:看灯芯,小的是正极,长的是负极。

        两种蜂鸣器的区别:

有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定。

无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同频率的声音。

2、硬件电路

        方式一:低电平驱动电路

         在上图电路中,PA0输出低电平时,LED两端产生电压差,就会形成正向导通电流,LED就会亮,当PA0输出高电平时,LED两端都是3.3v,没有电压差,不会形成电流,LED就熄灭。

        方式二:高电平驱动电路

         如上图所示,正极接PA0,负极接GND,此时就是高电平点亮,低电平熄灭。

        具体选择什么方式,需要靠IO口高低电平驱动能力来判断,例如:推挽输出模式下,高低电平都有比较强的驱动能力,所以那种方式都可以实现一样的效果,但是单片机电路中,较多的是使用第一种方式,因为很多单片机或者芯片,都是使用高电平弱驱动,低电平强驱动,可以一定程度上避免高低电平出现“纠纷”。因此高电平驱动能力弱,就只能使用第一种方式了。