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 灯。
提示
如果你想进一步学习,可以尝试以下练习:
- 配置多个 GPIO 引脚,并实现一个简单的交通灯控制系统。
- 使用中断来处理按钮按下事件,而不是轮询按钮状态。