据说能将处理器的GPIO(General Purpose Input and Output)内部结构和各种模式彻底弄清楚的人并不多?那现在就让多一点

GPIO的功能,简单说就是可以根据自己的需要去配置为输入或输出。但是在配置GPIO管脚的时候,常会见到两种模式:开漏(open-drain,漏极开路)和推挽(push-pull)。


GPIO的结构:

首先,了解GPIO结构里面的三个重要组成部分,如下图所示

  • 上拉以及下拉电阻(pull-up and pull-down resistors):上下拉电阻的作用就是将浮空管脚拉到一个固定的状态(0或者1),上拉电阻将浮空管脚上拉至VDD,下拉电阻将浮空管脚下拉至GND。
  • 施密特触发器(Schmitt trigger ):信号经过施密特触发器之后,模拟信号转换为数字信号0和1。
  • PMOS和NMOS(p-mos and n-mos transistors 决定了电路工作在开漏输出模式或者是推挽输出模式

s

Push-Pull结构(推挽):

顾名思义,PUSH-PULL中所谓PUSH指的是把输出推到电路的VDD电压,所谓Pull指的是将输出拉到Ground电压。

Simplified schematic of a push-pull output

如上图所示,可以看出是由一对PMOS和NMOS组成了一个简单的Push-Pull结构,具体的原理如下:

  • Push phase – 当连接在Mos管栅极的internal信号输入为低电平(Logic 0)的时候,PMOS管导通,电流从VDD流经PMOS管至输出端口。
  • Pull phase – 当连接在Mos管栅极的internal信号输入为高电平(Logic 1)的时候,NMOS管导通,电流从Output端流经PMOS管至GND。

Open-Drain结构(开漏):

如图所示,可以看出开漏输出电路是由一个N沟道MOS管组成的,当NMO管导通时,电路通过NMOS管将输出拉低至GND;当NMOS管关闭时,电路输出管脚浮空。

Schematic of an open drain output

开漏输出电路一般用于通信接口,该通信接口下同时挂着n多个devices(比如I2C结构),如上图所示,当Internal signal信号输入高电平的情况下,NMOS管导通,输出被拉低到低电平状态;当Internal signal信号输入低电平的情况下,NMOS管截至,输出高阻态(高阻态、三态、浮空都表示一个意思),此时电路对外没有展示出任何驱动能力,此时可以在外部接一个上拉电阻来实现输出高电平。

  1. 开漏输出的这一特性一个明显的优势就是可以很方便的调节输出的电平,因为输出电平完全由上拉电阻连接的电源电平决定。所以在需要进行电平转换的地方,非常适合使用开漏输出。
  2. 开漏输出的这一特性另一个好处在于可以实现"线与"功能,所谓的"线与"指的是多个信号线直接连接在一起,只有当所有信号全部为高电平时,合在一起的总线为高电平;只要有任意一个或者多个信号为低电平,则总线为低电平。而推挽输出就不行,如果高电平和低电平连在一起,会出现电流倒灌,损坏器件。

【open-drain和push-pull的总结】

对于GPIO的模式的设置,在不考虑是否需要额外的上拉电阻的情况下,是设置为open-drain还是push-pull,说到底,还是个权衡的问题:

如果你想要电平转换速度快的话,那么就选push-pull,但是缺点是功耗相对会大些。

如果你想要功耗低,且同时具有“线与”的功能,那么就用open-drain的模式。(同时注意GPIO硬件模块内部是否有上拉电阻,如果没有,需要硬件电路上添加额外的上拉电阻)[1]


GPIO的八种工作模式

1、4种输入模式

输入浮空、输入上拉、输入下拉、模拟输入

2、4种输出模式

开漏输出、开漏复用功能、推挽输出、推挽复用功能

3、可配置3种最大翻转速度

   2MHz

   10MHz

   50MHz

八种工作方式讲解

1、GPIO输入工作模式---输入浮空模式

浮空输入模式下,I/O端口的电平信号直接进入输入数据寄存器。

详细的说:

(1)首先,外部电路通过I/O端口输入电平,外部电平通过上下拉部分(浮空模式下都关闭,既无上拉也无下拉电阻)传输到施密特触发器(此时施密特触发器为打开状态)

(2)外部电平在经过施密特触发器之后继续传输到输入数据寄存器IDR(Input Data Register)

(3)CPU通过读输入数据寄存器实现读取外部输入电平值的目标,I/O的电平状态是不确定的,完全由外部输入决定;如果在该引脚悬空(在无信号输入)的情况下,读取该端口的电平是不确定的。

2、GPIO输入工作模式---输入上拉模式

上拉输入模式下,I/O端口的电平信号直接进入输入数据寄存器。

和输入浮空模式相比较,外部输入通过上拉电阻,施密特触发器存入输入数据寄存器IDR,被CPU读取。但是不同之处在于:

(1)内部有一个上拉电阻连接到VDD(输入上拉模式下,上拉电阻开关接通,阻值约30-50K)(2)但是在I/O端口悬空(在无信号输入)的情况下,输入端的电平可以保持在高电平;并且在I/O端口输入为低电平的时候,输入端的电平也还是低电平。

3、GPIO输入工作模式---输入下拉模式

上拉输入模式下,I/O端口的电平信号直接进入输入数据寄存器。

和输入浮空模式相比较,外部输入通过上拉电阻,施密特触发器存入输入数据寄存器IDR,被CPU读取。但是不同之处在于:

(1)内部有一个下拉电阻连接到VSS(输入下拉模式下,下拉电阻开关接通,阻值约30-50K)(2)但是在I/O端口悬空(在无信号输入)的情况下,输入端的电平可以保持在高电平;并且在I/O端口输入为低电平的时候,输入端的电平也还是低电平。

4、GPIO输入工作模式---输入模拟模式

上拉和下拉部分均为关闭状态(AD转换-模拟量转换为数字量),施密特触发器为截止状态,I/O端口的模拟信号直接通过模拟输入通道输入到CPU,IO口外部电压为模拟量(电压形式非电平形式),作为模拟输入范围一般为0~3.3V

5、GPIO输出工作模式---开漏输出模式

开漏输出模式下,通过设置位设置/清除寄存器或者输出数据寄存器的值,途经N-MOS管,最终输出到I/O端口。

具体过程如下:

CPU写入位设置/清楚寄存器BSRR,映射到输出数据寄存器ODR,联通到输出控制电路(也就是ODR的电平),ODR电平通过输出控制电路进入N-MOS管。

(1)-ODR输出1:

  •   N-MOS截止,IO端口电平不会由ODR输出决定,而由外部上拉/下拉决定
  •   在输出状态下,输出的电平可以被读取,数据存入输入数据寄存器,由CPU读取,实现CPU读取输出电平;所以,当N-MOS截止时,如果读取到输出电平为1,不一定是我们输出的1,有可能是外部上拉产生的1

(2)-ODR输出0:

  •   N-MOS开启,IO端口电平被N-MOS管拉低至VSS,使IO输出低电平,此时输出的低电平同样可以被CPU读取到

6、GPIO输出工作模式----开漏复用输出模式

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

与开漏输出模式唯一的区别在于输出控制电路电平的来源

  • 开漏输出模式的输出电平是由CPU写入输出数据寄存器控制的
  • 开漏推挽输出模式的输出电平是由复用功能外设输出决定的
  • 其他与开漏输出模式相似:
  • 控制电路输出为1:N-MOS截止,IO口电平由外部上拉/下拉决定
  • 控制电路输出为0:N-MOS开启,IO口输出低电平

7、GPIO输出工作模式3-推挽输出模式

与开漏输出相比较,输出控制寄存器部分相同,输出驱动器部分加入了P-MOS管部分

(1)当输出控制电路输出1时:

P-MOS管导通N-MOS管截止,被上拉到高电平,IO口输出为高电平1

(2)当输出控制电路输出0时:

  • P-MOS管截止N-MOS管导通,被下拉到低电平,IO口输出为低电平0
  • 同时IO口输出的电平可以通过输入电路读取

8、GPIO输出工作模式4-复用推挽输出模式

与推挽输出模式唯一的区别在于输出控制电路之前电平的来源

  • 开漏输出模式的输出电平是由CPU写入输出数据寄存器控制的
  • 开漏推挽输出模式的输出电平是由复用功能外设输出决定的

GPIO的常见的使用方法

1、GPIO用作开关

参考

  1. ^高阻、三态、浮空三种说法代表同一个意思

wringPi 初始化GPIO 为上拉_你彻底弄清GPIO内部结构和各种模式了吗?相关推荐

  1. wringPi 初始化GPIO 为上拉_敏矽微电子Cortex-M0学习笔记04-GPIO详解及应用实例

    前面我们已经对敏矽微电子的基于cortex m0内核的ME32F030R8T6的基本功能做了介绍,然后详细讲解了开发环境MDK的安装,pack包的安装,工程的建立及程序的仿真,紧接着讲解了ME32F0 ...

  2. wringPi 初始化GPIO 为上拉_玩转GPIO之PWM点亮呼吸灯(非树莓派)

    在这篇文章,我介绍了基于逸宸电子开发的总线适配器来点亮LED灯的基本方法! myastrotong:玩转GPIO之点灯(非树莓派)​zhuanlan.zhihu.com 这款总线适配器的介绍见这里: ...

  3. 鸿蒙开发板hi3861 hispark code 2.0 canary金丝雀版本,gpio如何上拉电阻呢?

    鸿蒙开发板hi3861 hispark code 2.0 canary金丝雀版本,gpio如何上拉电阻呢? code 2.0 LTS支持,canary没有这个功能呢 IoSetPull(WIFI_IO ...

  4. wringPi 初始化GPIO 为上拉_GPIO接口

    //阅读完大约10min //本文中的正文,改编自以下链接评论,由于非常全面明晰,所以我将之采纳. STM32的I/O口的8种工作模式-OpenEdv-开源电子网​www.openedv.com 前言 ...

  5. wringPi 初始化GPIO 为上拉_GPIO子系统重要概念

    来源:百问网 作者:韦东山 本文字数:3161,阅读时长:5分钟 1.1 引入 要操作GPIO引脚,先把所用引脚配置为GPIO功能,这通过Pinctrl子系统来实现. 然后就可以根据设置引脚方向(输入 ...

  6. gpio上拉失效问题

    遇到一个问题是与gpio的上拉失效有关. 先看一下我的问题描述和解决过程 关于反复重启1000整机设备,出现PXM板卡启动失败的现象问题描述: 通过当时记录的串口信息,最开始的异常出现在sdk加载上, ...

  7. MUI框架的上拉加载的深入探索和实战运用

    文章目录 上拉加载 初始化 端部上拉载荷 重置上拉加载 禁用上拉刷新 启用上拉刷新 选项卡更改图标 mui变量和plus变量分别是什么 网络请求必须用mui.ajax,调试必须用真机或模拟器 上拉加载 ...

  8. GPIO内部结构和各种模式

    目录 前言1 前言2 1.GPIO的结构: 1.1 Push-Pull结构(推挽): 1.2 Open-Drain结构(开漏): 2.GPIO的八种工作模式 1.4种输入模式 2.4种输出模式 3.可 ...

  9. 上拉加载_如何用Vue + Mint UI实现上拉加载更多

    引言: 上拉加载更多在移动端不论是在 app 里面还是在页面中都是必不可少的,以下是 mint-ui 中上拉加载更多的总结. 一.在项目中使用 mint-ui 需要先安装 查看官网 (1)安装:npm ...

最新文章

  1. 微服务架构的四大金刚利器
  2. iOS App开发的那些事儿2:如何搭建合适的框架
  3. 基于Leaflet和GraphHopper实现离线路径规划
  4. asp.net linq查询环境搭建
  5. 研究一个新的功能的时候,如何获取该资源的文档
  6. primeNG DataTable中Templating ng-template标签报错
  7. Java集合(4)--List接口及其实现类ArrayList、LinkedList和Vector
  8. 北大提出Gate Decorator,利用LSTM思想来做CNN剪枝
  9. 大数据分析项目成功的五项基本原则
  10. R系列处理器是服务器,AMD全新R系列处理器领军嵌入式高性能领域
  11. 人脸识别系统_设计说明书
  12. ps计算机设置在哪,在哪里设置PS对称渐变工具
  13. There are unfinished transactions remaining解决办法
  14. 清华计算机学院博士后,清华大学博士后
  15. 那些著名的黑客事件 五
  16. 电商风控赛事亚军方案分享!
  17. UDP服务器开发与nb-iot模组通信(1)----协议篇
  18. pandas 选择满足特定条件的行
  19. 镇魔曲手游服务器维护,镇魔曲手游新闻资讯_《镇魔曲》手游4月12日更新维护公告_镇魔曲2.0季,不顾一切奔向你_《镇魔曲》手游官网...
  20. 需求、需求分析、设计 思想

热门文章

  1. 深入理解c#(第三版)(文摘)
  2. HTML5和CSS3响应式WEB设计指南译者序
  3. jquery 鼠标经过显示 信息小卡片
  4. c++ builder 读取指定单个名称节点的值
  5. Linux下undefined reference to ‘pthread_create’问题解决 zz
  6. 如何处理异常? catch Exception OR catch Throwable
  7. 在使用postman中操作api接口测试403解决方法
  8. 【已解决】关于SQL2008 “不允许保存更改。您所做的更改要求删除并重新创建以下表。您对无法重新创建的标进行了更改或者启用了‘阻止保存要求重新创建表的更改’” 解决方案
  9. fatal: You are not currently on a branch. 问题解决
  10. element el-input 自动获取焦点和IE下光标位置解决方法