深刻理解GPIO(上拉输入、下拉输入、模拟输入、浮空输入,开漏输出,推挽输出的区别,以STM32为例)

2023-11-02

前言

学习了这么久的单片机,说来羞愧,直到写这篇文章之前,我都没有仔细去理解GPIO的八种使用模式,之前只是傻傻的用着,直到把模电,数电学完,到今天重新回顾了一遍这一个知识,发现自己终于看懂了之前没有理解透彻的知识,特此总结下来。

GPIO是什么

从最基础的51单片机,Arduino,到STM32,树莓派等等,这些上面都会有GPIO口这么一个概念,如果你点开了我这个博客,说明你大概率开始学习单片机,那么你应该了解的就是这些口可以输出高低电平,或者是读取引脚上的输入电平。
GPIO的总述功能如下

GPIO(general porpose intputoutput):通用输入输出端口的简称。可以通过软件控制其输出和输入。stm32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通信,控制以及数据采集的功能。
———GPIO简介

下面摆一张以STM32内部GPIO口为例的内部原理图,大伙也不要着急,先有一个这个图的概念,下面就是开始讲怎么理解GPIO口。
在这里插入图片描述

先来一点最基础的知识
上拉和下拉:
当我们闭合上拉电阻的开关,断开下拉电阻的开关的时候,也就是此时为上拉通路导通。根据我们最基础的电路知识,如果I/O口断开不接外设,或者接了外设但是电路也断开,此时整条回路是断路的时候,电阻相当于不存在,此时O点的电位,也就被钳制在了VDD(供电电压正极),于是O点就处于高电平。
同理,闭合上拉电阻的开关,断开下拉电阻的开关,那么在电路断开的时候,根据电路知识,电阻相当于不存在,O点的电压就就被钳制在了VSS(GND),也就是O点处于低电平。
数字信号和模拟信号
数字信号:就是根据一些规则,将一个范围内的电压规定为1,一个范围内的电压规定为0,也就是一连串的0,1信号
模拟信号:就是连续的读取到的电压值。
关于图上的TTL施密特触发器和P-MOS和N-MOS,后面讲到对应部分的时候会讲到。

GPIO的八大模式

GPIO可以分为输入或者输出,加起来一共有八种模式。

输入模式

在输入模式下,一共有四种输出模式,分别是

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

浮空输入

在这里插入图片描述
浮空输入需要走的路径如图所示。首先得知道,浮空输出走的这一条路径,是对一个数字信号的读取。
需要的电路如下:
VDD和VSS所在路径的两个开关同时断开。此时没有上拉和下拉的情况,所以当IO口没有接输入的时候,此时的电平会是一个不确定的值,也就是我们所说的浮空。电平会处于一个跳变的状态,一会高,一会低。只有输入了一个高/低电平才会确定下来。
注意:上拉和下拉电阻电路的开关在实际应用中一般使用MOS管来代替开关来提到。
再往前面走,就是走到了TTL施密特触发器这一个部分。我们知道,由于电源的特性,或者是由于外部开关输入的特性,输入的数字信号,极有可能会出现脉冲等噪声的影响,为了让我们的波形更好看,或者信号更加清晰,所以就设置了TTL施密特触发器这个东西。经过之后,我们就会把这个数字信息存储在输入数据寄存器中。
这样我们就读到了IO过来的数字信号

优势:这一种输入模式的电平会完全取决于外部电路而与内部电路无关。有时候会用作对开关按键的读取。

但是在没有外部电路接入的时候,IO脚浮空会使得电平不确定

上拉输入

在这里插入图片描述
上拉输入需要走的路径如图所示。首先得知道,上拉输出走的这一条路径,是对一个数字信号的读取。
需要的电路如下:
VDD所在上拉电阻开关闭合,下拉电阻的开关断开。
根据前面浮空输入里面所提的,在没有信号输入的时候,根据电路知识,此时的电平就是VDD的电平,此时读取到的电平就是高电平。如果输入了一个高电平,VDD和O点(最上面的图中的O点)之间就几乎没有电势差,此时O点的电平就仍然是高电平,读取到的电平就是高电平。但是由于在没有电压输入的时候,电平也是高电平,所以这一种输入情况下是没有办法确定信号是否输入了。
当输入信号是一个低电平的时候,此时O点的电平的电平就会变成低电平,那么VDD和O点之间形成了电势差,但是因为上拉电阻的存在,所以不会出现一个大电流。此时单片机读取到的一个电平就是一个低电平。在上拉输入的情况下,低电平的是能够非常明显的读取到的。
上拉输入的好处就是输入的电平不会上下浮动而导致输入信号不稳定,在没有信号输入的情况下可以稳定在高电平。

下拉输入

在这里插入图片描述
下拉输入需要走的路径如图所示。首先得知道,下拉输出走的这一条路径,是对一个数字信号的读取。
需要的电路如下:
VDD所在上拉电阻开关断开,下拉电阻的开关闭合。
根据前面浮空输入里面所提的,在没有信号输入的时候,根据电路知识,电平就是VSS的电平,此时读取到的电平就是低电平。此时输入的电平如果是一个低电平,就没有办法和之前的情况进行区分。但如果输入的是一个高电平,O点和VSS之间同样形成了电势差,O点的电平会变成外部的高电平,那么单片机得到的就是一个高电平信号。
下拉输入的好处就是输入的电平不会上下浮动而导致输入信号不稳定,在没有信号输入的情况下可以稳定在低电平。

模拟输入

在这里插入图片描述
模拟输入需要走的路径如图所示。首先得知道,模拟输出走的这一条路径,是我们需要对一个模拟信号进行读取。
在我们使用单片机的时候,我们有时候需要用AD采集到IO口上面的真实电压。这就有了我们所需要的模拟输入。为了让外部的电压真实的读取到单片机的AD模块,我们既不能闭合上拉和下拉的开关,也不能让信号经过施密特触发器。

优势:可以让AD读取电压。还可以在低功耗模式下运行,实现省电的作用。

输出模式

在输出模式下,同样也有四种输出模式,分别是

  • 开漏输出
  • 推挽输出
  • 复用开漏输出
  • 复用推挽输出

开漏输出

在这里插入图片描述
④⑤⑥⑦是读取的过程,此处不管。
开漏输出的电路路径是①②③④,②前面的步骤就是一个对输出信号的控制,不是重点,开漏输出里面最重要的是③,也就是N-MOS这一部分,下面来补充一下模电知识。
在这里插入图片描述
我们可以把这一个MOS管当成一个三极管,对于图中所示的这种三极管我们可以简单的理解成一个水龙头,左侧就是一个水龙头开关,当给一个高电平的时候, O点和GND就会导通。(O点的输出就是一种反向器的输出,也就是O点的电平会和左侧MOS的栅极(三极管的基极)相反)
所以说,开漏输出就很好理解了。当我们给一个低电平的时候,MOS管关闭,此时输出的电压就是一个浮空,即不确定的电压。如果给一个高电平,那么MOS管导通,相当于IO口与VSS相连,此处就输出了一个低电平电压。
优势①
虽然我们可以看到开漏输出是没有办法在内部输出一个高电平,但是这一个看似是缺点。其实实际上是一种优点。我们可以得到,当给一个低电平的时候,MOS管没有导通,此时电压不确定导致无法输出高电平,但是一旦我们在外部增加一个上拉,那么这一个缺点就会被有效避免。并且,因为是我们自己设计一个上拉,这个上拉的电压是由我们自己确定,这样我们就可以根据外部电路需要多少V的高电平来给这一个上拉的电压,可以更好的适应更多情况。如下图,我们可以给定任意的VDD电压,来适应我们实际所需要的情况。
在这里插入图片描述
优势②
开漏输出的实质其实就是一个OD门(OD:漏极输出(Open Drain))。而在数电中,OD门有一个非常重要的特性就是可以实现线与的功能,简单来说,就是在像IIC这样的总线协议中,只要有一个给低电平,那么总线都会被拉低。

推挽输出

在这里插入图片描述
推挽输出就是可以需要利用两个不同的MOS管来实现输出。
P-MOS和N-MOS是不同的控制方式,当给一个高电平的时候,N-MOS导通,P-MOS不导通 订正:N-MOS不导通,P-MOS导通,此时IO口接通在VSS VDD,此时输出的是高 电平。当给一个低电平的时候,P-MOS导通,N-MOS导通 N-MOS导通,P-MOS不导通,此时IO口接通在VDDVSS 电源上面,此时输出的是低电平。
一定要把这个MOS管理解成开关控制的水龙头!!!
优势
带载能力强。

复用开漏输出

复用推挽和复用开漏其实很简单,在你理解了开漏和推挽的原理之后,如果你不想用单片机内部来输出,那么你可以进行复用,将输出转移到其他外设上面
在这里插入图片描述

复用推挽输出

在这里插入图片描述

GPIO的输出速率

在这里插入图片描述
GPIO还有一个十分重要的概念,也就是响应速度,相应速度是指,当你的电平需要改变的时候,这个改变的时间需要多少。如果你对这个时间要求十分严格,那么一定要使用高输出速率的IO口。反之则反。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深刻理解GPIO(上拉输入、下拉输入、模拟输入、浮空输入,开漏输出,推挽输出的区别,以STM32为例) 的相关文章

  • 在地址“0xXXXXXX”处中断,没有可用的调试信息,或在程序代码之外

    配置 使用 Nucleo L476RG 使用 GNU ARM Eclipse 我从 STM32CubeMX 生成了一个极简代码 我已经在我的板载 ST Link 中刷新了 J link 驱动程序 一直在尝试为我的代码运行调试器 但我的程序计
  • c项目makefile多重定义错误

    这个问题是一个对应于创建的repexthis问题 在我的嵌入式 C 项目中 我有两个独立的板 我想为每个板创建两个 c 文件 master c 和 Slave c 其中包含自己的特定main 功能 我使用 stm32cumbemx 生成带有
  • 在没有 IDE 的情况下如何使用 CMSIS?

    我正在使用 STM32F103C8T6 并想使用 CMSIS 这本质上只是寄存器定义 没有代码 让我的生活更轻松 同时仍保持在较低水平 问题是我不知道如何安装该库以便在命令行上使用 Makefile 使用 所有文档似乎都与特定于供应商的 I
  • GCC - 如何停止链接 malloc?

    我正在努力将我的代码缩减到最小的骨架大小 我使用的是只有 32k 闪存的 STM32F0 需要很大一部分闪存用于数据存储 我的代码已经有大约 20k 闪存大小 其中一些是由于使用了 STM32 HAL 函数 我可以在以后需要时对其进行解释和
  • STM32 F072上的软件如何跳转到bootloader(DFU模式)?

    STM32应用笔记2606对此进行了讨论 但没有简单的代码示例 该答案已使用 IAR EWARM 在 STM32F072 Nucleo 板上进行了测试 这个答案使用 STM32标准外设库 仅此而已 请注意 验证您是否成功进入引导加载程序模式
  • 133-基于stm32单片机停车场车位管理系统Proteus仿真+源程序

    资料编号 133 一 功能介绍 1 采用stm32单片机 4位数码管 独立按键 制作一个基于stm32单片机停车场车位管理系统Proteus仿真 2 通过按键进行模拟车辆进出 并且通过程序计算出当前的剩余车位数量 3 将剩余的车位数量显示到
  • 135-基于stm32单片机超声波非接触式感应水龙头控制系统Proteus仿真+源程序

    资料编号 135 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 电机 超声波传感器 制作一个基于stm32单片机超声波非接触式感应水龙头控制系统Proteus仿真 2 通过DHT11传感器检测当前
  • 匹配 STM32F0 和 zlib 中的 CRC32

    我正在研究运行 Linux 的计算机和 STM32F0 之间的通信链路 我想对我的数据包使用某种错误检测 并且由于 STM32F0 有 CRC32 硬件 并且我在 Linux 上有带有 CRC32 的 zlib 所以我认为在我的项目中使用
  • STM32F103

    提示 来源正点原子 参考STM32F103 战舰开发指南V1 3PDF资料 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 开发环境硬件普中科技 接线图在g
  • HAL库学习

    CMSIS简介 CMSIS Cortex Microcontroller Software Interface Standard 微控制器软件接口标准 由ARM和其合作的芯片厂商 ST NXP 软件工具厂商 KEIL IAR 共同制定的标准
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • 毕设开题分享 单片机智能教室系统(智能照明+人数统计)

    1 简介 Hi 大家好 今天向大家介绍一个学长做的单片机项目 单片机智能教室系统 智能照明 人数统计 大家可用于 课程设计 或 毕业设计 项目分享 https gitee com feifei1122 simulation project
  • Freertos低功耗管理

    空闲任务中的低功耗Tickless处理 在整个系统运行得过程中 其中大部分时间都是在执行空闲任务的 空闲任务之所以执行 因为在系统中的其他任务处于阻塞或者被挂起时才会执行 因此可以将空闲任务的执行时间转换成低功耗模式 在其他任务解除阻塞而准
  • 库函数点亮Led

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 例如 随着人工智能的不断发展 机器学习这门
  • STM32H5 Nucleo-144 board开箱

    文章目录 开发板资料下载 目标 点亮LD1 绿 LD2 黄 和LD3 红 三个LED灯 开箱过程 博主使用的是STM32CubeMX配置生成代码 具体操作如下 打开STM32CubeMX File gt New project 选择开发板型
  • systick定时器

    systick定时器 文章目录 前言 一 前期疑惑 二 解答 1 关于systick是阻塞的吗 2 非阻塞 三 软件编写 总结 前言 这边记录systick相关知识点 一 前期疑惑 在学习systick志气啊 其实对于systick还是一脸
  • HAL_Delay() 陷入无限循环

    我被 HAL Delay 函数困住了 当我调用此函数 HAL Delay 时 控制陷入无限循环 在寻找问题的过程中 我发现了这个 http www openstm32 org forumthread2145 threadId2146 htt
  • 使用 STM32 USB 设备库将闪存作为大容量存储设备

    我的板上有这个闪存IC 它连接到我的STM32F04 ARM处理器 处理器的USB端口可供用户使用 我希望我的闪存在通过 USB 连接到 PC 时被检测为存储设备 作为第一步 我在程序中将 USB 类定义为 MSC 效果很好 因为当我将主板
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能
  • STM32F4 定时器 - 计算周期和预分频,以生成 1 ms 延迟

    我在用STM32F407VGT6 with CubeMX 因此 我从通用定时器开始 但我被预分频值和周期值所困扰 基本上我想每隔一段时间生成一个定时器中断n 其中 n 1 2 3 ms 并执行一些任务 计算周期和预分频值的公式有很多变化 公

随机推荐

  • java简单五子棋源代码

    package com renyou import java awt Color import java awt Dimension import java awt FlowLayout import java awt Graphics i
  • 与ln的指数转化公式_指数函数与对数函数的转换

    有时对数运算比指数运算来得方便 因此以指数形式出现的式子 可利用取对数的方法 把指数运算转化为对数运算 用高等数学计算的老旧的纹理古文纸 解题技巧 转化的思想是一个重要的数学思想 对数式与指数式有着密切的关系 在解决有关问题时 经常进行着两
  • Hive 调优总结

    1 通常 可以通过设置属性hive map aggr值为true来提高聚合的性能 hive map aggr true 这个设置会触发在map阶段的 顶级 聚合过程 非顶级的聚合过程将会在执行一个GROUP BY后进行 不过这个设置将需要更
  • Mybatis-Plus(一)

    Mybatis Plus 一 最近在项目当中学习到了一种新的构建sql查询的技术 mybatis plus 相交与之前使用的example即先创建一个example对象 再根据这个对象创建一个criteria对象来说 这种方式更为简洁方便
  • HTTP基本概念

    文章目录 一 概念 二 请求消息数据格式 一 概念 Hyper Text Transfer Protocol 超文本传输协议 传输协议 定义了 客户端和服务器端通信时 发送数据的格式 特点 基于TCP IP的高级协议 默认端口号 80 基于
  • 2023面试题记录

    1 js怎么判断对象为空 判断对象是否为空的一个简单方法是检查对象的所有可枚举属性 如果一个对象没有可枚举属性 那么我们可以认为它是空的 你可以使用 Object keys 函数来获取对象的所有可枚举属性 然后检查得到的数组的长度 如果长度
  • C++socket编程(三):3.4 listen监听

    1 在端口成功绑定了之后 我们并没有开始真正接收用户的连接信息 2 所以我们应该用到listen函数开始进行监听 收到信息才看是接收数据 linux中我们可以用如下命令进行连接测试 telnet ip 端口号 那么我的linux中命令就是
  • C语言预处理详解

    目录 一 预定义符号 二 define 1 define 定义标识符 2 define定义宏 3 define的替换规则 4 和 lt 4 1 gt 的使用 lt 4 2 gt 的作用 5 带副作用的宏参数 6 宏和函数的对比 7 命名约定
  • STM32学习----RS232串口通讯

    一 RS232相关概念 RS Recommend Standard 推荐标准 232 标识号 第232号 时间 1962年 地点 美国 人物 美国电子工业协会 Electronic Industries Association 美国 电子工
  • okhttp RealCall hook 不影响请求回调的取数据方式

    由于body string 只能调用一次的原因 如果直接使用该方法取数据则会影响整个App的数据请求 改写成如下方式即可 BufferedSource source responseBody source source request Lo
  • ChatGPT指令大全(建议收藏)

    ChatGPT写报告 报告开头 我现在正在 报告的情境与目的 我的简报主题是 主题 请提供 数字 种开头方式 要简单到 目标族群 能听懂 同时要足够能吸引人 让他们愿意专心听下去 例 我现在正在修台大的简报课 其中一项作业是要做一份让小学生
  • uni-app支持vue3(小程序、h5、app等)多端开发

    一 初始化uni app项目 这里使用cli方式用命令行创建Vue3 Vite版 详细请参考官网 1 创建以 javascript 开发的工程 npx degit dcloudio uni preset vue vite my vue3 p
  • 微信小程序 遇到的一些坑【MacOS + 微信开发者工具】 更新于20230321

    微信小程序 遇到的一些坑 MacOS 微信开发者工具 更新于20230321 1 已被代码依赖分析忽略 无法被其他模块引用 你可根据控制台中的 代码依赖分析 告警信息修改代码 或关闭 过滤无依赖文件 功能 2 代码检查 组件按需注入 未通过
  • Rust入门基础:attribute

    Anonotaion 常译为注解 Java中的 Annotation Annotation public void foo Function body java中的Annotation主要用于提供元数据来对代码进行附加描述 它可以在编译 类
  • 博途运行软件仿真步骤

    1 程序和启动 1 1 程序 仿真前肯定是要有一段编译无错的程序 这里提示一个点 因为是软件仿真 所以像I0 0和Q0 0这种PLC上实体化的IO接口 在程序 软件仿真过程中是无法修改状态的 如果只是为了学习 建议触点和线圈均用M10 0这
  • JAVA 日志级别

    log4j定义了8个级别的log 除去OFF和ALL 可以说分为6个级别 优先级从高到低依次为 OFF FATAL ERROR WARN INFO DEBUG TRACE ALL 级别 名称 说明 ALL 最低等级的 用于打开所有日志记录
  • Win10下安装配置使用WSL2

    Win10 下安装配置WSL2 1 检查更新 win10 版本 在cmd中使用winver命令来检查当前win的版本 如果版本太低 可以在 设置 更新和安全 Windows 更新中更新 但是有时候会没有提示能更新到最新的版本 那就可以使用微
  • 文档处理之去停止词和IF-IDF

    声明 作者是初级学习者如果算法实现错误 或者编程不规范请各位指正 在这谢谢大家了 一 TF 定义为词频 一篇文章中某个词出现的次数 这个次数一般会进行归一化 分子小于分母 因为如果单纯的运用这个次数 篇幅长的文章会比篇幅短的次数多 二 ID
  • C++中的floor()函数

    y floor x 则y等于 不大于x的最大整数 详细参考 http www cplusplus com reference cmath floor
  • 深刻理解GPIO(上拉输入、下拉输入、模拟输入、浮空输入,开漏输出,推挽输出的区别,以STM32为例)

    目录 前言 GPIO是什么 GPIO的八大模式 输入模式 浮空输入 上拉输入 下拉输入 模拟输入 输出模式 开漏输出 推挽输出 复用开漏输出 复用推挽输出 GPIO的输出速率 前言 学习了这么久的单片机 说来羞愧 直到写这篇文章之前 我都没