GPIO概述及工作模式详解

目录

一、GPIO概述

1、GPIO整体说明

2、GPIO主要特点

1)不同型号的芯片,其IO口的数量可能不一样

2)快速翻转。最快可以达到每两个时钟就翻转一次(STM32F1系列的芯片最快翻转速度可达50MHz)

3)IO口都可以作为外部中断

4)GPIO支持8种工作模式

二、GPIO工作模式

1、GPIO每位的具体电路结构

2、GPIO工作模式详细说明

1)输出模式

2)复用输出模式

3)输入模式

4)模拟输入模式

 三、结语


前面我们学完了点灯案例,从中也了解到了一些GPIO相关的寄存器以及工作模式,但并没有深入了解GPIO外设的相关知识。因此,现在我们就来正式学习GPIO外设的相关知识。

一、GPIO概述

GPIO(General-purpose input/output),通用型输入输出。简单理解就是我们可以控制输入输出的单片机引脚,统称为GPIO。

GPIO存在的意义就是用程序控制或读取它们的输出或输入

1、GPIO整体说明

就我们现在学习的STM32而言,它是由多组GPIO的,我们可以看看芯片的原理图就能发现

 对于我们的使用的STM32F103ZET6,GPIOx(A..G)一共有七组GPIO,其中每一组GPIO有16个引脚,也就是说我们的芯片一共含112个GPIO口。而其他型号的STM32会因其总引脚数或设计不同而包含不同数量的GPIO,因此需要去看看对应的数据手册

其中,每个引脚的电平是0-3.3V,部分引脚最高可以兼容到5V。

 这是中文数据手册中截取的一张图,从中可以看出,里面对不同系列的芯片都有不同的GPIO数,51个的、81个的以及我们这款芯片的112个。如果大家想要详细了解,可自行去数据手册中细看

2、GPIO主要特点

1)不同型号的芯片,其IO口的数量可能不一样

因为对于不同型号的芯片来说,它们的引脚数可能不一样,就可能导致其IO口数量出现差异,这个我们通过数据手册中的图表信息中足以看出。

2)快速翻转。最快可以达到每两个时钟就翻转一次(STM32F1系列的芯片最快翻转速度可达50MHz)

翻转速度就是IO口变换状态的速度,比如由低电平转为高电平,由活动变为断开等等。而GPIO呢就可以实现快速翻转,最快可以两个时钟翻转一次。关于时钟的概念,我们后面会详细学习。

之前点灯案例的时候我们设置输出模式的时候不是选择了一个最大速度50MHz嘛,这个50MHz就是一种翻转速度,且在我们这个STM32F1系列的芯片上最快翻转速度就是50MHz

3)IO口都可以作为外部中断

这个的话目前还没学到,先在这有个印象,了解一下有这么个东西,到时候学到的时候就明白了。

4)GPIO支持8种工作模式

GPIO端口的每个引脚(位)都可以由软件分别配置成8种工作状态,且每个引脚每次只能处于一种工作模式。

  1. 输入浮空(Input floating)
  2. 输入上拉(Input pull-up)
  3. 输入下拉(Input-pull-down)
  4. 模拟输入(Analog)
  5. 通用开漏输出(Output open-drain)
  6. 通用推挽式输出(Output push-pull)
  7. 推挽式复用功能(Alternate function push-pull)
  8. 开漏复用功能(Alternate function open-drain)

 每个IO口都可以自由编程,即可以通过用户需求编码控制端口的输入输出。只不过IO端口寄存器都必须按照32位字访问

输出模式下可以控制端口输出高电平或低电平,用于驱动LED、蜂鸣器等。如果是大功率器件(如电机),还需要利用驱动器(小电流控制大电流)

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

二、GPIO工作模式

1、GPIO每位的具体电路结构

通过查阅技术手册,我们可以看见GPIO每位的具体电路结构,如下图

初次见图,可能我们会觉得看的一脸蒙,但实际上它所表示的就是端口的输入和输出两部分

先看输出,其实就是有三种方式。是通过CPU向位设置/清除寄存器写入1来确定高低电平1还是0,然后给输出数据寄存器,或者是直接给0或1到输出数据寄存器里面,再或者就是片上外设进行复用输出,接着进入输出控制然后经过mos管最后控制引脚输出相应状态。如图示

 然后就是输入,因为我们观察发现,输出到IO引脚的电路和输入是连通的,换句话说咱输出的0或1可以通过上部分电路经过这个施密特触发器(翻译肖特基触发器不准确)然后经输入寄存器读出给CPU、或者经复用功能输入或经模拟输入到其他片上外设。这里可以看出,输入的方式也是三种,如图示

 这里解释一个词,关于片上外设指的是啥?

首先我们应该知道,单片机,什么叫单片机,它是将CPU以及内存等其他外设集成到一块芯片上的微控制器,也就是说,这里说的“片上外设”是指的芯片内部除CPU的其他部分,而不是我门平常所说的外部键盘、鼠标、音响等外设。

因此,这里的从“片上外设”输出或者输入给片上外设实际上说的就是从芯片的除CPU的部分去控制引脚输出0或1以及从引脚向除CPU的其他部分输入0或1的意思了。

2、GPIO工作模式详细说明

前面粗略介绍了GPIO的电路结构,总体上就是输入和输出结构,再加上一些补充和修饰模块,这样就产生了8种不同的模式。

现在我们来详细介绍一下几种工作模式 

这里首先简单说一下MOS管

这里出现的MOS管由栅极、漏极和原极构成。如果栅极和原极构成压差,则可以开启,联通电流。

1)输出模式

首先是推挽输出模式。下图所示就是推挽输出模式下输出1的过程。

首先,给位设置寄存器写入1,使他给1进入输出数据寄存器,接着再把1给到输出控制器,此时输出控制中有一个反向器,会把1变成0(或0变成1)给到两个晶体管(即PMOS管和NMOS管)

然后这两个晶体管的漏极同时链接一根导线,栅极将输出控制分成两条线分别给到两个晶体管的栅极,然后上部晶体管的原极接高电平,下部晶体管原极接低电平。

现在,1经过输出控制后给到两个晶体管的值是0,由于下部晶体管原极是低电平,所以没有电压差,不产生电流而关闭;而上部晶体管原极接高电平,构成压差,产生电流推向负载,于是在引脚输出1了。

同时,因为输出1的时候导线与输入部分也连着,所以同时这里还可以读引脚,就是直接通过上部分导线,经过施密特触发器以及输入数据寄存器然后读出到CPU就完了。

该模式下,输出0也是同理。如下图所示

 首先,给位清除寄存器写入1,使他给0到输出数据寄存器,接着再把0给到输出控制器,此时输出控制中有一个反向器,会把0变成1给到两个晶体管(MOS管)

现在,0经过输出控制后给到两个晶体管的值是1,由于下部晶体管原极是接低电平,构成压差,产生电流,拉回地线;而上部晶体管原极接高电平,所以没有电压差,不产生电流而关闭,于是引脚就输出0了。

同时上部分电路也可能会处于读引脚模式,然后读取此时引脚的状态给到CPU

这里简单总结一下:

 其次是开漏输出模式。下图所示引脚输出0的流程。

开漏输出模式下有一个特点,就是上部晶体管会永远关闭,只有下部晶体管可以打开

首先控制引脚输出0时,向位清除寄存器写入1,,然后就会给0到输出数据寄存器;也可以通过直接给0的方式到输出数据寄存器,接着输出数据寄存器将0通过输出控制给到下部晶体管,由于输出控制部分含有反向器,且上部晶体管始终关闭,所以进入下部晶体管栅极的实际上是0反向后的1,由于原极接地,能够形成压差,就可以在引脚输出0了。

同时上部分可能处于读引脚状态,然后将引脚当前状态通过施密特触发器进入输入数据寄存器,接着被读出到CPU里面。

其次,控制引脚输出1时。向位设置寄存器写入1,,然后就会给1到输出数据寄存器;也可以通过直接给1的方式到输出数据寄存器,接着输出数据寄存器将1通过输出控制给到下部晶体管,由于输出控制部分含有反向器,所以进入下部晶体管的栅极是0

由于下部晶体管原极是接地,低电平,所以与栅极没有形成压差,仍然会关闭。

此时,两个晶体管都处于关闭状态,将会导致这里形成高阻态,就没法在引脚输出1了。那么怎么解决呢?此时我们就要在引脚处接一个上拉电阻,这样就可以实现控制引脚输出1了。同时上部分可能读引脚,与前面同理,这里就不再赘述。如下图所示

之所以叫开漏模式,其实就是这个时候,只有两个晶体管的漏极打开着。 

 当然,此时就注意一个问题:这个引脚处接一个上拉电阻,上面有个高电平。那么如果一直接着的话,会不会影响到控制引脚输出低电平0呢?

实际上不会影响。因为当输出0到引脚时,即便线路上存在高电平,这部分线路电流都被拉低,接地,导致最终仍旧输出的是低电平0.因此,开漏输出模式时,一直接着上拉电阻,并不会影响到低电平的输出。

那么,在对开漏输出模式做一下总结,如图

 

开漏输出模式与推挽输出模式 的使用场景:

之所以推挽不推荐使用共用信号线的场合,是因为使用推挽模式时,如果多个引脚连接一条总线,那么当两个引脚同时处于高低电平时,那么会因为“线与”导致总线上的电平全部拉低而接地,这样会导致很严重的问题;但此时选择开漏输出就没多大事,因为输出高电平只是受上拉电阻的影响,而内部处于高阻状态。(这里可能讲述不太清楚,大家可以自己多查查再)

最后整体总结一下:

  1. 输出缓冲器被激活。(我们要进入输出模式,所以输出缓冲器肯定得激活)
  2. 推挽模式:输出寄存器上的 1 将激活P-MOS,输出高电平。0 将激活N-MOS,输出低电平。
  3. 开漏模式:PMOS永远关闭。 输出寄存器上的 0 激活N-MOS,而输出寄存器上的1 将端口置于高阻状态,所以外部必须要接上拉电阻。
  4. 施密特触发输入被激活。(因为可能读引脚,所以需要激活打开)
  5. 弱上拉和下拉电阻被禁止。(此时读取引脚状态,所以不需要默认状态,因此禁用)
  6. 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器。(CPU会读取引脚状态信息)
  7. 在开漏模式时,对输入数据寄存器的读访问可得到I/O状态。(所谓IO状态,指的是当前IO端口所处的高电平还是低电平等状态)
  8. 在推挽模式时,对输出数据寄存器的读访问得到最后一次写的值。(所谓最后一次写的值,指的是上一次通过位设置/清除寄存器或者直接给IO端口引脚的高低电平状态)

2)复用输出模式

复用输出模式的话就相对简单很多了,如下图

就是单纯接收来自片上外设的状态,然后直接经过输出控制以及晶体管然后输出给引脚就完事了。其中,经过输出控制与晶体管的过程和前面将输出模式的时候是一样的,要是不记得可以看看前面的流程,这里就不加赘述了。 

在这里,同样给出这个整体的过程:
1)在开漏或推挽式配置中,输出缓冲器被打开。
2)内置外设的信号驱动输出缓冲器(复用功能输出)。
3)施密特触发输入被激活。
4)弱上拉和下拉电阻被禁止。
5)在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器。
6)开漏模式时,读输入数据寄存器时可得到I/O口状态。
7)在推挽模式时,读输出数据寄存器时可得到最后一次写的值。

 

3)输入模式

在介绍输入模式工作流程前,先介绍一下这部分电路的各个小部分的作用,因为这都与输入息息相关。

我们从引脚部分开始看,首先是这里有两个保护二极管。2个保护二极管的作用是保护我们的芯片不会由于电压过高或过低而烧毁。

VDD是接电源(3.3V),VSS接地(0V)。如果IO引脚的输入电压高于VDD的值到一定程度,上方保护二极管导通,则引脚电压被拉低到VDD

如果IO引脚的输入电压(负电压)低于VSS到一定程度,则下方保护二极管导通,电压被拉高到VSS

接着,就是上拉和下拉

 2个开关控制引脚在没有输入的时候是上拉,下拉还是浮空,也就是起到给一个默认状态(高电平、低电平、浮空)的效果。

1)当上面的开关闭合的时候,输入被拉高到高电平

2)当下面的开关闭合的时候,输入被拉低到低电平;

3)如果两个都不闭合,输入就是浮空状态;

4)两个同时闭合,就是费电了,不会这么做的。

然后,就是这个施密特触发器(手册翻译是肖特基触发器,有误,英文版手册是TTL Schmitt trigger),触发器是包含正反馈的比较器电路。可以对信号进行波形整形

 因为我们线路传输过程中,实际上信号波形并不稳定,即并不是标准的方波,而是含有很多毛刺的类似方波的波形。那么为了使这种波形更加标准,我们将使用某种电路去尽可能消除毛刺。这里用的就是这个施密特触发器。

 最后,就是给到输入数据寄存器,然后读出到CPU了。

整体过程图如下

 

4)模拟输入模式

模拟输入模式,这个和前面的输入不太一样,他的模拟信号更加理想,没有毛刺,为减少消耗,所以这时候我们不需要施密特触发器,所以此时将被禁用

整个过程就是引脚的状态直接经模拟输入到片上外设就可以了,很简单的过程。

整理一下,当配置为模拟输入时:

  1. 输出部分被禁止。(进行输入嘛,输出部分就不需要了,所以禁止)
  2. 禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强置为0。
  3. 弱上拉和下拉电阻被禁止。
  4. 读取输入数据寄存器时数值永远为0。

 三、结语

本次咱学习了GPIO的一些相关介绍以及GPIO主要的8种工作模式,主要就是输入和输出模式,再加上一些特定情况下的输入输出,整体来说还好。

这部分涉及到了一些后面才会详细学习的知识点,所以没有详细说明,比如时钟、外部中断等。因此,不要慌张,这里咱先有个印象,后期一学到了,就自然明了了。

加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值