STM32 GPIO输入输出详解与实战讲解
目录
1.简介
GPIO(General Purpose Input Output)通用输入输出口
可配置为8种输入输出模式引脚电平:0V~3.3V,部分引脚可容忍5V(是指输入的电压可容忍5V)
输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等
2.基本结构
内核通过总线APB2对寄存器的某一位进行操作,从而对对应的引脚进行操作,比如设置寄存器的某一位为1,其对应的引脚就输出高电平。但是stm32是32位的,也就是某一寄存器是有32位的,但是图中一个GPIO模块的只有衍生出16根引脚,因此寄存器只有低16位是被使用到的
而驱动器,由于寄存器具有临时存储数据的能力,也就是只能输出0、1相关的数据,而想要实现点灯等操作则是需要驱动器去进行帮忙
3.位结构
3.1 保护二极管
首先是I/O引脚处的两个保护二极管,上面那一个接着Vdd,而下面那则接Vss,起着保护内部电路的作用,比如:
- 当I/O引脚输入了大于该引脚所能容忍的最大电压的时候,电流就会往接了Vdd的保护二极管流出,而不会流入电路中,导致电路被破坏
- 当I/O引脚输入过低,也就是低于Vss(注意是相对电压),电流就会流入接着Vss的保护二极管,不流入内部电路
3.2 上拉/下拉 – 输入
接着是上拉电阻(Vdd)和下拉电阻(Vss),各自有一个开关,是可以通过程序去进行配置的。上面的开关闭合、下面开关不闭合就是上拉输入模式;上面的开关不闭合、下面闭合就是下拉输入模式;两个都不闭合就是浮空模式
- 上拉输入模式:
- 下拉输入模式:
- 浮空模式:
上拉电阻和下拉电阻,其实就是为了给输入提供一个默认的输入电平。因为对于一个数字端口其输入不是低电平就是高电平,可是这个高电平和低电平是有参考标准的,也就是有上拉/下拉模式来决定,如果不是设置,怎么去知道这个输入电压是高电平还是低电平。
上拉电阻(Pull-up Resistor):

下拉电阻(Pull-down Resistor):

上拉和下拉电阻的阻值通常较大(如10kΩ、20kΩ等),以避免对输入信号造成显著影响。在大多数应用中,这样的阻值足以提供稳定的电平,同时不会显著消耗电流。
为什么要有上拉/下拉呢?????
防止浮空状态:
提高抗干扰能力:
设计灵活性:
简化后的电路图如下:
3.3 施密特触发器 – 输入
施密特触发器可作为波形整形电路,能将模拟信号波形整形为数字电路能够处理的方波波形,而且由于施密特触发器具有滞回特性,所以可用于抗干扰,其应用包括在开回路配置中用于抗扰,以及在闭回路正回授/负回授配置中用于实现多谐振荡器。
信号传输的时候肯定是有失真现象产生的,如果输入进来的电压产生了失真,那么是不太好去转换为数字信号从而去辨别是1、0的。什么是失真???以数字信号为例子,看下图:
可以看出当信号传输的时候发生严重失真的时候,是很难去辨别的。而如果是模拟信号(电压)产生了失真,不对其进行整形,那么数字电路就很难去根据其电压高低去转化为对应的0、1数字信号。
如上图,原来失真的模拟信号(黑色曲线)整形为数字电路能够处理的方波波形(红色线)
施密特触发器通过设置两个阈值电压来对失真的模拟信号进行整形,当输入电压高于正向阈值电压,输出为高;当输入电压低于负向阈值电压,输出为低;当输入在正负向阈值电压之间,输出不改变,也就是说输出由高电准位翻转为低电准位,或是由低电准位翻转为高电准位时所对应的阈值电压是不同的。只有当输入电压发生足够的变化时,输出才会变化,因此将这种元件命名为触发器。这种双阈值动作被称为迟滞现象,表明施密特触发器有记忆性。从本质上来说,施密特触发器是一种双稳态多谐振荡器。
3.4 至片上外设 – 输入
有模拟输入和和复用功能输入
模拟输入接收的是模拟量,比如接到了ADC内设上,输入的是模拟量,因此该线接在了施密特触发器前
而复用功能输入接收的则是数字量,因此接在了施密特触发器后,接收的是经过整形后的数字电路处理后的数字信号。
简化后的模拟输入电路图如下:
3.5 寄存器 – 输出
输出数据寄存器,就是普通的IO口输出,写该寄存器的某一位就能操作对于的端口了。该寄存器是对应16个端口的,如果想要使用某一位端口,就需要使用 &或| 操作去进行。
位设置/清除寄存器:可以单独操作输出数据寄存器的某一位,而不影响输出数据寄存器的其它位
3.5 MOS管 – 输出
两个MOS管:P-MOS和N-MOS
可以把MOS管当作一种电子开关,信号来控制MOS开关的导通和关闭,而MOS开关则负责将IO口接到VDD或者VSS,从而实现输出高电平或低电平。
一共有三种输出模式:推挽、开漏以及关闭。
推挽模式:P-MOS和N-MOS均有效。数据寄存器输出1时,上管P-MOS导通,下管N-MOS断开,输出直接接到VDD,也就是IO引脚输出高电平。数据寄存器输出0时,反过来,输出低电平。这种模式高低电平均有较强的驱动能力,所以推挽输出模式又叫强推输出模式,stm32对IO口有绝对的控制权,高低电平有它说了算
开漏模式:上管P-MOS是无效的,只有下管N-MOS在工作。因此数据寄存器输出1时,由于上管断开,输出就是相当于断开,也就是高阻模式;当输出0时,输出的就是低电平。所以这种模式下只有低电平有驱动能力,高电平是没有驱动能力的。
关闭模式:就是输入模式的时候,MOS全关闭,端口的电平由外部的信号来控制。
开漏/推挽输出简化后的电路图如下:
复用开漏/推挽输出:
就是输出由由片上外设控制的,可以看到输出数据寄存器在内部电路是断开的。
不要认为说输出的时候就不能输入,其实也是可以的,在输出的时候可以顺便接收读取一下片上外设输入的电平。
4.GPIO工作模式
通过上面对内部位结构的讲解,其实GPIO的工作模式可以分为以下内容:
模式名称 | 性质 | 特征 |
---|---|---|
浮空输入 | 数字输入 | 可读取引脚电平,若引脚悬空,则电平不确定 |
上拉输入 | 数字输入 | 可读取引脚电平,内部连接上拉电阻,悬空时默认高电平 |
下拉输入 | 数字输入 | 可读取引脚电平,内部连接下拉电阻,悬空时默认低电平 |
模拟输入 | 模拟输入 | GPIO无效,引脚直接接入内部ADC |
开漏输出 | 数字输出 | 可输出引脚电平,高电平为高阻态,低电平接VSS |
推挽输出 | 数字输出 | 可输出引脚电平,高电平接VDD,低电平接VSS |
复用开漏输出 | 数字输出 | 由片上外设控制,高电平为高阻态,低电平接VSS |
复用推挽输出 | 数字输出 | 由片上外设控制,高电平接VDD,低电平接VSS |
作者:憧憬一下