当前位置: 首页 > web >正文

GPIO引脚的上拉下拉以及转换速度到底怎么选

【摘要】本文讲述在进行单片机开发当中,新手小白常常为GPIO端口的种种设置感到迷惑,例如到底设置什么模式?它们之间的区别是什么?到底是设置上拉还是下拉电阻,有什么讲究?端口的输出速度又该如何设置?如果你有以上疑惑,本文通过电路底层原理统统告诉你问题答案。

  1. GPIO基础知识
    • STM32 的 IO 口可以由软件配置成如下8 种模式
      • 浮空输入:如下图②所示,两个上/下拉电阻开关均断开,I/O引脚直接连接TTL肖特基触发器,此时I/O引脚浮空,读取的电平是不确定的,外部信号是什么电平,MCU引脚就输入什么电平。MCU复位上电后默认为此状态
      • 上拉输入:如下图②所示,VDD经过开关、上拉电阻,连接外部I/O引脚。当开关闭合,外部I/O无输入信号时,默认输入高电平。典型应用是外接按键并接地,当没有按键按下时候,MCU的引脚为确定的高电平,当按键按下时候,引脚电平被拉为低电平。
      • 下拉输入:如图 ②所示,Vss经过开关、下拉电阻,连接外部I/O引脚。当开关闭合,外部I/O无输入信号时,默认输入低电平。
      • 模拟输入:如下图 ②所示,两个上/下拉电阻开关均断开,同时TTL肖特基触发器开关也断开,引脚信号直接
        连接模拟输入,实现对外部信号的采集。
      • 开漏输出:开漏结构可以看作只连接了一个N-MOS管,“输出控制”输出1,N-MOS管导通,引脚被拉低至0;“输出控制”输出0,N-MOS管截至,引脚电位完全由外面电路控制(引脚必须配置上拉电阻才能输出1)。
      • 推挽输出:推挽结构由两个MOS管按互补对称的方式连接,任意时刻总是其中一个三极管导通,另一个三极管截
        止,“输出控制”变为了VDD/Vss输出。
      • 推挽复用:GPIO引脚除了作为通用输入/输出引脚使用外,还可以作为片上外设(USART、I2C、SPI等)专用引脚,即一个引脚可以有多种用途,但同一时刻一个引脚只能使用复用功能中的一个。
      • 开漏复用:同开漏输出,该模式下需要上拉电阻才行,否则不能输出1。
    • GPIO电路结构 GPIO电路结构
  • 小结
    1. 推挽输出无需外接上下拉电路就可以直接输出高低电平,且输出电流较大(25mA左右),提高了电路的负载能力和开关的动作速度。
    2. 开漏输出模式需要配置(内接或外接)上拉电阻才能输出高电平,但也恰恰可以通过外接的电源提供比推挽输出更大的驱动电流(推挽结构中的Vdd是3.3V,但开漏结构下外接上拉电源可设置为5V)。需要注意的是,当采用内部上拉时,由于上拉电阻较大(20~50K欧),仅能提供小电位(3.3V)小电流(50uA)和慢电平转换速度(2MHz),仅适用于IIC等低速低功耗通信的场合。另外,多个开漏的引脚可以直接并在一起使用,统一接一个合适的上拉电阻,就可以实现“逻辑与”关系,即当所有引脚均输出高电平时,输出才为高电平,若任一引脚输出低电平,则输出低电平。在I2C、SMBUS等总线电路中经常会用到。
    3. GPIO引脚除了作为通用输入/输出引脚使用外,还可以作为片上外设(USART、I2C、SPI等)专用引脚,即一个引脚可以有多种用途,但同一时刻一个引脚只能使用复用功能中的一个。
    4. STM32的I/O引脚工作在输出模式下时,需要配置I/O引脚的输出速度。该输出速度不是输出信号的速度,而是I/O口驱动电路的响应速度(STM32提供2MHz、10MHz、50MHz三个输出速度)。高速时,功耗高、噪声大、电磁干扰强;低速时,功耗低、噪声小、电磁干扰弱。 通常简单外设,比如LED灯、蜂鸣器灯,建议使用2MHz的输出速度,而复用为I2C、SPI等通信信号引脚时,建议使用10MHz或50MHz以提高响应速度。 但在使用HAL编程时常常能看到,明明引脚配置为输入模式,但还是有相关的引脚输出速度配置,此处仅仅是为了编译器语法的正确性,即使设置了实际电路中也不会生效。
  1. 那到底什么时候需要选择上拉、下拉或不拉呢
    • 首先看引脚方向。如果是输出引脚,那就无所谓上下拉,因为引脚是根据你的输出数据来确定高低的,此时由MCU提供电位,所以一般选择no pull,唯此才能进行正确输出。上拉下拉主要针对的是输入引脚。
    • 其次看电路设计。那么就需要看具体电路设计和引脚的空闲值或有效值是0还是1了。如果空闲值或无效状态(假设某引脚连接开关后接地,开关按下,引脚接地,状态为0,则0就是有效状态,1就是无效状态。)是输入0,则最好配置为pull down,反之则配置为pull up。
    • 最后看是否是模拟输入,如果是模拟输入,是不需要设置上下拉的,否则会干扰外界真实电位。
    • 所以,不管是上拉还是下拉,这样做的核心目的,主要是为了引脚在空闲时有一个稳定的电位或状态。举例来说,假设某输入引脚没有设置内部上下拉,同时外部电路在没有设计上下拉,在这种情况下,引脚是浮空的,它的电位状态是不确定的。有许多硬件工程师设计电路时,会在GPIO口的外部设计上下拉电阻,这和内部配置pull up/down是一个目的,且效果相同。

3.举例说明
- 比如单片机的I / O脚接一个按键的左端,按键的右端接正电源,那么我们就要设置I / O脚为下拉模式,因为这样才能使得按键按下去的时候,能把I / O脚拉高,不然设置上拉模式的话,即按键的功能等于摆设。同理,如果按键另一端接地,我们就要设置为上拉模式了。

  1. 总结
    • 一般来说,是否需要设置上下拉电路,需要区分这个GPIO口用于输入还是输出。如果是输出,通常情况下无需设置内部上下拉,除非是开漏输出,但一般也是外部上拉。若为输入,则需根据电路实际情况进行设置。例如,如果某IO口的外部电路已经设置了上下拉电路,那么我们内部上拉还是下拉就可以不设置了。
    • 上拉电阻的目的是为了保证在无信号输入时输入端的电平为高电平,且在信号输入为低电平时输入端的电平应该也为低电平。如果没有上拉电阻,在没有外界输入的情况下输入端是悬空的,它的电平是未知的无法保证的。同理,下拉电阻的目的是为了保证无信号输入时输入端的电平为低电平,且在信号输入为高电平时输入端的电平也为高电平。
http://www.xdnf.cn/news/4030.html

相关文章:

  • 使用注意力机制的seq2seq
  • Docker —— 隔离的基本操作(2)
  • ABAP 导入Excel形成内表
  • spring中的@ConfigurationProperties注解详解
  • 网星安全AWS攻防方案,重磅发布!
  • 机器学习模型训练模块技术文档
  • AVHRR中国积雪物候数据集(1980-2020年)
  • yolo 用roboflow标注的数据集本地训练 kaggle训练 comet使用 训练笔记5
  • FISCO BCOS【初体验笔记】
  • Python 闭包:函数式编程中的魔法变量容器
  • ciscn_2019_c_1
  • 普联的AC100+AP+易展路由组网方案的一些问题
  • docker介绍以及安装
  • sherpa-ncnn:Linux_x86交叉编译Linux_arm32上的sherpa-ncnn -- 语音转文本大模型
  • 蓝桥杯单片机备战笔记
  • 【中间件】brpc_基础_TimerThread
  • 五一假期作业
  • springboot单体项目的执行流程
  • LFU算法解析
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】4.5 清洗流程自动化(存储过程/定时任务)
  • 【中间件】brpc_基础_单例
  • FreeRTOS学习系列·二值信号量
  • Linux查询日志常用命令
  • 解锁现代健康密码:科学养生新主张
  • 基于PLC的换热器温度控制系统设计
  • 状态模式(State Pattern)
  • 电子商务商家后台运营专员模板
  • C++ 中二级指针的正确释放方法
  • 【KWDB 创作者计划】_Ubuntu 22.04系统KWDB数据库安装部署使用教程
  • Qt中的UIC