STM32之GPIO输出

1.7k words

在 STM32 的开发中,GPIO(通用输入/输出)是一种极其重要且常用的外设资源。无论是用于控制 LED、按键、电机驱动,还是与其他外设之间通信,GPIO 都是实现这些功能的核心接口。


一、示例代码

这是一个在 STM32 HAL 库中非常常见的初始化函数,用于配置 GPIO 引脚为输出模式,并设置相应的参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
* @brief 初始化GPIO引脚(用于LED控制)
* @param 无
* @retval 无
*/
void GPIO_Init(void)
{
/* 初始化GPIO结构体,所有成员默认为0 */
GPIO_InitTypeDef GPIO_InitStruct = {0};

/* 使能 GPIO 端口时钟 */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOF_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();

/* 设置GPIOC端口上LED1、LED2、LED3引脚初始状态为高电平 */
HAL_GPIO_WritePin(GPIOC, LED1_Pin|LED2_Pin|LED3_Pin, GPIO_PIN_SET);


GPIO_InitStruct.Pin = LED1_Pin | LED2_Pin | LED3_Pin; /* 设置GPIO引脚属性:选择LED1、LED2、LED3引脚 */
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; /* 设置工作模式为推挽输出 */
GPIO_InitStruct.Pull = GPIO_PULLUP; /* 设置内部上拉电阻 */
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; /* 设置输出速度为低速 */
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); /* 初始化GPIO引脚,传入端口地址和配置结构体 */
}

二、GPIO_InitStruct参数配置

1、GPIO_InitStruct.Pin

选择要配置的引脚

2、 GPIO_InitStruct.Mode

设置 GPIO 引脚的 工作模式

推挽输出(Output Push Pull)

  • 输入参数:GPIO_MODE_OUTPUT_PP
  • 描述:引脚输出低或高电平,有驱动能力,适用于驱动负载
  • 场景:LED、数码管、外部电路驱动

开漏输出(Output Open Drain)

  • 输入参数:GPIO_MODE_OUTPUT_OD
  • 描述:输出高电平由外部上拉电阻决定,输出低电平由内部施放
  • 场景:可能用于 I2C、逻辑总线

复用推挽输出

  • 输入参数:GPIO_MODE_OUTPUT_PP
  • 描述:GPIO_MODE_OUTPUT_AF_PP
  • 场景:SPI、I2C、UART 通信接口

复用开漏输出

  • 输入参数:GPIO_MODE_OUTPUT_AF_OD
  • 描述:用于通信协议(如 SPI、UART、I2C)等,信号链路由外部上拉
  • 场景:需要外部上拉的通信协议

3、GPIO_InitStruct.Pull

设置 GPIO 引脚的 上拉或下拉电阻

启用上拉电阻

  • 输入参数:GPIO_PULLUP
  • 描述:默认状态为高电平,适用于按钮、传感器等

启用下拉电阻

  • 输入参数:GPIO_PULLUP
  • 描述:默认状态为低电平

无上下拉

  • 输入参数:GPIO_NOPULL
  • 描述:不自动上拉或下拉引脚

4、GPIO_InitStruct.Speed

设置 GPIO 引脚工作速度

低速

  • 输入参数:GPIO_SPEED_FREQ_LOW
  • 描述:最高5MHz

中速

  • 输入参数:GPIO_SPEED_FREQ_MEDIUM
  • 描述:5MHz ~ 25MHz

高速

  • 输入参数:GPIO_SPEED_FREQ_HIGH
  • 描述:25MHz ~ 50MHz

极高速

  • 输入参数:GPIO_SPEED_FREQ_VERY_HIGH
  • 描述:50MHz ~ 120MHz