stm32之GPIO输入输出讲解

img

1.简介

GPIO(General Purpose Input Output)通用输入输出口

可配置为8种输入输出模式引脚电平:0V~3.3V,部分引脚可容忍5V(是指输入的电压可容忍5V)

输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等

输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等

2.基本结构

img

内核通过总线APB2对寄存器的某一位进行操作,从而对对应的引脚进行操作,比如设置寄存器的某一位为1,其对应的引脚就输出高电平。但是stm32是32位的,也就是某一寄存器是有32位的,但是图中一个GPIO模块的只有衍生出16根引脚,因此寄存器只有低16位是被使用到的

而驱动器,由于寄存器具有临时存储数据的能力,也就是只能输出0、1相关的数据,而想要实现点灯等操作则是需要驱动器去进行帮忙

3.位结构

img

3.1 保护二极管

img

首先是I/O引脚处的两个保护二极管,上面那一个接着Vdd,而下面那则接Vss,起着保护内部电路的作用,比如:

  1. 当I/O引脚输入了大于该引脚所能容忍的最大电压的时候,电流就会往接了Vdd的保护二极管流出,而不会流入电路中,导致电路被破坏
  2. 当I/O引脚输入过低,也就是低于Vss(注意是相对电压),电流就会流入接着Vss的保护二极管,不流入内部电路

3.2 上拉/下拉 – 输入

img

接着是上拉电阻(Vdd)和下拉电阻(Vss),各自有一个开关,是可以通过程序去进行配置的。上面的开关闭合、下面开关不闭合就是上拉输入模式;上面的开关不闭合、下面闭合就是下拉输入模式;两个都不闭合就是浮空模式

  1. 上拉输入模式
    • 开关闭合(上拉电阻连接),下拉开关不闭合。
    • 默认状态为高电平,适用于需要在没有输入时保持高电平的情况。
  1. 下拉输入模式
    • 下拉开关闭合,上拉开关不闭合。
    • 默认状态为低电平,适用于需要在没有输入时保持低电平的情况。
  1. 浮空模式
    • 两个开关都不闭合,输入引脚悬空。
    • 在此状态下,引脚电压没有稳定的参考值,容易受到噪声或干扰,可能导致不稳定的输入信号。

上拉电阻和下拉电阻,其实就是为了给输入提供一个默认的输入电平。因为对于一个数字端口其输入不是低电平就是高电平,可是这个高电平和低电平是有参考标准的,也就是有上拉/下拉模式来决定,如果不是设置,怎么去知道这个输入电压是高电平还是低电平。

  • 上拉电阻(Pull-up Resistor):

    • 连接于输入引脚和电源(Vdd)之间。
    • 当输入引脚没有被外部信号驱动(即处于浮空状态,如下图Key松开的时候)时,上拉电阻将引脚拉到高电平状态(接近 Vdd),提供一个默认的高电平输入。
    • 如果引脚被外部设备驱动为低电平(如下图Key闭合,接地),那么该引脚的电压将会降到接近0V。如下:
    • img
  • 下拉电阻(Pull-down Resistor):

    • 连接于输入引脚和地(Vss)之间。
    • **外部引脚第一种情况:**当输入引脚浮空时(下图key开关松开),下拉电阻将引脚拉到低电平状态(接近0V),提供一个默认的低电平输入。
    • **外部引脚第二种情况:**如果引脚被外部设备驱动为高电平(如外部引脚处接电源,下图开关闭合),那么该引脚的电压将会升高到接近 Vdd。
    • img

上拉和下拉电阻的阻值通常较大(如10kΩ、20kΩ等),以避免对输入信号造成显著影响。在大多数应用中,这样的阻值足以提供稳定的电平,同时不会显著消耗电流。

为什么要有上拉/下拉呢?????

  • 防止浮空状态

    • 如果不使用上拉或下拉电阻,引脚处于浮空状态时,可能会随机接收到噪声,导致误触发或不稳定的输入。这在数字电路中是不可接受的,因为它可能导致不确定的状态或逻辑错误。
  • 提高抗干扰能力

    • 上拉和下拉电阻提供了一个默认状态,使得在没有外部信号输入时,电平保持稳定,从而减少外界干扰带来的影响。
  • 设计灵活性

    • 通过编程配置上拉或下拉模式,可以根据应用需求灵活设置引脚的默认状态,以适应不同的硬件环境。

简化后的电路图如下:

img

3.3 施密特触发器 – 输入

img

施密特触发器可作为波形整形电路,能将模拟信号波形整形为数字电路能够处理的方波波形,而且由于施密特触发器具有滞回特性,所以可用于抗干扰,其应用包括在开回路配置中用于抗扰,以及在闭回路正回授/负回授配置中用于实现多谐振荡器。

信号传输的时候肯定是有失真现象产生的,如果输入进来的电压产生了失真,那么是不太好去转换为数字信号从而去辨别是1、0的。什么是失真???以数字信号为例子,看下图:

img

可以看出当信号传输的时候发生严重失真的时候,是很难去辨别的。而如果是模拟信号(电压)产生了失真,不对其进行整形,那么数字电路就很难去根据其电压高低去转化为对应的0、1数字信号。

img

如上图,原来失真的模拟信号(黑色曲线)整形为数字电路能够处理的方波波形(红色线

施密特触发器通过设置两个阈值电压来对失真的模拟信号进行整形,当输入电压高于正向阈值电压,输出为高当输入电压低于负向阈值电压,输出为低当输入在正负向阈值电压之间,输出不改变,也就是说输出由高电准位翻转为低电准位,或是由低电准位翻转为高电准位时所对应的阈值电压是不同的。只有当输入电压发生足够的变化时,输出才会变化,因此将这种元件命名为触发器。这种双阈值动作被称为迟滞现象,表明施密特触发器有记忆性。从本质上来说,施密特触发器是一种双稳态多谐振荡器。

img

3.4 至片上外设 – 输入

img

有模拟输入和和复用功能输入

模拟输入接收的是模拟量,比如接到了ADC内设上,输入的是模拟量,因此该线接在了施密特触发器前

而复用功能输入接收的则是数字量,因此接在了施密特触发器后,接收的是经过整形后的数字电路处理后的数字信号。

简化后的模拟输入电路图如下:

img

3.5 寄存器 – 输出

img

输出数据寄存器,就是普通的IO口输出,写该寄存器的某一位就能操作对于的端口了。该寄存器是对应16个端口的,如果想要使用某一位端口,就需要使用 &或| 操作去进行。

位设置/清除寄存器:可以单独操作输出数据寄存器的某一位,而不影响输出数据寄存器的其它位

  • 第一种:通过读取出输出数据寄存器的数据,然后根据需要使用的端口号来采用按位与、按位或的方式对数据进行更改,然后将数据写回输出数据寄存器,就能操作某一个端口
  • 第二种:直接去操作位设置/清除寄存器,比如想对输出数据寄存器位1处写1,那么只要在位设置/清除寄存器和输出数据寄存器位1对应的位处置1,那么内部电路就会将输出数据寄存器位1处改为1,剩下的位保持不变,这样就不需要进行按位与、或的操作了(库函数中采用的就是这种方法)

3.5 MOS管 – 输出

img

两个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全关闭,端口的电平由外部的信号来控制。

开漏/推挽输出简化后的电路图如下:

img

复用开漏/推挽输出:

img

就是输出由由片上外设控制的,可以看到输出数据寄存器在内部电路是断开的。

不要认为说输出的时候就不能输入,其实也是可以的,在输出的时候可以顺便接收读取一下片上外设输入的电平。

4.GPIO工作模式

通过上面对内部位结构的讲解,其实GPIO的工作模式可以分为以下内容:

模式名称性质特征
浮空输入数字输入可读取引脚电平,若引脚悬空,则电平不确定
上拉输入数字输入可读取引脚电平,内部连接上拉电阻,悬空时默认高电平
下拉输入数字输入可读取引脚电平,内部连接下拉电阻,悬空时默认低电平
模拟输入模拟输入GPIO无效,引脚直接接入内部ADC
开漏输出数字输出可输出引脚电平,高电平为高阻态,低电平接VSS
推挽输出数字输出可输出引脚电平,高电平接VDD,低电平接VSS
复用开漏输出数字输出由片上外设控制,高电平为高阻态,低电平接VSS
复用推挽输出数字输出由片上外设控制,高电平接VDD,低电平接VSS
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值