1.前言

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

所以我们不仅要知道GPIO能够输出高低电平,还要理解为什么有些GPIO可以复用某些功能,而其他的不可以。GPIO的模式如同所示,这么多模式如何理解呢?下面一一分析

2.GPIO组寄存器

我们想要想控制一个GPIO口的需要操作7个寄存器,分别是CRL,CRH,IDR,ODR,BRR,BSRR,LCKR,其实我们对GPIO的操作本质上就是在对这些寄存器进行读写操作。这些寄存器的每一个位的作用可以去查ST公司提供的参考手册(有中文的),这里主要是介绍GPIOx_CRL(x = A..E)和GPIOx_CRH(x = A..E)这两个寄存器里面的模式,如上面那个图

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

3.GPIOx_CRL(x = A..E)和GPIOx_CRH(x = A..E)区别

CRL用来存放低八位的IO口(GPIOx0—GPIOx7)的配置,CRH用来存放高八位的IO口(GPIOx8—GPIOx15)的配置。(因为需要4个位配置一个输入/输出的IO位),所以ST公司就设计了两个32位寄存器去控制一个16位的寄存器模式(输入/输出寄存器)。

4.输出模式

输出模式就是下面四种,其实本质就是两种,后面两种就是开启复用的特殊模式而已。

00:通用推挽输出模式

01:通用开漏输出模式

10:复用功能推挽输出模式

11:复用功能开漏输出模式

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

  • 若向该结构中输入高电平,经过反向后,上方的P-MOS导通,下方的N-MOS关闭,对外输出高电平;

  • 若向该结构中输入低电平时,经过反向后,下方的N-MOS管导通,上方的P-MOS关闭,对外输出低电平。

  • 当引脚高低电平切换时,两个MOS管轮流导通,P管负责灌电流,N管负责拉电流,使其负载能力和开关速度都比普通的方式有很大的提高。**推挽输出的低电平为0V,高电平为3.3V**。

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

  • 上方的P-MOS管完全不工作;

  • 如果我们控制输出为0,低电平,则P-MOS管关闭,N-MOS管导通,使输出接地;

  • 若控制输出为1(它无法直接输出高电平)时,则P-MOS管和N-MOS管都关闭,所以开漏输出模式下引脚既不输出高电平,也不输出低电平,为高阻态

4.3两种模式应用场景

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

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

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

5.输入模式

  • 上拉输入: GPIO_Mode_IPU

  • 下拉输入: GPIO_Mode_IPD

  • 浮空输入: GPIO_Mode_IN_FLOATING

  • 模拟输入: GPIO_Mode_AIN

前面三种输入的区别在于,有没有使用上拉电阻,和下拉电阻。浮空输入是没有使用电阻的。

输入模式主要图片上面的一部分。

5.1.浮空输入

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

5.2上拉输入模式

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

5.3.下拉输入模式

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

5.4 模拟输入模式

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

6.总结

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

参考链接: 本文主要是在参考链接基础进行一些总结的。

一文看懂GPIO!-面包板社区 (eet-china.com)

GPIO输入输出模式分析(详解)相关推荐

  1. Java快速输入输出使用详解(解决Java输入输出超时问题)

    Java快速输入输出使用详解 一.背景:   Scanner类输入时,虽然方式很简单,但是输入实在太慢了,经常遇到大的数据量时候就超时.(你觉得数据有点多时就用快速输入即可)   某些题目用Scann ...

  2. RabbitMq的六种模式分析详解

    AMQP 即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.消息中间件主要用于组件之间的解耦,消息的发送者无需 ...

  3. linux输入输出重定向详解

    Chapter 16. I/O 重定向 默认情况下始终有3个"文件"处于打开状态, (键盘), (屏幕), and (错误消息输出到屏幕上). 这3个文件和其他打开的文件都可以被重 ...

  4. GPIO工作模式详解(含Arduino实例)

    1. GPIO介绍 从最基础的51单片机,Arduino,到STM32,树莓派等等,这些上面都会有GPIO口这么一个概念,如果你点开了我这个博客,说明你大概率开始学习单片机,那么你应该了解的就是这些口 ...

  5. C/C++字符数组的输入输出方式详解

    字符是C/C++读入数据最主要的类型.本篇将介绍单个字符数组/多个字符串及二维数组的输入输出方式与相关函数. 目录 单个字符串处理 ​编辑 输入 逐个元素输入 整体串形式输入 输出 逐个输出 整体串形 ...

  6. 【Linux】 Orangepi GPIO开发详解

    Orangepi GPIO 驱动开发详解 1. wiringPi库驱动 安装wiringPi库 命令行驱动GPIO C语言驱动GPIO 2. 内核(sysfs)GPIO驱动 命令行驱动板载led C语 ...

  7. GPIO输入输出各种模式(推挽、开漏、准双向端口)详解---重点双向开漏端口

    GPIO输入输出各种模式(推挽.开漏.准双向端口)详解 原创techexchangeischeap 发布于2017-05-20 10:31:31 阅读数 62961  收藏 展开 技术交流是便宜的博客 ...

  8. STM32 GPIO 详解

    0. 实验平台 基于STM32F407ZG 1. GPIO 简介 1.1 简介 GPIO全称:General Purpose Input Output,即通用输入输出端口,一般用来采集外部器件的信息或 ...

  9. STM32F0——GPIO详解

    STM32F0--GPIO详解 一. GPIO (General Purpose I/O Port) 统称为通用输入/输出端口. 二. GPIO的基本结构 1. 输入配置 2.输出配置 3. 复用功能 ...

最新文章

  1. 性能全面超数据库专家,腾讯提基于机器学习的性能优化系统 | SIGMOD 2019
  2. spring mvc之HandlerMapping
  3. linux设置默认时区,关于linux:如何修改-Linux-默认时区
  4. 自己整理的计算机视觉领域稍微容易中的期刊(第一版)
  5. 结账任务 - 年终结账
  6. php + mssql乱码
  7. gson 不忽略空_java – Gson序列化字段只有在不为null或不为空
  8. SFP光模块与SFP+、XFP、QSFP、GBIC、BIDI的区别
  9. 使用fastjson读取超巨json文件引起的GC问题
  10. 【跨境电商】WhatsApp营销保姆级教程!
  11. 【AcWing 327. 玉米田】状压dp
  12. fluid mask 3_CSS3 Fluid Layout和Media Queries:一种响应式Web设计的简单方法
  13. auto-springboot
  14. 树莓派镜像备份/内核编译和更换/EC200U上网
  15. 高精度计算-大整数除法
  16. 学习笔记:在Ubuntu16.04系统内安装Petalinux软件(包括如何安装Ubuntu16.04和相关支持库 详解)
  17. 台达服务器电源性能怎么样,台达电源怎么样?该怎么选择台达电源?
  18. 如何在客户端连接MySQL服务呢???
  19. 升级版 @Async,让异步任务无懈可击
  20. MySQL MEB常见用法

热门文章

  1. R 绘制渐变中国地图及添加南海九段图
  2. 最新shsh备份详细教程(现在只能备份最新的固件)
  3. 一招教你怎样分辨照片是否被ps处理过方法
  4. 熊猫烧香案主犯编出杀毒程序
  5. 谷歌浏览器在怎么添加迅雷_如何在Google搜索结果中添加作者信息
  6. 16.求两个数的最大公约数和最小公倍数
  7. Leetcode 413. 等差数列划分(python)
  8. 《思维导图的三招十八式》读书笔记
  9. java面试学习宝典记录
  10. 合并报表软件工具怎么用?