GPIO的工作模式、GPIO复用

1、GPIO 的8种工作模式

GPIO 的电路是一堆电路,所以需要配置寄存器,来打开对应的开关,来实现不同的功能。

在这里插入图片描述

输入部分:

输入的信号,不会反向的回流到输出电路,因为 N-MOS、P-MOS 不会被反向导通。(输入电路不会影响到输出电路)

输入电路内部有两个电阻:上拉电阻、下拉电阻。

  • 上下拉电阻对应两个开关:这个开关也是通过 GPIO 的配置寄存器,来进行配置打开或者关闭。
  • VDD 开关闭合:上拉输入。(即没有信号输入的时候,触发器里面存储 1 )
  • VSS 开关闭合:下拉输入。(即没有信号输入的时候,触发器里面存储 1)
  • VDD、VSS 都不导通:浮空输入。

模拟输入:不经过触发器,直接接到片上外设 ADC ,从而进行模数转换。

触发器:存储高低电平的 bit 位。(代表数字输入)

在这里插入图片描述

输出部分:

N-MOS 管:高电平 导通

P-MOS 管: 低电平 导通

当输出寄存器为高电平的时候,经过一个非门,传到输出控制的时候,就变成了一个低电平,从而将 P-MOS 导通。

电位的提供不是靠数据寄存器,而是通过打开对应的开关,从而利用对应的电源实现。(VDD、VSS)

输出控制有两个控制端

  • 输出数据寄存器:代表通用的 GPIO
  • 片上外设寄存器:代表 GPIO 的复用功能。

不同模式对应的电路流向:

浮空输入:

image-20220101102345300

输入上拉、下拉:

image-20220101102433609

image-20220101102536522

模拟输入:

image-20220101102508451

开漏输出:此时的 I/O 端口,既可以做输入模式、也可以做输出模式。

  • 此时的输出电平,并不会影响到输入电路。(与推完输出不同)
  • 因为开漏输出:VDD 不会起作用,输出高电平的时候,依靠外面外接一个上拉电阻
  • 所以开漏输出的高电平,并不会影响到对应的输入电路。

image-20220101102635507

image-20220101102743167

推挽输出:

  • 此时输出高电平,是依靠 VDD 来实现的,所以同时会影响到输入电路。
  • 此时输入电路就无法分辨,高电平是自己输出的,还是外部输入的。

image-20220101102910481


2、GPIO 的复用

STM32基本上每个引脚都有8种配置模式:

1)浮空输入
2)带弱上拉输入
3)带弱下拉输入
4)模拟输入

5)推挽输出
6)开漏输出
7)复用推挽输出
8)复用开漏输出

STM32Fxx内部集成了很多的外设控制器,比如USART、SPI、bxCAN等等,这些外设控制器,也需要通过引脚与外设连接。

复用功能是相对于单片机的引脚而言的。所谓“复用功能”,是指单片机的引脚既可以做普通GPIO使用,也可以作为内部外设控制器的引脚来使用。

比如我们来看看STM32F103xx单片机的PA5引脚,如下图:
在这里插入图片描述

(1)GPIO 支持多种外设的时候,如何区别

!!!:通过外设时钟是否是能,以及当前 GPIO 处于什么模式。

PA5 的功能:

  • 普通GPIO
  • SPI1的时钟(SPI1_SCK)
  • DAC的输出通道1(DAC_OUT1)
  • ADC的输入通道5(ADC12_IN5)

PA5支持的三种外设(SPI1、DAC、ADC)在同一时刻只能选择一种

选择的方法是:开启相应外设的时钟,并使其它外设的时钟保持关闭状态。

如果PA5被配置为复用功能,但是没有开启它支持的任何外设的时钟,它的输出是不确定的。


(2)普通推挽输出、复用推挽输出的区别

复用推挽输出和(普通)推挽输出在输出的时候均使用两个MOS管(P-MOS和-MOS),其输出电路是相同的

!!!!区别在于控制输出的信号来源

  • (普通)推挽输出控制MOS管的信号来自 输出数据寄存器
  • 复用推挽输出的控制信号来自单片机的 内置外设控制器(比如SPI1)。

下面这张图,是普通GPIO输出的引脚配置图,可以看到其输出信号来自输出 数据寄存器Output data register):
在这里插入图片描述
下面这张图,是选择复用功能后的引脚配置图,可以看到其输出信号来自 芯片内置的外设控制器
在这里插入图片描述
注意:虽然复用模式的控制信号来自内置外设控制器,但是单片机(CPU)依然可以读取相应的数据

  • 复用推挽输出模式 下,单片机可以通过读取输出数据寄存器(Output Data Register)的数据来获取上次输出的值;
  • 复用开漏输出的模式 下,单片机可以通过读取输入数据寄存器(Input Data Register)的值来获取引脚的状态。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码

)">
< <上一篇
下一篇>>