STM32-标准库-GPIO-API函数

1.void GPIO_DeInit(GPIO_TypeDef* GPIOx);

|----------|--------------------------------------------------|
| @简明 | 清除GPIOx的外围寄存器下所有引脚的配置, 恢复到默认配置状态(即上电初始值) |
| @简明 | 清除GPIOx的外围寄存器下所有引脚的配置, 恢复到默认配置状态(即上电初始值) |
| @参数 | GPIOx:其中x可以是(A..G)来选择GPIO外设。 |
| @返回值 | None |

cpp 复制代码
void GPIO_DeInit(GPIO_TypeDef* GPIOx);

(1)通常用于以下场景:

|----------------------|
| 动态切换外设功能前清除残留配置。 |
| 系统低功耗模式下减少 GPIO 漏电流。 |
| 错误恢复时强制重置 GPIO 状态。 |

(2)注意事项

|--------------|------------------------------------------------------------------------------------------------------------------------------------------|
| 复位操作依赖时钟 | 1.****必须确保 GPIO 时钟已使能:复位操作需通过 RCC 寄存器完成, 若 GPIO 时钟未开启(例如调用 RCC_APB2PeriphClockCmd(GPIOx_CLOCK, DISABLE)),否则GPIO_DeInit() 将无效 |
| 复位操作依赖时钟 | 1.****必须确保 GPIO 时钟已使能:复位操作需通过 RCC 寄存器完成, 若 GPIO 时钟未开启(例如调用 RCC_APB2PeriphClockCmd(GPIOx_CLOCK, DISABLE)),否则GPIO_DeInit() 将无效 |
| 复位操作依赖时钟 | 1.****必须确保 GPIO 时钟已使能:复位操作需通过 RCC 寄存器完成, 若 GPIO 时钟未开启(例如调用 RCC_APB2PeriphClockCmd(GPIOx_CLOCK, DISABLE)),否则GPIO_DeInit() 将无效 |
| 复位操作依赖时钟 | 2. 复位后不会自动关闭时钟,需手动 禁用以降低功耗(若不再使用) |

2.void GPIO_AFIODeInit(void);

|----------|------------------------------------------------------|
| @简明 | 将复用功能(重映射、事件控制和EXTI配置)寄存器取消****复用功能,恢复默认状态值。 |
| @简明 | 将复用功能(重映射、事件控制和EXTI配置)寄存器取消****复用功能,恢复默认状态值。 |
| @参数 | None |
| @返回值 | None |

cpp 复制代码
void GPIO_AFIODeInit(void);

(1)注意事项

|---------------------------|-------------|---------------------------------------------------------------|
| 复位范围 : 影响所有 AFIO 相关配置 | 复用功能重映射(如 USART、SPI 引脚重映射) ||
| 复位范围 : 影响所有 AFIO 相关配置 | 外部中断线(EXTI)与 GPIO 引脚的绑定关系 ||
| 复位范围 : 影响所有 AFIO 相关配置 | 事件输出功能(GPIO_EventOutputConfig)的配置 ||
| 复位范围 : 影响所有 AFIO 相关配置 | 调试端口(如 SWJ/JTAG)的引脚分配(可能影响调试器连接) ||
| 外设依赖风险 | 复用功能失效: | 若 GPIO 用于外设重映射(如 USART1 重映射到 PB6/PB7),复位后需重新配置。 |
| 外设依赖风险 | 中断丢失 | 若 EXTI 中断依赖 AFIO 配置(如 GPIO_EXTILineConfig),复位后需重新绑定引脚并配置 NVIC |
| 外设依赖风险 | 中断丢失 | 若 EXTI 中断依赖 AFIO 配置(如 GPIO_EXTILineConfig),复位后需重新绑定引脚并配置 NVIC |
| 外设依赖风险 | 调试接口影响 | 默认状态下,调试端口(SWJ/JTAG)可能被禁用或重新分配,导致调试器断开连接 |

3.void GPIO_Init(GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_InitStruct);

|----------|----------|---------------------------------------------------------------|
| @简明 | 用来初始化GPIO引脚的配置,比如设置模式、速度、上下拉等。 ||
| @参数 | @参数1 | GPIOx:其中x可以是(A..G)来选择GPIO外设。 |
| @参数 | @参数2 | GPIO_InitStruct:指向GPIO_InitTypeDef结构的指针,该结构包含指定GPIO外围设备的配置信息。 |
| @返回值 | None ||

cpp 复制代码
void GPIO_Init(GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_InitStruct);

(1)**参数2:**GPIO_InitStruct

|---------------------|----------------|-------------------|----------|-------------------------------------------------------------------------------------------------------------------------------|
| GPIO_InitStruct | GPIO_Pin | 引脚编号(位掩码,如 GPIO_Pin_0 | GPIO_Pin_1)。 |||
| GPIO_InitStruct | GPIO_Mode | 引脚模式(输入/输出/复用/模拟) | 输入模式 | GPIO_Mode_AIN /* 模拟输入模式 / GPIO_Mode_IN_FLOATING / 浮空输入 / GPIO_Mode_IPD / 下拉输入模式 / GPIO_Mode_IPU / 上拉输入模式 */ |
| GPIO_InitStruct | GPIO_Mode | 引脚模式(输入/输出/复用/模拟) | 输出模式 | GPIO_Mode_Out_OD /* 开漏输出 / GPIO_Mode_Out_PP/ 推挽输出 / GPIO_Mode_AF_OD / 复用开漏输出/ GPIO_Mode_AF_PP / 复用推挽输出 */ |
| GPIO_InitStruct | GPIO_Speed | 输出速度(低速/中速/高速) || GPIO_Speed_10MHz = 1, GPIO_Speed_2MHz, GPIO_Speed_50MHz |
| GPIO_InitStruct | GPIO_OType | 输出类型(推挽/开漏) |||
| GPIO_InitStruct | GPIO_PuPd | 上下拉电阻配置(无/上拉/下拉) |||

(2)适用场景

|---|---|
| 初始化 GPIO 引脚为输入(如按键检测) ||
| 配置引脚为输出(如控制 LED)。 ||
| 设置复用功能(如 USART、SPI 通信) ||
| 模拟模式(如 ADC/DAC 信号采集) ||

4.void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct)

|----------|---------------------|----------------|----------------------|------------------|
| @简明 | 该函数用于快速初始化 GPIO 配置结构体,避免手动赋值的冗余操作, 通常在自定义配置前调用,确保未显式设置的参数具有合理的默认值。 ||||
| @参数 | GPIO_InitStruct | 成员 | 默认值 | 说明 |
| @参数 | GPIO_InitStruct | GPIO_Pin | GPIO_Pin_None | 无引脚被选中。 |
| @参数 | GPIO_InitStruct | GPIO_Mode | GPIO_Mode_IN | 浮空输入模式。 |
| @参数 | GPIO_InitStruct | GPIO_Speed | GPIO_Speed_2MHz | 低速模式(2MHz)。 |
| @参数 | GPIO_InitStruct | GPIO_OType | GPIO_OType_PP | 推挽输出(仅在输出模式下有效)。 |
| @参数 | GPIO_InitStruct | GPIO_PuPd | GPIO_PuPd_NOPULL | 无上下拉电阻。 |
| @返回值 | 无 ||||

cpp 复制代码
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct)

(1)注意事项

必须显式覆盖默认值 :调用 GPIO_StructInit 后,需手动设置目标参数(如 GPIO_PinGPIO_Mode),否则配置无效。
cpp 复制代码
GPIO_InitTypeDef GPIO_InitStruct; 

GPIO_StructInit(&GPIO_InitStruct); // 初始化默认值 

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5; // 覆盖引脚

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; // 覆盖模式

GPIO_Init(GPIOA, &GPIO_InitStruct);
默认模式的风险

**-默认的浮空输入模式(GPIO_Mode_IN)**可能导致引脚电平不稳定,需根据实际需求调整。

**-默认低速模式(GPIO_Speed_2MHz)**可能不适用于高频信号(如 SPI 通信)

GPIO_Init 的配合

-GPIO_StructInit 仅初始化结构体 ,不会配置硬件寄存器,需后续调用 GPIO_Init 生效。

多引脚配置优化

**-**若需重复配置不同引脚,可复用同一结构体,避免重复初始化:

cpp 复制代码
GPIO_InitTypeDef GPIO_InitStruct;  
GPIO_StructInit(&GPIO_InitStruct);  

// 配置 PA5 为输出  
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;  
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;  
GPIO_Init(GPIOA, &GPIO_InitStruct);  

// 配置 PA6 为输入  
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;  
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;  
GPIO_Init(GPIOA, &GPIO_InitStruct);  

5.uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

|----------|---------|--------------|---------|
| @简明 | 读取指定的输入端口引脚。 适用范围:适用于按键检测、传感器信号读取等场景。 |||
| @参数 | 参数1 | GPIOx | GPIO 端口 |
| @参数 | 参数2 | GPIO_Pin | 引脚编号 |
| @返回值 | Bit_SET(1):引脚为高电平。 |||
| @返回值 | Bit_RESET(0):引脚为低电平。 |||

cpp 复制代码
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

6.uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

|----------|-----------|---|---|
| @简明 | 读取指定的GPIO输入数据端口。 |||
| @参数 | GPIOx | GPIOx:其中x可以是(A..G)来选择GPIO外设。 ||
| @返回值 | 16位数据,每一位对应一个GPIO引脚的状态 { 0=低电平, 1=高电平 } |||

cpp 复制代码
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

(1)注意事项

|-------------|---|---|---|
| ​依赖条件 | 仅读取配置为输入模式​(如 GPIO_Mode_IN)的引脚状态,输出模式引脚的值可能无效 |||
| 输入模式有效性 | 仅在GPIO配置为输入模式(如浮空输入、上拉/下拉输入)时,返回值才有意义。 |||

(2)位操作技巧

cpp 复制代码
// 检查第n位是否为高电平 
if (GPIO_ReadInputData(GPIOA) & (1 << n)) { 

    /* 逻辑处理 */ 

}

7.uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

|---------|--------------|---|---|
| 简明 | 读取指定GPIO端口的单个输出引脚的当前设置状态 及(高/低电平),返回0或1。 |||
| 参数 | GPIOx | GPIOx:其中x可以是(A..G)来选择GPIO外设。 ||
| 参数 | GPIO_Pin | 指定要读取的端口位。 ||
| 返回值 | uint8_t:0(低电平)或1(高电平)。 |||

cpp 复制代码
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

(1)注意事项

|------------|---|---|
| 依赖条件 | 仅对配置为输出模式​(如推挽、开漏)的引脚有效, 输入模式引脚的结果无意义。 ||
| 典型应用场景 | 验证输出引脚的配置状态(如确认LED是否被设置为点亮、检查信号是否已发送)。 ||

8.uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

|----------|------------|---|---|
| @简明 | 读取指定GPIO端口的所有输出引脚的当前设置状态(高/低电平),返回16位无符号整数。 |||
| @参数 | GPIOx: | GPIO端口(如GPIOA、GPIOB等)。 ||
| @返回值 | uint16_t:16位数据,每一位对应一个GPIO引脚的输出状态(0=低电平,1=高电平)。 |||

cpp 复制代码
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

(1)注意事项

|------------|---|---|
| 依赖条件 | 仅对配置为输出模式​(如推挽、开漏)的引脚有效, 输入模式引脚的状态不会被反映。 ||
| 典型应用场景 | 批量读取输出引脚状态(如LED阵列控制、并行总线数据发送后验证状态)。 ||

结束语

以上就是对STM32-标准库-GPIO-API函数的一个总结。

相关推荐
不想学习\??!41 分钟前
STM32-外部中断
stm32·单片机·嵌入式硬件
不想学习\??!1 小时前
STM32-定时器
stm32·单片机·嵌入式硬件
LIN-JUN-WEI2 小时前
[ESP32]VSCODE+ESP-IDF环境搭建及blink例程尝试(win10 win11均配置成功)
c语言·开发语言·ide·vscode·单片机·学习·编辑器
LS_learner2 小时前
嵌入式系统中实现串口重定向
嵌入式硬件
景彡先生3 小时前
STM32中SPI协议详解
stm32·单片机·嵌入式硬件
趣多多代言人3 小时前
嵌入式面试八股文100题(二)
单片机·嵌入式硬件
Star Curry4 小时前
【新手小白的嵌入式学习之路】-STM32的学习_GPIO 8种模式学习心得
stm32·嵌入式硬件·学习
ZERONG_H4 小时前
STM32固件升级设计——内部FLASH模拟U盘升级固件
stm32·单片机·嵌入式硬件
猫猫的小茶馆4 小时前
【STM32】ADC模数转换基本原理
stm32·单片机·嵌入式硬件·mcu·51单片机
不想学习\??!5 小时前
STM32-USART
stm32·单片机·嵌入式硬件