目录
一、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、继电器、驱动电机等。
输出电平控制:在推挽输出模式下,微控制器的输出引脚可以主动控制输出电平。通过设置寄存器中的相应位,可以使引脚输出高电平(通常为供电电压,如3.3V或5V)或低电平(通常为地或0V)。这允许您在引脚上产生数字信号。
电流输出能力:推挽输出引脚通常具有一定的输出电流能力,可以驱动外部负载。这意味着它们能够提供足够的电流来点亮LED、激活继电器、驱动电机等。
不易受外部干扰:由于推挽输出引脚在输出电平时提供一定的电流,它们通常不容易受到外部电路的影响或噪声的干扰。这使它们适用于要求电平稳定性的应用。
示例 : 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, GPIO_PIN_SET); // 设置引脚为高电平,LED点亮
要关闭LED,可以使用以下代码:
GPIO_WriteBit(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); // 设置引脚为低电平,LED熄灭
这样,您可以通过STM32的GPIO引脚控制LED的亮灭状态。
3、GPIO_MODE_OUTPUT_OD(
开漏):在开漏输出模式下,GPIO引脚可以拉低(输出低电平)或处于高阻态(高电平时与地连接)状态。这种模式通常与外部上拉电阻结合使用,以实现特定的电平控制。
输出电平控制:在开漏输出模式下,GPIO引脚通常只能拉低,无法主动拉高。这意味着引脚只能输出低电平(0V或地),而在高电平状态时处于高阻态,不提供电流。要实现高电平,需要外部上拉电阻将引脚连接到供电电压。
电流输出能力:开漏输出引脚在输出低电平时通常具有一定的电流能力,可以用于驱动外部负载,如LED、继电器、电机驱动等。然而,在输出高电平时,它们不提供电流,因此需要外部上拉电阻来拉高电平。
上拉电阻:为了在开漏输出模式下实现高电平,通常需要外部上拉电阻。上拉电阻将引脚连接到供电电压,以确保在引脚没有被拉低时处于高电平状态。上拉电阻的值通常是几千欧姆。
不易受外部电路影响:由于开漏输出引脚在输出高电平时处于高阻态,它们通常不容易受到外部电路的影响或噪声的干扰。这使它们适用于要求电平稳定性的应用。
示例 : 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, GPIO_PIN_RESET); // 设置引脚为低电平,LED点亮
要关闭LED,使引脚输出高电平,此时不提供电流。可以使用以下代码:
GPIO_WriteBit(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 设置引脚为高电平,LED熄灭
这样,您可以通过STM32的GPIO引脚控制LED的亮灭状态。
4、GPIO_MODE_AF_PP
:这个模式允许GPIO引脚既能够执行通用输入输出的任务,又能够与某个特定的外设功能相结合,例如USART、SPI、PWM等。
以下是关于 GPIO_MODE_AF_PP
的详细解释:
复用功能:STM32微控制器的许多引脚都具有多个功能。除了通用输入输出(GPIO)功能外,它们还可以用于特定外设的功能,如串口通信、SPI通信、定时器等。
GPIO_MODE_AF_PP
允许我们将引脚配置为复用功能,并使用外设功能。推挽输出模式:在
GPIO_MODE_AF_PP
模式下,GPIO引脚被配置为推挽输出模式,与GPIO_MODE_OUTPUT_PP作用类似
。外设功能选择:除了配置引脚为复用功能推挽输出模式外,我们还需要选择引脚将用于哪个外设功能。这通常通过选择引脚的复用功能编号来实现,例如USART1、SPI2等。
电流输出能力:与推挽输出模式类似,
GPIO_MODE_AF_PP
模式下的引脚通常具有一定的输出电流能力,以驱动外部负载。应用示例:
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模块相结合以进行串口通信。
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
这个字段用于指定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
这个字段用于指定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引脚