1. GPIO 的基本概念
(1) 什么是 GPIO?
GPIO 的中文意思是通用输入输出端口(General Purpose Input/Output),是嵌入式系统中可编程控制的通用引脚,可通过软件配置为输入或输出模式。(背诵)
(2) 它的主要功能是什么?(背诵)
① 输入功能:读取引脚电平状态,获取按键和各类传感器的信息输入。
② 输出功能:输出高低电平,控制外围设备。
③ 复用功能:部分GPIO可配置为特殊功能(如UART、SPI、I2C)
2. GPIO 的 8 种工作模式(背诵)
模式名称 | 性质 | 关键特征 |
浮空输入 | 数字输入 | 可读取引脚电平,若引脚悬空,则电平不确定(巧记:输入为读取) |
上拉输入 | 数字输入 | 可读取引脚电平,内部连接上拉电阻,悬空时默认高电平 |
下拉输入 | 数字输入 | 可读取引脚电平,内部连接下拉电阻,悬空时默认低电平 |
模拟输入 | 模拟输入 | GPIO 无效,引脚直接接入内部 ADC |
开漏输出 | 数字输出 | 可输出引脚电平,高电平为高阻态,低电平接 VSS(巧记:输出为输出) |
推挽输出 | 数字输出 | 可输出引脚电平,高电平接 VDD,低电平接 VSS |
复用开漏输出 | 数字输出 | 由片上外设控制,高电平为高阻态,低电平为 VSS |
复用推挽输出 | 数字输出 | 由片上外设控制,高电平接 VDD,低电平接 VSS |
(1) 上拉/下拉电阻:上拉/下拉电阻用于设置引脚的默认电压。上拉使能,引脚默认电压为高电平,下拉使能,引脚默认电压为低电平。
(2) VSS 通常指电路的负极,VDD 通常指电路的正电源。
3. 推挽输出和开漏输出的区别
(1)
4. GPIO 初始化流程(以STM32为例,描述GPIO初始化的步骤)
(1) 使能GPIO时钟
① 作用:微控制器中外设(如GPIO)默认处于关闭状态以节省功耗。时钟信号是数字电路工作的基础,必须开启对应GPIO端口的时钟,才能配置和使用其引脚。
② 操作实例:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); # 使能GPIOA的时钟
- RCC:Reset and Clock Control(复位与时钟控制器),负责管理系统时钟和外设时钟。
- APB2:一种低速总线,连接GPIO、USART等外设。
- PeriphClockcmd:外设时钟控制命令。
(2) 配置GPIO引脚参数(背诵)
① 关键参数:
- Pin:选择具体的引脚(如GPIO_PIN_5)。
- Mode:设置引脚模式(输入/输出/复用/模拟)。
- Pull:配置上拉或下拉电阻(上拉、下拉、无上下拉)。
- Speed:输出驱动速度(低速、中速、高速、超高速)。
(3) 调用 GPIO_Init() 生效
① 声明结构体变量:
GPIO_InitTypeDef GPIO_InitStruct; # 创建结构体实例
② 填充配置参数:
# 示例:配置PA5为推挽输出,高速,无上下拉
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Pull = GPIO_PuPd_NOPULL;
③ 调用初始化函数:
GPIO_Init(GPIOA, &GPIO_InitStruct); # 应用配置到GPIOA端口
5. GPIO 必记函数
(1) 时钟控制函数:
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
示例:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); # 开启GPIOA的时钟
(2) GPIO 初始化函数:
void GPIO_DeInit(GPIO_TypeDef* GPIOx); # 被指定的GPIO外设会被复位
void GPIO_AFIODeInit(); # 复位AFIO复用功能配置
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* InitStruct); # 配置GPIO引脚的工作模式、速度、上下拉等参数
void GPIO_StructInit(GPIO_InitTypeDef* InitStruct); # 把结构体变量赋值一个默认值
示例:
GPIO_InitTypeDef gpio;
gpio.GPIO_Pin = GPIO_Pin_5; # 选择PA5引脚
gpio.GPIO_Mode = GPIO_Mode_Out_PP; # 推挽输出模式
gpio.GPIO_Speed = GPIO_Speed_50MHz; # 高速驱动
GPIO_Init(GPIOA, &gpio); # 应用配置到GPIOA
GPIO_DeInit(GPIOA); # 复位GPIOA所有寄存器的值
gpio.GPIO_Pin = GPIO_Pin_5; # 仍选择PA5
gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING; # 浮空输入模式
GPIO_Init(GPIOA, &gpio); # 重新初始化PA5
(3) 输出控制类函数:
① GPIO_SetBits()
- 功能:将指定引脚设置为高电平(1)。
- 示例:点亮LED。
GPIO_SetBits(GPIOA, GPIO_Pin_5); # PA5输出高电平
② GPIO_ResetBits()
- 功能:将指定引脚设置为低电平(0)。
- 示例:熄灭LED。
GPIO_ResetBits(GPIOA, GPIO_Pin_5); # PA5输出低电平
③ GPIO_WriteBit()
- 功能:动态设置单个引脚电平(可替代SetBits/ResetBits)。
- 示例:根据条件设置电平。
GPIO_WriteBit(GPIOA, GPIO_Pin_5, (condition ? Bit_SET : Bit_RESET));
(4) 输入读取类函数:
① GPIO_ReadInputDataBit()
- 功能:读取单个引脚的电平状态(输入模式时使用)。
- 示例:检测按键按下。
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0) {# 引脚PA0为低电平(按键按下)
}
② GPIO_ReadOutputDataBit()
- 功能:读取输出寄存器的状态(输出模式时使用)。
- 示例:检测当前输出值。
BitStatus pinState = GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5);
(5) 必须掌握的模式宏定义:
① GPIO_Mode_AIN 是模拟输入。
② GPIO_Mode_IN_FLOATING 是浮空输入。
③ GPIO_Mode_IPD 是下拉输入。
④ GPIO_Mode_IPU 是上拉输入。
⑤ GPIO_Mode_Out_OD 是开漏输出。
⑥ GPIO_Mode_Out_PP 是推挽输出。
⑦ GPIO_Mode_AF_OD 是复用开漏。
⑧ GPIO_Mode_AF_PP 是复用推挽。