STM32单片机学习(10)——GPIO输入
2026/5/14 17:20:43 网站建设 项目流程

文章目录

  • 概述
  • 引脚输入模式下的电路分析
    • 施密特触发器
    • 上拉输入模式
    • 下拉输入模式
    • 浮空输入模式
    • 扩展:上拉电阻和下拉电阻的作用
  • 总结:基于标准库开发的一般流程
  • 附录:GPIO外设配置的参数表

概述

我们已经学习了GPIO的两种通用输出模式:

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

输出模式还有两种复用模式:

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

这两个模式我们暂时还用不到,所以这里我们先跳过,后面用到的时候再讲解。

除了输出模式,GPIO还有四种输入模式,分别是:

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

其中模拟输入模式不常用且暂时也用不到,本章节就只讲最常用的三种输入模式,上拉、下拉以及浮空输入模式。
有个小细节可以留意下:输入模式没有通用复用之分!
当然一开始看到这些输入模式的名称,肯定是很懵逼的,但没有关系,下面我们慢慢学习。

引脚输入模式下的电路分析

在讲解GPIO通用输出的时候,我们已经看过IO引脚的电路图了,如下所示:

这一次我们不再关心这张图中输出模式部分的电路,而是专注关注输入部分的电路,于是我们得到下面简化的电路:

这张简化的电路图其实还可以进一步简化,从上拉、下拉两个电阻开始,到施密特触发器这部分的电路组成了电平转换电路。

要想弄清楚GPIO的输入模式,首先就要弄清楚这个电平转换电路,下面我们来讲解这个电平转换电路。

施密特触发器

施密特触发器是电平转换电路的核心器件,我们先来简单了解一下。

简单来说,施密特触发器会把输入的连续的、模拟电压信号,转换成高低电平的1和0数字信号,并写入输入数据寄存器。

也就是说施密特触发器是一种将模拟信号转换成数字信号的一种元器件。

具体来说,施密特触发器有两个核心关键的参数:

正向阈值电压Vt+: 当输入电压大于Vt+时,施密特触发器输出高电平,也就是向输入数据寄存器写1。
负向阈值电压Vt-:当输入电压小于Vt-时,施密特触发器输出低电平,也就是向输入数据寄存器写0。
也就是说:

当输入电压从0V开始一直持续上升,在上升到正向阈值电压Vt+之前,施密特触发器始终输出低电平。只有当输入电压超过Vt+时,输出才变为高电平。
当输入电压从Vt+开始一直持续下降,在下降到负向阈值电压Vt-之前,施密特触发器始终输出高电平。只有当输入电压低于Vt-时,输出才变为低电平。
其工作原理可以参考这张图:

这样施密特触发器就不仅实现了模数转换,还巧妙避免了因输入电压的抖动变化导致的输入数据寄存器中的0/1的抖动变化。

上拉输入模式

当我们将IO引脚配置为上拉输入模式时,上拉电阻部分的开关就会闭合,上拉电阻接入电路。
而下拉电阻部分的开关并不会闭合,此时下拉电阻就没有接入电路,所以这个电路图,可以再简化一下:

上面我们已经讲过施密特触发器的作用了,那么电路中的这个上拉电阻有什么作用呢?

上拉电阻的主要作用是为引脚提供一个默认的高电平输入,即便引脚未连接任何有效的外部信号源。

上拉电阻一端连接电源Vdd,另一端连接引脚,通过闭合的开关构成通路。

此时电流从电源经过上拉电阻流向引脚,使得引脚的输入电压接近电源电压,呈现高电平状态,此时输入数据寄存器中的值就是高电平"1",这种设计就避免了引脚处于悬空状态而导致的电平不确定(或者电平的反复横跳)。

由于上拉电阻的阻值很大,Vdd电压也不高(3.3V),上拉支路中的电流十分微弱。

当 GPIO 引脚外部由强驱动能力的电路(如推挽输出)稳定输出高或低电平时,电平主要由外部电路决定。

上拉电阻几乎不影响电平状态,其作用通常可忽略不计。

总之,当引脚设置为上拉输入模式时:

  1. 若引脚输入了高电平,此时读取输入数据寄存器,可以读到代表高电平的"1"信号。
  2. 若引脚输入了低电平或者引脚接地,此时读取输入数据寄存器,可以读到代表低电平的"0"信号。
  3. 若引脚处于悬空状态,无外部信号输入时,由于上拉电阻的影响,此时读取输入数据寄存器,仍然可以读到代表高电平的"1"信号。

什么时候使用上拉输入模式呢?

希望IO引脚悬空,外部电路断开时,引脚具有默认的高电平时都可以使用上拉输入模式。

下拉输入模式

弄清楚了上拉输入模式,那么下拉输入模式就是大同小异的。

当我们将IO引脚配置为下拉输入模式时,下拉电阻部分的开关就会闭合,下拉电阻接入电路。而上拉电阻则不会接入电路,此时电路图可以简化成下图:

在这个电路中,下拉电阻的主要作用是为引脚提供一个默认的低电平输入,即便引脚未连接任何有效的外部信号源。

下拉电阻的一端接地,另一端连接引脚,当引脚悬空时,下拉电阻使引脚电位接近地电平,呈现低电平状态。

此时输入数据寄存器就能够得到一个稳定的电平信号"0",这种设计就避免了引脚处于悬空状态而导致的电平不确定(或者电平的反复横跳)。

由于下拉电阻阻值也非常大,其下拉支路中形成的电流也非常小。

当 GPIO 引脚由强驱动电路(如推挽输出)稳定输入高电平或低电平时,电平由外部主导,下拉电阻对引脚输入电平的影响可以忽略。

总之,当引脚设置为下拉输入模式时:

  1. 若引脚输入了高电压,此时读取输入数据寄存器,可以读到代表高电平的"1"信号。
  2. 若引脚输入了低电压或者引脚接地,此时读取输入数据寄存器,可以读到代表低电平的"0"信号。
  3. 若引脚处于悬空状态,无外部信号输入时,由于下拉电阻的影响,此时读取输入数据寄存器,仍然可以读到代表低电平的"0"信号。

什么时候使用下拉输入模式呢?

希望IO引脚悬空,外部电路断开时,引脚具有默认的低电平时都可以使用下拉输入模式。

浮空输入模式

若将IO引脚设置为浮空输入模式,那就更简单了。

浮空输入模式意味着上、下两个电阻都不会接入电路,那么直接将它们从电路中删除,浮空输入模式的简化电路图如下所示

此时引脚直接与施密特触发器相连,然后连接到输入数据寄存器,CPU 通过读取输入数据寄存器来获取引脚的输入状态信息。

此时引脚的电平状态完全由外部连接的电路决定,内部没有默认的上拉或下拉机制来设定默认引脚电平。也就是说:

  1. 如果外部电路稳定输入高电平,那么输入数据寄存器中存储的数据就稳定是1。
  2. 如果外部电路稳定输入低电平,那么输入数据寄存器中存储的数据就稳定是0。
  3. 如果外部电路是断路悬空的,那么外部的信号是无法确定的,此时输入数据寄存器中的数值是无意义的“垃圾值”。

浮空输入模式常用于需要检测外部电路真实电平状态,且外部电路能够提供稳定的高电平或低电平信号的场景。

比如外部电路是推挽输出的。

扩展:上拉电阻和下拉电阻的作用

在上面我们已经讲过,如果外部电路是强推挽输出,能够主动、稳定地推高和拉低电平:

那么无论是上拉电阻还是下拉电阻,其产生的影响都相对较小,在多数情况下可以忽略它们的作用。

你可以理解成:强推挽是一条壮汉,无论上拉电阻还是下拉电阻,都是一名弱女子,力量相比较于壮汉都还太弱小了。

但如果排除外界条件,只讨论它们本身对电路产生的影响,那差别就比较大了。

我们可以从两个角度来分析它们的不同。

第一,通俗的理解。

上拉的本质可以通俗理解成,给节点电路充电,或者说补充电荷。

下拉的本质可以通俗理解成,给节点电路放点,或者说释放电荷。

很浅显的道理:

放电总比充电容易多了。

所以下拉往往更容易对电路产生影响。

比如电路本身是输出高电平的,接入一个下拉电阻,有可能就会使得电路不能稳定输出高电平。

反之,上拉电阻要想实现上拉是很困难的。

比如电路本身输出低电平,好比电路中完全没电,现在接一个上拉电阻,指望上拉电阻把这个低电平拉成高电平,是几乎不可能的。

第二,我们也可以从较专业的角度理解。

在前面的课程中,我们讲过高低电平,本身是一个范围,存在一个阈值。《数据手册》中对此描述如下:

低电平的范围是:-0.5V ~ 0.8V,阈值是0.8,低于0.8V都视为低电平。

高电平的范围是:2V ~ 3.8V,阈值是2,高于2V都视为高电平。

假如,电路输出3.3V,输出高电平,此时接入下拉电阻,只需要把输出电压拉到2V以下,就不再是稳定高电平状态了。

反之,电路接地输出低电平0V,此时接入上拉电阻,需要把电压拉到2V才可能变成变成高电平,这显然困难多了。

总结:

  1. 在电路中接入一个上拉电阻,不会影响电路原本的高电平状态,也很难破坏电路本来的低电平状态。
  2. 在电路中接入一个下拉电阻,不会影响电路的低电平状态,却可能破坏电路本身的高电平状态。

对于实践使用的建议:

  1. 上拉电阻,以及对应的上拉输入模式,在使用时可以更随意一些、使用场景也更广泛一些。
  • 因为上拉电阻的作用就是在电路断路时,提供稳定高电平,其余情况下作用不明显。
  • 很多时候,只要能用浮空输入,往往也能用上拉输入。
  1. 下拉电阻,以及对应的下拉输入模式,在使用时则要更加小心谨慎。

因为下拉电阻除了可以在电路断路时提供稳定低电平外,还可能破坏原本电路的高电平状态。

总结:基于标准库开发的一般流程

结合我们已实现的各种实验的经验,基于STM32标准库开发的一般流程可以总结为以下几个步骤:

  1. 必要的准备工作。包括:

    • 软件部分:安装Keil5软件、创建Keil5标准库开发工程模板、必要的设置等。
    • 硬件部分:STM32F103C8T6开发板、面包板以及其它实验必要的硬件。
  2. 在Keil5中新建工程用于编写实验代码、硬件部分则按照接线图在面包板上接好。

  3. 尝试编写第一版代码:

    • 开启相应外设时钟,不需要的时钟则不需要开启。
    • 配置相关引脚工作模式,输出模式下还需要选择引脚输出速度。
    • 编写实现功能的应用程序,以控制相应外设,一般就是通过控制和操作引脚来控制操作外设。
  4. 烧录程序到单片机,观察外设是否按预期工作。

  5. 调试、优化以及各种修改。

附录:GPIO外设配置的参数表

在设置、初始化GPIO外设引脚时,需要调用到一系列标准外设库函数。

这些库函数的传参参数都是比较固定的,它们有些是基于宏定义的,有些是基于枚举值的,这里列出一个GPIO外设配置的参数表,供大家参考。

每当你忘记了某个函数的传参格式时,就可以参阅这张表。当然除了GPIO外设,其它外设的配置函数,也往往能够用到这些参数。

引脚编号(Pin)宏定义GPIO_Pin_0~GPIO_Pin_15
引脚工作模式(Mode)枚举 (GPIOMode_TypeDef)浮空输入模式:GPIO_Mode_IN_FLOATINGFLOATING就是浮空的意思
下拉输入模式:GPIO_Mode_IPDIPD即Input Pull-Down下拉输入
上拉输入模式:GPIO_Mode_IPUIPU即Input Pull-Up上拉输入
开漏输出模式:GPIO_Mode_Out_ODOD即Open-Drain 漏极断开即开漏
推挽输出模式:GPIO_Mode_Out_PPPP即Push-Pull推拉、推挽的意思
复用开漏模式:GPIO_Mode_AF_ODAF即Alternate Function意为备用方案
复用推挽模式:GPIO_Mode_AF_PPAF即Alternate Function意为备用方案
引脚输出速度(Speed)枚举 (GPIOSpeed_TypeDef)GPIO_Speed_10MHz
GPIO_Speed_2MHz
GPIO_Speed_50MHz
GPIO 端口(Port)宏定义GPIOA~GPIOG常用A ~ C
GPIO外设时钟宏定义RCC_APB2Periph_GPIOA~RCC_APB2Periph_GPIOG常用A ~ C
外设时钟开闭/开启控制宏定义开启时钟:ENABLE
关闭时钟:DISABLE
向寄存器写0/1枚举 (BitAction)写0:Bit_RESET
写1:Bit_SET

相信你后面会经常用到这个表格的,每次忘了就查一查,查多了自然全部都记住了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询