0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

GPIO是什么?

汽车电子技术 来源:嵌入式悦翔园 作者:JamesBin 2023-02-17 10:55 次阅读

一、前言

GPIO全称General Purpose Input Output 即通用输入/输出,其实GPIO的本质就是芯片的一个引脚,通常在ARM中所有的I/O都是通用的。不过由于每个开发板上都会设计不同的外围电路,这就造成GPIO的功能可能有所不同,大部分GPIO都是有复用功能的,比如有些GPIO可能是串口的TXRX,也可能是I2CSCLSDA线。

所以我们不仅要知道GPIO能够输出高低电平,还要理解为什么有些GPIO可以复用某些功能,而其他的不可以。

二、GPIO内部结构

图片我们在使用GPIO的时候可能不会去想为什么我们通过写代码或者操作寄存器就可以控制一个引脚的高低电平。

今天就让我们一起来看看为什么我们通过操作寄存器(其实写代码的过程就是在操作寄存器)就能控制引脚输入或者输出。

我们想要想控制一个GPIO口的需要操作7个寄存器,分别是CRL,CRH,IDR,ODR,BRR,BSRR,LCKR 我们对GPIO的操作本质上就是在对这些寄存器进行读写操作,以下是这些寄存器的名称:

GPIOx_CRL(x = A..E)端口配置低寄存器 32位寄存器
GPIOx_CRH(x = A..E)端口配置高寄存器 32位寄存器
GPIOx_IDR(x = A..E)端口输入数据寄存器 32位寄存器但仅用低16GPIOx_ODR(x = A..E)端口输出数据寄存器 32位寄存器但仅用低16GPIOx_BRR(x = A..E)端口位清除寄存器 16位寄存器
GPIOx_BSRR(x = A..E)端口位设置/清除寄存器 16位寄存器
GPIOx_LCKR(x = A..E)端口配置锁定寄存器 32位寄存器

我们首先分析上面的结构电路:

1、保护二极管 保护二极管从它的名字就不难想到他是用来对系统进行保护的,通过两个二极管的导通可以防止引脚外部输入电压过低或过高。当电压过高时,上方的保护二极管导通。当电压过低时,下方的二极管导通,防止不正常电压导入到芯片内部造成芯片烧毁。

2、P·MOS管和N·MOS管: GPIO经过两个二极管的保护后向上流入输入模式,向下流入输出模式,而输出模式的控制是由一个由P·MOS管和N·MOS管组成的单元电路,该电路主要是控制输出的模式,由该结构狗策划给你的单元电路具有推挽输出开漏输出两种模式。

当系统配置为推挽输出模式时:

  • 若向该结构中输入高电平,经过反向后,上方的P-MOS导通,下方的N-MOS关闭,对外输出高电平;
  • 若向该结构中输入低电平时,经过反向后,下方的N-MOS管导通,上方的P-MOS关闭,对外输出低电平。
  • 当引脚高低电平切换时,两个MOS管轮流导通,P管负责灌电流N管负责拉电流,使其负载能力和开关速度都比普通的方式有很大的提高。 推挽输出的低电平为0V,高电平为3.3V

当系统配置为开漏输出模式时:

  • 上方的P-MOS管完全不工作;
  • 如果我们控制输出为0,低电平,则P-MOS管关闭,N-MOS管导通,使输出接地;
  • 若控制输出为1(它无法直接输出高电平)时,则P-MOS管和N-MOS管都关闭,所以 开漏输出模式下引脚既不输出高电平,也不输出低电平,为高阻态

推挽输出模式一般应用在输出电平为0和3.3V而且需要 高速切换开关状态的场合开漏输出模式一般应用在I2C、SMBUS通信等需要 线与功能的总线电路中

单片机中除了必须用开漏模式的场合,一般习惯使用推挽输出模式

3、输出数据寄存器 :前面我们知道双了MOS管结构电路的输入信号,是由GPIO输出数据寄存器GPIOx_ODR提供的,因此我们可以通过修改输出数据寄存器的值,就可以修改GPIO引脚的输出电平。而置位/复位寄存器GPIOx_BSRR可以通过修改输出数据寄存器的值,从而影响电路的输出。

4、复用功能输出 :复用功能输出中的复用是指STM32的其他片上外设对GPIO引脚进行控制,此时GPIO引脚用作该外设功能的一部分,算是第二用途。从其他外设引出来的复用功能输出信号与GPIO本身的数据寄存器都连接到双MOS管结构的输入中。

三、输入输出模式

GPIO共有8中输入输出模式,分别是:上拉输入、下拉输入、浮空输入、模拟输入、开漏输出、推挽输出、开漏复用输出、推挽复用输出 ,下面我们详细介绍以下上面的八种输入输出模式。

  • 上拉输入: GPIO_Mode_IPU
  • 下拉输入: GPIO_Mode_IPD
  • 浮空输入: GPIO_Mode_IN_FLOATING
  • 模拟输入: GPIO_Mode_AIN
  • 开漏输出: GPIO_Mode_Out_OD
  • 推挽输出: GPIO_Mode_Out_PP
  • 开漏复用: GPIO_Mode_AF_OD
  • 推完复用: GPIO_Mode_AF_PP

这里详细讲一下几个常用的模式:

3.1 浮空输入

浮空输入模式下,I/O端口的电平信号直接进入输入数据寄存器。也就是说,I/O的电平状态是不确定的,完全由外部输入决定;如果在该引脚悬空(在无信号输入)的情况下,读取该端口的电平是不确定的,通常用于IICUSART等总线设备上。图片

3.2 上拉输入模式

上拉输入模式下,I/O端口的电平信号直接进入输入数据寄存器。但是在I/O端口悬空(在无信号输入)的情况下,输入端的电平保持在高电平(并且在I/O端口输入为低电平的时候,输入端的电平也是低电平)图片

3.3 下拉输入模式

下拉输入模式下,I/O端口的电平信号直接进入输入数据寄存器。但是在I/O端口悬空(在无信号输入)的情况下,输入端的电平保持在低电平;并且在I/O端口输入为高电平的时候,输入端的电平也是高电平。图片

3.4 模拟输入模式

模拟输入模式下,I/O端口的模拟信号(电压信号,而非电平信号)直接模拟输入到片上外设模块,比如ADC模块等。图片

3.5 开漏输出模式

见上面二中的详细介绍;

3.6 开漏复用输出模式

开漏复用输出模式,与开漏输出模式很是类似。只是输出的高低电平的来源,不是让CPU直接写输出数据寄存器,取而代之利用片上外设模块的复用功能输出来决定的,一般用于片内外设功能:TX1,MOSI,MISO,SCK,SS

3.7 推挽输出模式

见上面二中的详细介绍;

3.8 推挽复用输出模式

推挽复用输出模式,与推挽输出模式很是类似。只是输出的高低电平的来源,不是让CPU直接写输出数据寄存器,而是利用片上外设模块的复用功能输出来决定的,常见采用推挽输出模式的一般为片内外设功能IICSCLSDL图片

四、开漏输出和推挽输出的区别

开漏输出和推挽输出模式的区别主要是开漏输出 只可以输出强低电平,高电平得靠外部电阻拉高 。输出端相当于三极管的集电极,适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内);推挽输出 可以输出强高、低电平 ,连接数字器件。图片

五、STM32中GPIO的配置

在固件库开发中,操作寄存器 CRHCRL 来配置 IO 口的模式和速度是通过 GPIO 初始化函数完成:

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
/*第一个参数是用来指定 GPIO,取值范围为 GPIOA~GPIOG。
 *第二个参数为初始化参数结构体指针,结构体类型为 GPIO_InitTypeDef
 */

初始化 GPIO 的常用格式是:

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-- PB.5 端口配置

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度 50MHz

GPIO_Init(GPIOB, GPIO_InitStructure);//根据设定参数配置 GPIO

IO 口速度设置有三个可选值:

typedef enum

{

GPIO_Speed_10MHz,

GPIO_Speed_2MHz,

GPIO_Speed_50MHz

}GPIOSpeed_TypeDef;

模式则有8个可选定义如下:

typedef enum

{ GPIO_Mode_AIN = 0x0, //模拟输入

GPIO_Mode_IN_FLOATING = 0x04, //浮空输入

GPIO_Mode_IPD = 0x28, //下拉输入

GPIO_Mode_IPU = 0x48, //上拉输入

GPIO_Mode_Out_OD = 0x14, //开漏输出

GPIO_Mode_Out_PP = 0x10, //通用推挽输出

GPIO_Mode_AF_OD = 0x1C, //复用开漏输出

GPIO_Mode_AF_PP = 0x18 //复用推挽

}GPIOMode_TypeDef;

六、总结

本文主要介绍了GPIO的定义和GPIO不同模式间的区别与实现方式,观看完本文相信你对于GPIO会有一个更深的理解,我们如果是做软件的可以不用太关注于GPIO是如何实现的,但是我们需要知道每个模式下GPIO的特点和应用场合,只有这样我们在实际应用中才能更好的配置出最合适的那个。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    447

    文章

    47801

    浏览量

    409166
  • ARM
    ARM
    +关注

    关注

    134

    文章

    8653

    浏览量

    361823
  • GPIO
    +关注

    关注

    16

    文章

    1135

    浏览量

    50578
收藏 人收藏

    评论

    相关推荐

    gpio_什么是gpio

    本内容介绍了gpio_什么是gpioGPIO,英文全称为General-Purpose IO ports,也就是通用IO口。
    发表于 12-19 16:31 2.5w次阅读

    被zynq的GPIO唬住,告诉你zynq的3种GPIO

    我们先看有哪三种GPIO:MIO、EMIO、AXI_GPIO。其中MIO和EMIO是直接挂在PS上的GPIO。而AXI_GPIO是通过AXI总线挂在PS上的
    发表于 07-07 08:23 4964次阅读

    为什么树莓派项目的GPIO零优于RPi.GPIO

    在学习Python代码时,您会了解到它是GPIO良好设计的证明。应当易于阅读且尽可能简短。 GPIO零旨在涵盖这两个方面。构建在RPi.GPIO上作为前端语言包装,它简化了GPIO的设
    的头像 发表于 12-02 11:05 5680次阅读
    为什么树莓派项目的<b class='flag-5'>GPIO</b>零优于RPi.<b class='flag-5'>GPIO</b>

    GPIO是什么?应该如何使用GPIO

    字面意思看,GPIO=General Purpose Input Output,通用输入输出。有时候简称为“IO 口”。通用,就是说它是万金油,干什么都行。输入输出,就是说既能当输入口使用,又能
    发表于 11-25 10:17 21次下载
    <b class='flag-5'>GPIO</b>是什么?应该如何使用<b class='flag-5'>GPIO</b>

    GPIO是什么?GPIO应用的详细介绍

    字面意思看,GPIO=General Purpose Input Output,通用输入输出。有时候简称为“IO 口”。通用,就是说它是万金油,干什么都行。输入输出,就是说既能当输入口使用,又能
    发表于 12-16 22:54 24次下载
    <b class='flag-5'>GPIO</b>是什么?<b class='flag-5'>GPIO</b>应用的详细介绍

    --GPIO

    STM32学习笔记GPIOSTM32F103RCT6共有51个GPIO:PA(B,C,D) 0-15 和PD 0-2GPIO相关寄存器端口配置寄存器(GPIOx_CRL和GPIOx_CRH)端口配置
    发表于 11-21 18:21 10次下载
    --<b class='flag-5'>GPIO</b>

    GPIO配置

    有关推挽输出、开漏输出、复用开漏输出、复用推挽输出以及上拉输入、下拉输入、浮空输入、模拟输入的区别最近在看数据手册的时候,发现在Cortex-M3里,对于GPIO的配置种类有8种之多
    发表于 12-01 10:36 13次下载
    <b class='flag-5'>GPIO</b>配置

    sunplus gpio使用

    GPIO函数介绍GPIO_F_SET(a,d)//GPIO口使能设置,d=1 enable. D=0 disableGPIO_M_SET(a,d)// 设置IO口支持的指令d=0 IOP
    发表于 12-20 19:08 5次下载
    sunplus <b class='flag-5'>gpio</b>使用

    STM32-GPIO详解

    STM32-GPIO配置介绍typedef struct { uint32_t GPIO_Pin; GPIOMode_TypeDef GPIO
    发表于 12-24 19:12 15次下载
    STM32-<b class='flag-5'>GPIO</b>详解

    HAL库-GPIO介绍

    一.GPIO 使用1.输入输出模式(8种)GPIO_Mode_AIN #模拟输入GPIO_Mode_IN_FLOATING #浮空输入GPIO
    发表于 12-28 19:32 2次下载
    HAL库-<b class='flag-5'>GPIO</b>介绍

    STM32中GPIO_Mode--GPIO配置

    本篇由转载而来,有侵权请联系作者,谢谢。原博客地址:https://blog.csdn.net/snow416/article/details/6540646一、GPIO配置
    发表于 12-28 19:33 13次下载
    STM32中<b class='flag-5'>GPIO_Mode--GPIO</b>配置

    STM32学习笔记---GPIO

    STM32的学习笔记—GPIO我使用的是STM32F401ZGT6,有7组IO口,每组16个引脚,共112个引脚。因为太菜了,确实容易出错,还请赐教参考官方文档:八种IO口模式区别结构原理该单片机
    发表于 01-13 16:31 6次下载
    STM32学习笔记---<b class='flag-5'>GPIO</b>

    使用GPIO Zero让GPIO变得更容易

    为儿童和年轻人开发的用于GPIO控制的简单Python库,如果您有过为Raspberry Pi的GPIO 引脚编写代码的经验,那么估计您已经使用过Python以及GPIO Zero模块了,因为这是最简单的入门方式。
    的头像 发表于 03-01 10:51 1454次阅读
    使用<b class='flag-5'>GPIO</b> Zero让<b class='flag-5'>GPIO</b>变得更容易

    通过RPi.GPIO Python库使用Raspberry Pi GPIO引脚

    在2016年推出GPIO Zero之前,新用户通常使用另一个Python模块(RPi.GPIO)来使用GPIO引脚。
    的头像 发表于 02-25 17:36 1876次阅读
    通过RPi.<b class='flag-5'>GPIO</b> Python库使用Raspberry Pi <b class='flag-5'>GPIO</b>引脚

    什么是GPIOGPIO组成原理

    GPIO全拼叫General Purpose Input Output(通用输入输出)简称IO口也叫总线扩展器,GPIO口是由引脚,功能寄存器组成,不同的架构中的GPIO封装不同,所使用的引脚数与寄存器数不同,具体可以参考芯片手
    发表于 04-28 12:30 38次阅读
    什么是<b class='flag-5'>GPIO</b>?<b class='flag-5'>GPIO</b>组成原理