本帖最后由 jf101 于 2023-11-13 17:36 编辑
一、GPIO 是什么?
GPIO,全称为General Purpose Input Output Ports(通用输入输出端口),也就是通用IO口。
GPIO是控制或者采集外部器件的信息的外设,可以由软件程序控制,用于输出或者输入高低电平。
GPIO的使用非常广泛。可以与硬件进行数据交互(如UART),控制硬件工作(如LED、蜂鸣器等),读取硬件的工作状态信号(如中断信号)等。
GPIO按组分配,每组16个I/O口,组数视芯片而定。
以STM32F103为例:
① 一共有4组IO,PA~PD。
二、GPIO 的 8 种工作模式
8种工作模式,分为4种输入模式和4种输出模式。
1. 浮空输入模式(GPIO_Mode_IN_FLOATING)
浮空输入模式下,上拉/下拉电阻为断开状态,施密特触发器为开启状态,I/O引脚的输出功能被禁止。
该模式下,外部的电平信号通过①(I/O引脚)进入MCU,先经过②(施密特触发器)的整形后,再进入③(输入数据寄存器),最后MCU可以在④(输入数据寄存器的另一端)随时读取I/O引脚的电平。
即,整形后的I/O引脚的电平信号直接进入输入数据寄存器,MCU直接读取I/O引脚的电平。
如果I/O引脚无输入时,MCU读取到的电平状态是不确定的。所以引脚不建议悬空,易受干扰。
如果I/O引脚输入高电平时,MCU读取到高电平1。
如果I/O引脚输入低电平时,MCU读到低电平0。
总结,浮空输入模式:
I/O引脚输入什么电平信号,MCU就读取到什么电平信号;
无信号输入(默认)时,MCU读取到的电平信号是不确定的。
浮空输入模式,可以用于KEY识别,RX1等。
2. 上拉输入模式(GPIO_Mode_IPU)
上拉输入模式下,上拉电阻导通,施密特触发器处于开启状态,I/O引脚的输出功能被禁止。
GPIO的内部上拉电阻的阻值较大,所以通过内部上拉输出的电流是很弱的,即“弱电流”。
如果需要大电流用作电流型驱动输出,还是要用外部上拉电阻。
上拉输入模式与浮空输入模式不同之处,是在①(I/O引脚)和②(施密特触发器)之间接入了一个上拉电阻,将电位拉高,比如拉到VCC。
如果I/O引脚无输入时,I/O引脚处相当于断开,上拉电阻的电流直接流向④,MCU读取到高电平1。
如果I/O引脚输入高电平时,I/O引脚的电压等于VDD的电压,电流还是流向④,MCU读取到高电平1。
如果I/O引脚输入低电平时,I/O引脚处相当于接地,上拉电阻的电流直接流向I/O引脚,MCU读到低电平0。
总结,上拉输入模式:
无信号输入(默认)或输入高电平时,MCU都是读取到高电平1;
输入低电平时,MCU读取到低电平0。
上拉输入模式,可以用于按键检测。
3. 下拉输入模式(GPIO_Mode_IPD)
下拉输入模式下,下拉电阻导通,施密特触发器处于开启状态,I/O引脚的输出功能被禁止。
下拉输入模式与浮空输入模式不同之处,是在①(I/O引脚)和②(施密特触发器)之间接入了一个下拉电阻,将电位拉低,比如拉到GND。
如果I/O引脚无输入时,I/O引脚处相当于断开,I/O引脚的电压等于VSS的电压,MCU读取到低电平0。
如果I/O引脚输入高电平时,由于下拉电阻阻值比通道④的阻值大,所以电流流向④,MCU读取到高电平1。
如果I/O引脚输入低电平时,I/O引脚处相当于接地,I/O引脚的电压等于VSS的电压,MCU读到低电平0。
总结,下拉输入模式:
无信号输入(默认)或输入低电平时,MCU都是读取到低电平0;
输入高电平时,MCU读取到高电平1。
下拉输入模式,和上拉输入模式相似,可以用于按键检测。
4. 模拟输入模式(GPIO_Mode_AIN)
模拟模式下,上拉/下拉电阻为断开状态,施密特触发器为关闭状态,输出部分的双MOS管也断开。
模拟输入模式下,外部的电平信号通过①(I/O引脚的模拟输入通道)进入MCU,MCU可以直接在③(模拟输出口)随时读取I/O引脚的电平。
由于施密特触发器断开,所以电信号也无法进入输入数据寄存器,所以MCU无法在“输入数据寄存器”中读取到有效的数据。
总结,模拟输入模式:
输入的电信号为模拟电压信号,而不是数字电平信号。
模拟输入的模拟电压信号,直接送到片上外设,一般是ADC。
除了 ADC 和 DAC 要将 I/O 配置为模拟通道之外,其他外设功能一律要配置为复用功能模式。
模拟输入模式,可以用于ADC采集或DAC输出,或者低功耗下省电。
|