1.GPlO简介
- GPlO(General Purpose Input Output)通用输入输出口,可配置为8种输入输出模式
- 引脚电平:0V~3.3V,I部分引脚可容忍5V
- 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器模拟通信协议输出时序等
- 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等
2.GPIO基本结构
寄存器是32位的,端口16个,只有低16位有对应的端口
使用驱动器增大驱动能力
I/O引脚连接32单片机引脚
1、保护二极管
- 引脚内部加上这两个保护二级管可以防止引脚外部过高或过低的电压输入。
- 当引脚电压高于VDD(3.3V) 时,上方的二极管导通吸收这个高电压。
- 当引脚电压低于 VSS (GND)时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。
2、上下拉电阻
上拉和下拉电阻上都有一个开关,可以通过程序配置上下拉电阻开关
- 当开启上拉时,引脚默认电压为高电平,
- 开启下拉时,引脚默认电压为低电平,这样就可以消除引脚不定状态的影响。
- 将上拉和下拉的开关都关断,这种状态我们称为浮空模式,一旦配置成这个模式,引脚的电压是不确定的,一般情况下我们都会给引脚设置成上拉或者下拉模式,使它有一个默认状态。
- STM32 上下拉及浮空模式的配置是通过GPIOx_CRL 和 GPIOx_CRH 寄存器控制的。
- STM32 内部的上拉和下拉其实是一个弱上拉,电阻阻值很大,也就是说通过此上拉电阻输出的电流很小,如果想要输出一个大电流,那么就需要外接上拉电阻了。
3、施密特触发器(肖特基)
施密特触发器的作用就是对输入电压进行整形的,它的执行逻辑是,如果输入电压大于某一闽值,输出就会瞬间升为高电平,如果输入电压小于某一阈值,输出就会瞬间降为低电平
4、输入数据寄存器
输入数据寄存器是由 IO 口经过上下拉电阻、施密特触发器引入。当信号经过触发器,模拟信号将变为数字信号 0 或 1,然后存储在输入数据寄存器中,通过读取输入数据寄存器 GPIOx_IDR 就可以知道 IO 口的电平状态。
5、复用功能输入
此模式与复用功能输出类似。在复用功能输入模式时,GPIO 引脚的信号传输到 STM32 其他片上外设,由该外设读取引脚的状态。同样,如我们使用 USART 串口通讯时,需要用到某个 GPIO 引脚作为通讯接收引脚,这个时候就可以把该 GPIO 引脚配置成 USART 串口复用功能,使 USART 可以通过该通讯引脚的接收远端数据。
6、模拟输入输出
当 GPIO 引脚用于 ADC 采集电压的输入通道时,用作“模拟输入”功能,此时信号是不经过施密特触发器的,因为经过施密特触发器后信号只有 0、1 两种状态,ADC 外设要采集到原始的模拟信号,信号源输入必须在施密特触发器之前。类似地,当 GPIO 引脚用于 DAC 作为模拟电压输出通道时,此时作为“模拟输出”功能, DAC 的模拟信号输出就不经过双 MOS 管结构了,模拟信号直接通过管脚输出。
7、位设置/清除寄存器
- 如果我们要对某一位进行置1的操作,在位设置寄存器的对应位写1即可,剩下不需要操作的位写0,这样它内部就会有电路自动将输出数据寄存器中对应位置为1,而剩下写0的位则保持不变
- 如果想对某一位进行清0的操作,就在位清除寄存器的对应位写1即可
8、P-MOS和N-MOS
上面是P-MOS,下面是N-MOS,这个MOS管就是一种电子开关,我们的信号来控制开关的导通和关闭,开关负责将I0口接到VDD或者VSS。
- 在推挽输出模式下,P-MOS和N-MOS均有效,数据寄存器为1时,上管导通,下管断开,输出直接接到VDD,就是输出高电平,数据奇存器为0时,上管断开,下管导通,输出直接接到VSS,就是输出低电平,这种模式下,高低电平均有较强的驱动能力,所以推挽输出模式也可以叫强推输出模式
- 在开漏输出模式下,这个P-MOS是无效的,只有N-MOS在工作,数据寄存器为0时,下管导通,输出直接接到VSS,也就是输出低电平,这种模式下,只有低电平有驱动能力,高电平是没有驱动能力的,这个开漏模式可以作为通信协议的驱动方式,比如I2C通信的引脚,就是使用的开漏模式,在多机通信的情况下,这个模式可以避免各个设备的相互干扰(可在I0口外接一个上拉电阻到5V的电源)
- 关闭,这个是当引脚配置为输入模式的时候,这两个MOS管都无效,也就是输出关闭,端口的电平由外部信号来控制
3.GPIO八种工作模式
模式名称 | 性质 | 特征 |
浮空输入 | 数字输入 | 可读取引脚电平,若引脚悬空,则电 平不确定 |
上拉输入 | 数字输入 | 可读取引脚电平,内部连接上拉电阻,悬空时默认高电平 |
下输入拉 | 数字输入 | 可读取引脚电平,内部连接下拉电阻,悬空时默认低电平 |
模拟输入 | 模拟输入 | GPIO无效,引脚直接接入内部ADC |
开漏输出 | 数字输出 | 可输出引脚电平,高电平为高阻态,低电平接VSS |
推挽输出 | 数字输出 | 可输出引脚电平,高电平接VDD,低电平接VSS |
复用开漏输出 | 数字输出 | 由片上外设控制,高电平为高阻态,低电平接VSS |
复用推挽输出 | 数字输出 | 由片上外设控制,高电平接VDD,低电平接VSS |
浮空/上拉/下拉输入
模拟输入
开漏/推挽输出
一个端口只能有一个输出,但可以有多个输入,配置成输出模式时候,输入模式仍能使用