打印
[其他ST产品]

GPIO通用输入输出驱动

[复制链接]
48|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiaoqi000|  楼主 | 2024-12-31 02:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用 STM32 HAL 库驱动常见外设如 GPIO、USART、I2C、SPI、ADC、DAC 等是 STM32 微控制器开发的基础之一。
下面详细介绍如何通过 HAL 库进行这些外设的初始化、配置和操作。

1. GPIO通用输入输出驱动
GPIO 是 STM32 的最基本外设,几乎所有的外设都需要与 GPIO 进行交互。
通过 GPIO 可以配置引脚为输入、输出、模拟模式等。


使用特权

评论回复
沙发
xiaoqi000|  楼主 | 2024-12-31 02:54 | 只看该作者
GPIO初始化
配置 GPIO 引脚模式、速度等:
c
复制代码
GPIO_InitTypeDef GPIO_InitStruct = {0};

// 使能 GPIOA 时钟
__HAL_RCC_GPIOA_CLK_ENABLE();

// 配置 GPIOA 引脚 5 为推挽输出
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;  // 推挽输出模式
GPIO_InitStruct.Pull = GPIO_NOPULL;          // 无上拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // 低速
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

使用特权

评论回复
板凳
xiaoqi000|  楼主 | 2024-12-31 02:54 | 只看该作者
控制 GPIO 输出:
c
复制代码
// 设置 GPIOA 引脚 5 为高电平
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);

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

使用特权

评论回复
地板
xiaoqi000|  楼主 | 2024-12-31 02:54 | 只看该作者
读取 GPIO 输入:
c
复制代码
// 读取 GPIOA 引脚 5 的输入状态
GPIO_PinState pinState = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5);

使用特权

评论回复
5
xiaoqi000|  楼主 | 2024-12-31 02:57 | 只看该作者
HAL_GPIO_ReadPin(): 这是 STM32 的 HAL 库提供的一个函数,用来读取 GPIO 引脚的输入状态。
GPIOA: 这表示 GPIOA 端口。您可以根据需要修改为其他端口,如 GPIOB, GPIOC 等。
GPIO_PIN_5: 这是要读取的 GPIO 引脚编号。此例中是读取 GPIOA 上的引脚 5。如果您需要读取其他引脚,只需将引脚编号改为所需的引脚,如 GPIO_PIN_0, GPIO_PIN_1 等。
返回值 GPIO_PinState 类型,表示引脚的当前状态,通常有两个可能值:
GPIO_PIN_SET: 引脚处于高电平(1)。
GPIO_PIN_RESET: 引脚处于低电平(0)。

使用特权

评论回复
6
xiaoqi000|  楼主 | 2024-12-31 02:57 | 只看该作者
USART(串行通信)驱动
USART 是 STM32 中常用的通信外设之一,用于串口通信。

USART初始化
配置 USART 外设:
c
复制代码
USART_HandleTypeDef huart2;

// 配置 USART2
huart2.Instance = USART2;
huart2.Init.BaudRate = 115200;           // 波特率 115200
huart2.Init.WordLength = UART_WORDLENGTH_8B;   // 8 位数据位
huart2.Init.StopBits = UART_STOPBITS_1;        // 1 个停止位
huart2.Init.Parity = UART_PARITY_NONE;         // 无奇偶校验
huart2.Init.Mode = UART_MODE_TX_RX;            // 使能发送和接收
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;   // 不使用硬件流控制
huart2.Init.OverSampling = UART_OVERSAMPLING_16; // 16倍过采样
HAL_UART_Init(&huart2);

使用特权

评论回复
7
xiaoqi000|  楼主 | 2024-12-31 02:58 | 只看该作者
发送数据:
c
复制代码
uint8_t txData[] = "Hello, USART!";
HAL_UART_Transmit(&huart2, txData, sizeof(txData) - 1, HAL_MAX_DELAY);

使用特权

评论回复
8
xiaoqi000|  楼主 | 2024-12-31 02:58 | 只看该作者
接收数据:
c
复制代码
uint8_t rxData[100];
HAL_UART_Receive(&huart2, rxData, sizeof(rxData), HAL_MAX_DELAY);

使用特权

评论回复
9
xiaoqi000|  楼主 | 2024-12-31 02:58 | 只看该作者
异步接收(中断模式):
c
复制代码
HAL_UART_Receive_IT(&huart2, rxData, sizeof(rxData));  // 启动接收中断

使用特权

评论回复
10
xiaoqi000|  楼主 | 2024-12-31 02:58 | 只看该作者
回调函数示例:

c
复制代码
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  if (huart->Instance == USART2) {
    // 处理接收到的数据
  }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

60

主题

760

帖子

0

粉丝