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电路结构
  • 小结
    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口的外部电路已经设置了上下拉电路,那么我们内部上拉还是下拉就可以不设置了。
    • 上拉电阻的目的是为了保证在无信号输入时输入端的电平为高电平,且在信号输入为低电平时输入端的电平应该也为低电平。如果没有上拉电阻,在没有外界输入的情况下输入端是悬空的,它的电平是未知的无法保证的。同理,下拉电阻的目的是为了保证无信号输入时输入端的电平为低电平,且在信号输入为高电平时输入端的电平也为高电平。
相关推荐
学习噢学个屁1 小时前
基于51单片机的红外人体感应报警器
c语言·单片机·嵌入式硬件·51单片机
技术干货贩卖机3 小时前
0基础 | STM32 | STM32F103C8T6开发板 | 项目开发
stm32·单片机·嵌入式硬件·源代码·项目开发·0基础
2401_888859715 小时前
STM32 USART串口
stm32·嵌入式硬件
zhugedz5 小时前
开关电源原理
单片机·嵌入式硬件
河湾边的一亩三分地5 小时前
STM32 PulseSensor心跳传感器驱动代码
stm32·单片机·嵌入式硬件
学生小羊6 小时前
[C++] 小游戏 决战苍穹
c++·stm32·单片机
mftang6 小时前
zephyr OS架构下构建Nordic MCU boot
单片机·嵌入式硬件
百里东风6 小时前
STM32外设-GPIO输出(不含复用)
c语言·stm32·单片机·嵌入式硬件
菜只因C6 小时前
深入探索 51 单片机:从入门到实践的全面指南
单片机·嵌入式硬件