目录
1.简介
GPIO(General Purpose Input Output)通用输入输出口
可配置为8种输入输出模式引脚电平:0V~3.3V,部分引脚可容忍5V(是指输入的电压可容忍5V)
输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等
2.基本结构
内核通过总线APB2对寄存器的某一位进行操作,从而对对应的引脚进行操作,比如设置寄存器的某一位为1,其对应的引脚就输出高电平。但是stm32是32位的,也就是某一寄存器是有32位的,但是图中一个GPIO模块的只有衍生出16根引脚,因此寄存器只有低16位是被使用到的
而驱动器,由于寄存器具有临时存储数据的能力,也就是只能输出0、1相关的数据,而想要实现点灯等操作则是需要驱动器去进行帮忙
3.位结构
3.1 保护二极管
首先是I/O引脚处的两个保护二极管,上面那一个接着Vdd,而下面那则接Vss,起着保护内部电路的作用,比如:
- 当I/O引脚输入了大于该引脚所能容忍的最大电压的时候,电流就会往接了Vdd的保护二极管流出,而不会流入电路中,导致电路被破坏
- 当I/O引脚输入过低,也就是低于Vss(注意是相对电压),电流就会流入接着Vss的保护二极管,不流入内部电路
3.2 上拉/下拉 – 输入
接着是上拉电阻(Vdd)和下拉电阻(Vss),各自有一个开关,是可以通过程序去进行配置的。上面的开关闭合、下面开关不闭合就是上拉输入模式;上面的开关不闭合、下面闭合就是下拉输入模式;两个都不闭合就是浮空模式
- 上拉输入模式:
-
- 开关闭合(上拉电阻连接),下拉开关不闭合。
- 默认状态为高电平,适用于需要在没有输入时保持高电平的情况。
- 下拉输入模式:
-
- 下拉开关闭合,上拉开关不闭合。
- 默认状态为低电平,适用于需要在没有输入时保持低电平的情况。
- 浮空模式:
-
- 两个开关都不闭合,输入引脚悬空。
- 在此状态下,引脚电压没有稳定的参考值,容易受到噪声或干扰,可能导致不稳定的输入信号。
上拉电阻和下拉电阻,其实就是为了给输入提供一个默认的输入电平。因为对于一个数字端口其输入不是低电平就是高电平,可是这个高电平和低电平是有参考标准的,也就是有上拉/下拉模式来决定,如果不是设置,怎么去知道这个输入电压是高电平还是低电平。
-
上拉电阻(Pull-up Resistor):
-
- 连接于输入引脚和电源(Vdd)之间。
- 当输入引脚没有被外部信号驱动(即处于浮空状态,如下图Key松开的时候)时,上拉电阻将引脚拉到高电平状态(接近 Vdd),提供一个默认的高电平输入。
- 如果引脚被外部设备驱动为低电平(如下图Key闭合,接地),那么该引脚的电压将会降到接近0V。如下:
-
下拉电阻(Pull-down Resistor):
-
- 连接于输入引脚和地(Vss)之间。
- **外部引脚第一种情况:**当输入引脚浮空时(下图key开关松开),下拉电阻将引脚拉到低电平状态(接近0V),提供一个默认的低电平输入。
- **外部引脚第二种情况:**如果引脚被外部设备驱动为高电平(如外部引脚处接电源,下图开关闭合),那么该引脚的电压将会升高到接近 Vdd。
上拉和下拉电阻的阻值通常较大(如10kΩ、20kΩ等),以避免对输入信号造成显著影响。在大多数应用中,这样的阻值足以提供稳定的电平,同时不会显著消耗电流。
为什么要有上拉/下拉呢?????
-
防止浮空状态:
-
- 如果不使用上拉或下拉电阻,引脚处于浮空状态时,可能会随机接收到噪声,导致误触发或不稳定的输入。这在数字电路中是不可接受的,因为它可能导致不确定的状态或逻辑错误。
-
提高抗干扰能力:
-
- 上拉和下拉电阻提供了一个默认状态,使得在没有外部信号输入时,电平保持稳定,从而减少外界干扰带来的影响。
-
设计灵活性:
-
- 通过编程配置上拉或下拉模式,可以根据应用需求灵活设置引脚的默认状态,以适应不同的硬件环境。
简化后的电路图如下:
3.3 施密特触发器 – 输入
施密特触发器可作为波形整形电路,能将模拟信号波形整形为数字电路能够处理的方波波形,而且由于施密特触发器具有滞回特性,所以可用于抗干扰,其应用包括在开回路配置中用于抗扰,以及在闭回路正回授/负回授配置中用于实现多谐振荡器。
信号传输的时候肯定是有失真现象产生的,如果输入进来的电压产生了失真,那么是不太好去转换为数字信号从而去辨别是1、0的。什么是失真???以数字信号为例子,看下图:
可以看出当信号传输的时候发生严重失真的时候,是很难去辨别的。而如果是模拟信号(电压)产生了失真,不对其进行整形,那么数字电路就很难去根据其电压高低去转化为对应的0、1数字信号。
如上图,原来失真的模拟信号(黑色曲线)整形为数字电路能够处理的方波波形(红色线)
施密特触发器通过设置两个阈值电压来对失真的模拟信号进行整形,当输入电压高于正向阈值电压,输出为高;当输入电压低于负向阈值电压,输出为低;当输入在正负向阈值电压之间,输出不改变,也就是说输出由高电准位翻转为低电准位,或是由低电准位翻转为高电准位时所对应的阈值电压是不同的。只有当输入电压发生足够的变化时,输出才会变化,因此将这种元件命名为触发器。这种双阈值动作被称为迟滞现象,表明施密特触发器有记忆性。从本质上来说,施密特触发器是一种双稳态多谐振荡器。
3.4 至片上外设 – 输入
有模拟输入和和复用功能输入
模拟输入接收的是模拟量,比如接到了ADC内设上,输入的是模拟量,因此该线接在了施密特触发器前
而复用功能输入接收的则是数字量,因此接在了施密特触发器后,接收的是经过整形后的数字电路处理后的数字信号。
简化后的模拟输入电路图如下:
3.5 寄存器 – 输出
输出数据寄存器,就是普通的IO口输出,写该寄存器的某一位就能操作对于的端口了。该寄存器是对应16个端口的,如果想要使用某一位端口,就需要使用 &或| 操作去进行。
位设置/清除寄存器:可以单独操作输出数据寄存器的某一位,而不影响输出数据寄存器的其它位
- 第一种:通过读取出输出数据寄存器的数据,然后根据需要使用的端口号来采用按位与、按位或的方式对数据进行更改,然后将数据写回输出数据寄存器,就能操作某一个端口
- 第二种:直接去操作位设置/清除寄存器,比如想对输出数据寄存器位1处写1,那么只要在位设置/清除寄存器和输出数据寄存器位1对应的位处置1,那么内部电路就会将输出数据寄存器位1处改为1,剩下的位保持不变,这样就不需要进行按位与、或的操作了(库函数中采用的就是这种方法)
3.5 MOS管 – 输出
两个MOS管:P-MOS和N-MOS
可以把MOS管当作一种电子开关,信号来控制MOS开关的导通和关闭,而MOS开关则负责将IO口接到VDD或者VSS,从而实现输出高电平或低电平。
一共有三种输出模式:推挽、开漏以及关闭。
-
推挽模式:P-MOS和N-MOS均有效。数据寄存器输出1时,上管P-MOS导通,下管N-MOS断开,输出直接接到VDD,也就是IO引脚输出高电平。数据寄存器输出0时,反过来,输出低电平。这种模式高低电平均有较强的驱动能力,所以推挽输出模式又叫强推输出模式,stm32对IO口有绝对的控制权,高低电平有它说了算
-
开漏模式:上管P-MOS是无效的,只有下管N-MOS在工作。因此数据寄存器输出1时,由于上管断开,输出就是相当于断开,也就是高阻模式;当输出0时,输出的就是低电平。所以这种模式下只有低电平有驱动能力,高电平是没有驱动能力的。
-
- 也就是说,如果输出1,那么上管P-MOS无效,此时得依靠外部引脚接一个上拉电阻输出高电平。
- 这种模式可以作为通讯协议的驱动方式,比如I2C协议,这个在之前的文章也有讲解过,在多机通信的情况下可以避免各个设备的相互干扰。
- 同时开漏模式可以输出5V的电平信号。就是当寄存器输出1时,高阻模式,通过外部IO口接一个上拉电阻,从而将输出电压拉高至5V
- 对于这个开漏输出的MOS管,我觉得还挺像NPN三极管的,有输入0的时候才会导通,导致输入引脚接地为低电平。和开漏模式的两个MOS管情况很像,也是输出0的时候下管导通,接地,外部引脚为低电平。这一点可以看开头的文章链接中的介绍
-
关闭模式:就是输入模式的时候,MOS全关闭,端口的电平由外部的信号来控制。
开漏/推挽输出简化后的电路图如下:
复用开漏/推挽输出:
就是输出由由片上外设控制的,可以看到输出数据寄存器在内部电路是断开的。
不要认为说输出的时候就不能输入,其实也是可以的,在输出的时候可以顺便接收读取一下片上外设输入的电平。
4.GPIO工作模式
通过上面对内部位结构的讲解,其实GPIO的工作模式可以分为以下内容:
模式名称 | 性质 | 特征 |
---|---|---|
浮空输入 | 数字输入 | 可读取引脚电平,若引脚悬空,则电平不确定 |
上拉输入 | 数字输入 | 可读取引脚电平,内部连接上拉电阻,悬空时默认高电平 |
下拉输入 | 数字输入 | 可读取引脚电平,内部连接下拉电阻,悬空时默认低电平 |
模拟输入 | 模拟输入 | GPIO无效,引脚直接接入内部ADC |
开漏输出 | 数字输出 | 可输出引脚电平,高电平为高阻态,低电平接VSS |
推挽输出 | 数字输出 | 可输出引脚电平,高电平接VDD,低电平接VSS |
复用开漏输出 | 数字输出 | 由片上外设控制,高电平为高阻态,低电平接VSS |
复用推挽输出 | 数字输出 | 由片上外设控制,高电平接VDD,低电平接VSS |