跳到主要内容

STM32 HAL GPIO

介绍

GPIO(通用输入输出)是 STM32 微控制器中最基本的功能之一。它允许你通过配置引脚来读取外部信号或控制外部设备。STM32HAL 库提供了一套简单易用的 API,帮助你快速配置和控制 GPIO 引脚。

在本教程中,我们将学习如何使用 STM32HAL 库来配置 GPIO 引脚,并通过代码示例展示如何读取输入信号和控制输出信号。

GPIO 的基本概念

GPIO 引脚可以配置为以下几种模式:

  • 输入模式:用于读取外部信号。
  • 输出模式:用于控制外部设备。
  • 复用模式:用于将引脚配置为其他外设功能(如 UART、SPI 等)。
  • 模拟模式:用于模拟信号输入(如 ADC)。

每个 GPIO 引脚还可以配置为上拉、下拉或浮空模式,以确定引脚在没有外部信号时的状态。

配置 GPIO 引脚

1. 初始化 GPIO 引脚

在使用 GPIO 引脚之前,需要先对其进行初始化。以下是一个初始化 GPIO 引脚的示例代码:

c
#include "stm32f4xx_hal.h"

void GPIO_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct = {0};

// 使能 GPIO 时钟
__HAL_RCC_GPIOA_CLK_ENABLE();

// 配置 GPIO 引脚
GPIO_InitStruct.Pin = GPIO_PIN_5; // 选择引脚 5
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 配置为推挽输出模式
GPIO_InitStruct.Pull = GPIO_NOPULL; // 无上拉或下拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // 低速模式

// 初始化 GPIO
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

2. 控制 GPIO 输出

初始化完成后,你可以使用 HAL_GPIO_WritePin 函数来控制 GPIO 引脚的电平状态:

c
void Toggle_LED(void) {
// 将 GPIO 引脚 5 设置为高电平
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);

// 延时
HAL_Delay(500);

// 将 GPIO 引脚 5 设置为低电平
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);

// 延时
HAL_Delay(500);
}

3. 读取 GPIO 输入

你也可以使用 HAL_GPIO_ReadPin 函数来读取 GPIO 引脚的状态:

c
void Read_Button(void) {
GPIO_PinState buttonState = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);

if (buttonState == GPIO_PIN_SET) {
// 按钮被按下
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
} else {
// 按钮未被按下
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
}
}

实际应用场景

案例:控制 LED 灯

假设你有一个连接到 GPIO 引脚 5 的 LED 灯,并且你希望通过按钮控制它的开关。以下是一个简单的实现:

c
void Control_LED(void) {
GPIO_Init(); // 初始化 GPIO

while (1) {
Read_Button(); // 读取按钮状态
HAL_Delay(100); // 延时 100ms
}
}

在这个案例中,当按钮被按下时,LED 灯会亮起;当按钮未被按下时,LED 灯会熄灭。

总结

通过本教程,你已经学会了如何使用 STM32HAL 库来配置和控制 GPIO 引脚。我们介绍了 GPIO 的基本概念、初始化方法、输出控制和输入读取,并通过一个实际案例展示了如何控制 LED 灯。

提示

如果你想进一步学习,可以尝试以下练习:

  1. 配置多个 GPIO 引脚,并实现一个简单的交通灯控制系统。
  2. 使用中断来处理按钮按下事件,而不是轮询按钮状态。

附加资源