目录

一、GPIO_InitTypeDef简介

二、结构体成员及详解

(一)、GPIO_Pin

(二)、GPIO_Mode

1、GPIO_MODE_INPUT:

2、GPIO_MODE_OUTPUT_PP:推挽输出模式

3、GPIO_MODE_OUTPUT_OD:开漏输出模式

4、GPIO_MODE_AF_PP:

5、GPIO_MODE_AF_OD:

(三)、GPIO_Speed:

(四)、GPIO_OType

(五)、GPIO_PuPd

写在后面:


一、GPIO_InitTypeDef简介

GPIO_InitTypeDef 是一个结构体类型,用于配置STM32微控制器的GPIO(通用输入输出)端口的初始化参数。在STM32的嵌入式开发中,要配置和控制GPIO引脚,通常需要创建一个 GPIO_InitTypeDef 结构体对象,并填写相关的参数,然后通过函数将这些参数应用到特定的GPIO端口。

二、结构体成员及详解

在配置结构体之前需要用RCC模块使能GPIOX外设时钟。方法详见

GPIO_InitTypeDef结构体的成员有GPIO_Pin、GPIO_Mode、GPIO_Speed、GPIO_OType、GPIO_PuPd,配置结构体对象的方式:

GPIO_InitStructure.GPIO_Pin=xx;

下面是对每个成员的详细分析解释:

(一)、GPIO_Pin

这是一个32位的整数,用于指定要配置的GPIO引脚。可以使用按位或运算符 | 来同时配置多个引脚。例如,要配置引脚0和引脚1或GPIOX上的所有引脚,可以使用 :

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//只配置引脚0
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; //同时配置引脚0和引脚1
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_ALL;//配置GPIOX的所有引脚

(二)、GPIO_Mode

用于指定STM32微控制器上的GPIO(通用输入输出)引脚的工作模式。工作模式决定了引脚在特定时刻是输入、输出、还是处于其他特定功能模式下的工作状态。

以下是常见的 GPIO_Mode 值以及它们的解释:

1、GPIO_MODE_INPUT

GPIO_MODE_INPUT 是一种GPIO引脚的工作模式,用于配置STM32微控制器上的GPIO引脚为输入模式。在这个模式下,GPIO引脚用于接收外部信号,通常与外部传感器、按钮、开关等输入设备连接,以读取它们的状态或数据。

2、GPIO_MODE_OUTPUT_PP(推挽):

在推挽输出模式下,输出引脚可以主动拉低(输出低电平)或拉高(输出高电平)。推挽输出通常用于连接到外部负载,如LED、继电器、驱动电机等。

  1. 输出电平控制:在推挽输出模式下,微控制器的输出引脚可以主动控制输出电平。通过设置寄存器中的相应位,可以使引脚输出高电平(通常为供电电压,如3.3V或5V)或低电平(通常为地或0V)。这允许您在引脚上产生数字信号。

  2. 电流输出能力:推挽输出引脚通常具有一定的输出电流能力,可以驱动外部负载。这意味着它们能够提供足够的电流来点亮LED、激活继电器、驱动电机等。

  3. 不易受外部干扰:由于推挽输出引脚在输出电平时提供一定的电流,它们通常不容易受到外部电路的影响或噪声的干扰。这使它们适用于要求电平稳定性的应用。

示例 : LED控制

假设您有一颗LED灯,希望通过STM32微控制器来控制它的亮灭。您可以使用推挽输出模式来实现这个任务。(LED正极端与引脚相连,负极端接地

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //GPIOA时钟使能

GPIO_InitTypeDef GPIO_InitStruct; 
GPIO_InitStruct.Pin = GPIO_PIN_5; // 要配置的引脚 
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出模式 
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // 低速输出 
GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化GPIOA引脚

控制LED状态:现在,您可以使用GPIO库函数来控制LED的状态。例如,要点亮LED,可以使用以下代码:

GPIO_WriteBit(GPIOA, GPIO_PIN_5, Bit_SET);// 设置引脚为高电平,LED点亮 或
GPIO_WriteBit(GPIOA, GPIO_PIN_5, 1);

要关闭LED,可以使用以下代码:

GPIO_WriteBit(GPIOA, GPIO_PIN_5, Bit_RESET); // 设置引脚为低电平,LED熄灭
GPIO_WriteBit(GPIOA, GPIO_PIN_5, 0);

这样,您可以通过STM32的GPIO引脚控制LED的亮灭状态。

3、GPIO_MODE_OUTPUT_OD(开漏)

在开漏输出模式下,GPIO引脚可以拉低(输出低电平)或处于高阻态(高电平时与地连接)状态。这种模式通常与外部上拉电阻结合使用,以实现特定的电平控制。

  1. 输出电平控制:在开漏输出模式下,GPIO引脚通常只能拉低,无法主动拉高。这意味着引脚只能输出低电平(0V或地),而在高电平状态时处于高阻态,不提供电流。要实现高电平,需要外部上拉电阻将引脚连接到供电电压。

  2. 电流输出能力:开漏输出引脚在输出低电平时通常具有一定的电流能力,可以用于驱动外部负载,如LED、继电器、电机驱动等。然而,在输出高电平时,它们不提供电流,因此需要外部上拉电阻来拉高电平。

  3. 上拉电阻:为了在开漏输出模式下实现高电平,通常需要外部上拉电阻。上拉电阻将引脚连接到供电电压,以确保在引脚没有被拉低时处于高电平状态。上拉电阻的值通常是几千欧姆。

  4. 不易受外部电路影响:由于开漏输出引脚在输出高电平时处于高阻态,它们通常不容易受到外部电路的影响或噪声的干扰。这使它们适用于要求电平稳定性的应用。

示例 : LED控制

假设您有一颗LED灯,希望通过STM32微控制器来控制它的亮灭。您可以使用推挽输出模式来实现这个任务。(LED负极端与引脚相连,正极端连接Vcc

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //GPIOA时钟使能

GPIO_InitTypeDef GPIO_InitStruct; 
GPIO_InitStruct.Pin = GPIO_PIN_5; // 要配置的引脚 
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; // 开漏输出模式 
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // 低速输出 
GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化GPIOA引脚

控制LED状态:现在,您可以使用GPIO库函数来控制LED的状态。例如,要点亮LED,需要使引脚输出低电平,可以使用以下代码:

GPIO_WriteBit(GPIOA, GPIO_PIN_5, Bit_RESET); // 设置引脚为低电平,LED点亮

要关闭LED,使引脚输出高电平,此时不提供电流。可以使用以下代码:

GPIO_WriteBit(GPIOA, GPIO_PIN_5, Bit_SET); // 设置引脚为高电平,LED熄灭

这样,您可以通过STM32的GPIO引脚控制LED的亮灭状态。

4、GPIO_MODE_AF_PP

这个模式允许GPIO引脚既能够执行通用输入输出的任务,又能够与某个特定的外设功能相结合,例如USART、SPI、PWM等。

以下是关于 GPIO_MODE_AF_PP 的详细解释:

  1. 复用功能:STM32微控制器的许多引脚都具有多个功能。除了通用输入输出(GPIO)功能外,它们还可以用于特定外设的功能,如串口通信、SPI通信、定时器等。GPIO_MODE_AF_PP 允许我们将引脚配置为复用功能,并使用外设功能。

  2. 推挽输出模式:在 GPIO_MODE_AF_PP 模式下,GPIO引脚被配置为推挽输出模式,与 GPIO_MODE_OUTPUT_PP作用类似

  3. 外设功能选择:除了配置引脚为复用功能推挽输出模式外,我们还需要选择引脚将用于哪个外设功能。这通常通过选择引脚的复用功能编号来实现,例如USART1、SPI2等。

  4. 电流输出能力:与推挽输出模式类似,GPIO_MODE_AF_PP 模式下的引脚通常具有一定的输出电流能力,以驱动外部负载。

  5. 应用示例GPIO_MODE_AF_PP 常用于连接到外部通信设备,例如串口通信(USART)、SPI通信、I2C通信等。通过将引脚配置为复用功能推挽输出模式,并选择适当的外设功能,我们可以实现与外部设备的通信。

以下是一个使用 GPIO_MODE_AF_PP 模式的示例代码片段(使用STM32 HAL库):

GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOA_CLK_ENABLE(); // 启用GPIOA时钟

GPIO_InitStruct.Pin = GPIO_PIN_9;               // 要配置的引脚
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;         // 复用功能推挽输出模式
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;   // 高速输出
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);        // 初始化GPIOA引脚

// 配置引脚的复用功能为USART1
__HAL_AFIO_REMAP_USART1_ENABLE(); // 可能需要根据具体的引脚和功能进行配置

这段代码将GPIOA的引脚9配置为复用功能推挽输出模式,并将其复用功能配置为USART1,以用于串口通信。这使得引脚既可以作为通用输入输出引脚使用,又可以与USART1模块相结合以进行串口通信。

5、GPIO_MODE_AF_OD

复用功能开漏输出模式,与上述相似,但是开漏输出。

(三)、GPIO_Speed

这个字段用于指定GPIO引脚的输出速度。它通常用于输出模式,可以包括以下值之一:

  • GPIO_SPEED_FREQ_LOW:低速,适用于低功耗应用。它减少了引脚状态的变化速度,有助于降低功耗和电磁干扰。
  • GPIO_SPEED_FREQ_MEDIUM:中速。
  • GPIO_SPEED_FREQ_HIGH:高速,适用于高性能应用,如高速串口通信、驱动LED矩阵等。。

  • GPIO_Speed_2MHz:输出速度为2MHz。

  • GPIO_Speed_10MHz:输出速度为10MHz。

  • GPIO_Speed_50MHz:输出速度为50MHz。

以下是一个示例代码片段,演示了如何使用 GPIO_Speed 参数来配置GPIO引脚的输出速度:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 启用GPIOA时钟

GPIO_InitTypeDef GPIO_InitStruct;  
GPIO_InitStruct.Pin = GPIO_PIN_0; // 要配置的引脚 
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出模式 
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // 高速输出 
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化GPIOA引脚

在这个示例中,引脚0被配置为高速输出,以实现更快的切换速度。根据应用需求,您可以根据需要选择不同的速度设置。

(四)、GPIO_OType(STM32 HAL库)

这个字段用于指定GPIO引脚的输出类型,包括推挽输出或开漏输出。可以包括以下值之一:

  • GPIO_OTYPE_PP:推挽输出。
  • GPIO_OTYPE_OD:开漏输出。

以下是一个示例代码片段,演示了如何使用 GPIO_OType 参数来配置GPIO引脚的输出类型(使用STM32 HAL库):

GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOA_CLK_ENABLE(); // 启用GPIOA时钟

GPIO_InitStruct.Pin = GPIO_PIN_0;               // 要配置的引脚
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;     // 推挽输出模式
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;   // 高速输出
GPIO_InitStruct.Pull = GPIO_NOPULL;            // 无上拉/下拉
GPIO_InitStruct.OType = GPIO_OTYPE_PP;         // 推挽输出类型
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);        // 初始化GPIOA引脚

在这个示例中,引脚0被配置为推挽输出模式,以实现输出高电平和低电平,并能够提供电流来驱动外部负载。根据应用需求,我们可以选择适当的输出类型。

(五)、GPIO_PuPd(STM32 HAL库)

这个字段用于指定GPIO引脚的上下拉电阻状态,可以包括以下值之一:

  • GPIO_NOPULL(无上拉/下拉):这是默认设置,引脚不连接上拉电阻或下拉电阻,处于高阻态。在此模式下,引脚的电平由外部电路决定,可以在外部电路中通过外部上拉或下拉电阻进行控制。

  • GPIO_PULLUP(上拉):这将引脚配置为上拉模式,引脚在未连接到外部电路时会被拉高到供电电压(通常为Vcc)。这种模式适用于需要默认高电平的输入引脚,例如按钮或开关。

  • GPIO_PULLDOWN(下拉):这将引脚配置为下拉模式,引脚在未连接到外部电路时会被拉低到地。这种模式适用于需要默认低电平的输入引脚,例如按钮或开关。

选择 GPIO_PuPd 参数时,需要考虑引脚功能和外部电路。

以下是一个示例代码片段,演示了如何使用 GPIO_PuPd 参数来配置GPIO引脚的上拉/下拉电阻设置(使用STM32 HAL库):

GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOA_CLK_ENABLE(); // 启用GPIOA时钟

GPIO_InitStruct.Pin = GPIO_PIN_0;               // 要配置的引脚
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;         // 输入模式
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;    // 低速输入
GPIO_InitStruct.Pull = GPIO_PULLUP;             // 上拉电阻设置
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);        // 初始化GPIOA引脚

在这个示例中,引脚0被配置为输入模式,并且上拉电阻被设置为上拉模式。这将确保引脚在未连接到外部电路时被拉高到供电电压,以防止漂移或不稳定的状态。根据应用需求,您可以选择适当的上拉或下拉电阻设置。

写在后面:

完成结构体参数设置后,我们需要初始化GPIOX引脚,使其处于默认状态,便于系统识别和引用。初始化代码:

HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);        // 初始化GPIOA引脚

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐