Bootstrap

STM32 基于HAL库和STM32cubeIDE的应用教程 (三)--串口的使用

如果有什么不懂的地方欢迎私聊博主,欢迎小白,博主必一一解答

在 STM32 中,UART(通用异步收发传输)是一种常用的串行通信接口,用于与其他设备(如传感器、计算机、其他微控制器等)进行数据交换。STM32 提供了丰富的 HAL 庂来配置和使用 UART 接口,本文将详细介绍如何使用 STM32 HAL 库进行 UART 编程。

1. 环境准备

确保您已经按照以下步骤准备好开发环境:

  • STM32CubeIDE 已安装。
  • 创建了 STM32 项目,并配置了目标 STM32 微控制器或开发板。

2. 配置 UART 外设

通过 STM32CubeMX 或 STM32CubeIDE 配置 UART 外设,STM32CubeMX 会自动生成初始化代码,简化配置流程。

步骤:
  1. 打开 STM32CubeIDE,创建一个新项目,选择目标 MCU 或开发板(如 STM32F103C8)。
  2. 打开 Pinout & Configuration 选项卡,选择 UART 引脚,通常是 TX(发送)和 RX(接收)。例如,选择 PA9USART1_TX,选择 PA10USART1_RX
  3. 进入 Configuration 选项卡,配置 UART 参数:
    • 波特率:常见的波特率有 9600、115200 等。
    • 数据位:通常为 8 位。
    • 停止位:常用的是 1 位或 2 位。
    • 校验位:可以选择无校验、奇校验或偶校验。
  4. 点击 Project,设置项目名称和存储路径,选择 STM32CubeIDE 作为 IDE,选择 HAL 库作为代码生成选项。
  5. 点击 Generate Code,STM32CubeMX 会生成代码。

3. 编写 UART 程序

生成代码后,您可以在 STM32CubeIDE 中开始编写应用程序。UART 的基本操作包括初始化、发送数据、接收数据。

3.1 UART 初始化

在 STM32CubeMX 中配置好 UART 外设后,STM32CubeMX 会生成初始化代码,在 usart.c 中,您可以看到类似以下的代码:

步骤:
  1. 打开 STM32CubeIDE,创建一个新项目,选择目标 MCU 或开发板(如 STM32F103C8)。
  2. 打开 Pinout & Configuration 选项卡,选择 UART 引脚,通常是 TX(发送)和 RX(接收)。例如,选择 PA9USART1_TX,选择 PA10USART1_RX
  3. 进入 Configuration 选项卡,配置 UART 参数:
    • 波特率:常见的波特率有 9600、115200 等。
    • 数据位:通常为 8 位。
    • 停止位:常用的是 1 位或 2 位。
    • 校验位:可以选择无校验、奇校验或偶校验。
  4. 点击 Project,设置项目名称和存储路径,选择 STM32CubeIDE 作为 IDE,选择 HAL 库作为代码生成选项。
  5. 点击 Generate Code,STM32CubeMX 会生成代码。

3. 编写 UART 程序

生成代码后,您可以在 STM32CubeIDE 中开始编写应用程序。UART 的基本操作包括初始化、发送数据、接收数据。

3.1 UART 初始化

在 STM32CubeMX 中配置好 UART 外设后,STM32CubeMX 会生成初始化代码,在 usart.c 中,您可以看到类似以下的代码:

/* USART1 init function */
void MX_USART1_UART_Init(void)
{
    huart1.Instance = USART1; //串口句柄
    huart1.Init.BaudRate = 9600; //设置波特率
    huart1.Init.WordLength = UART_WORDLENGTH_8B; //设置8位数据位
    huart1.Init.StopBits = UART_STOPBITS_1; //设置1位停止位
    huart1.Init.Parity = UART_PARITY_NONE;  //设置无奇偶校验
    huart1.Init.Mode = UART_MODE_TX_RX;     //模式为收发模式
    huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; //设置无硬件流控
    if (HAL_UART_Init(&huart1) != HAL_OK)  //调用串口初始化函数
    {
        Error_Handler();
    }
}
3.2 UART 发送数据

通过 UART 发送数据,使用 HAL_UART_Transmit 函数

uint8_t data[] = "Hello, STM32!";

if (HAL_UART_Transmit(&huart1, data, sizeof(data)-1, HAL_MAX_DELAY) != HAL_OK)
{
    // 发送失败
}

 参数说明

  • huart1: UART 外设句柄。
  • data: 发送的数据数组。
  • sizeof(data)-1: 数据长度(去掉最后的 \0)。
  • HAL_MAX_DELAY: 超时设置。
3.3 UART 接收数据

通过 UART 接收数据,使用 HAL_UART_Receive 函数。

 

uint8_t received_data[10];  // 用于接收数据的缓冲区

if (HAL_UART_Receive(&huart1, received_data, sizeof(received_data), HAL_MAX_DELAY) != HAL_OK)
{
    // 接收失败
}

参数说明

  • huart1: UART 外设句柄。
  • received_data: 接收的数据缓冲区。
  • sizeof(received_data): 缓冲区大小。
  • HAL_MAX_DELAY: 超时设置,最大等待时间。
3.4 异常处理与超时

通过设置超时时间。如果操作超时,HAL_UART_TransmitHAL_UART_Receive 会返回 HAL_ERRORHAL_TIMEOUT 错误。可以使用 HAL_UART_ErrorCallback 来捕获错误:

void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
    if (huart->Instance == USART1)
    {
        // 处理错误(如溢出、帧错误、校验错误等)
    }
}

4. 配置中断模式(可选)

UART 接收还可以通过中断或 DMA 进行处理,从而实现异步接收。以下是通过中断模式接收数据的配置和代码示例。

4.1 配置中断

在 STM32CubeMX 中启用 UART 的接收中断。选择 NVIC Settings,启用 USART1_IRQn 中断。

4.2 编写中断服务程序

当数据接收完成时,微控制器会触发中断,跳转到中断服务程序。示例如下:

void USART1_IRQHandler(void)
{
    HAL_UART_IRQHandler(&huart1);  // 调用 HAL 库的中断处理函数
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart->Instance == USART1)
    {
        // 接收到数据后,执行回调函数
        // 处理接收到的数据
    }
}
4.3 启动接收中断

在主程序中启动 UART 的接收中断:

HAL_UART_Receive_IT(&huart1, received_data, sizeof(received_data));

5. 完整的示例代码

以下是一个完整的示例,演示如何使用 UART 发送和接收数据:

#include "main.h"
#include "usart.h"
#include "gpio.h"

// 发送数据
void UART_Transmit(uint8_t* data, uint16_t size)
{
    if (HAL_UART_Transmit(&huart1, data, size, HAL_MAX_DELAY) != HAL_OK)
    {
        // 错误处理
    }
}

// 接收数据
void UART_Receive(uint8_t* buffer, uint16_t size)
{
    if (HAL_UART_Receive(&huart1, buffer, size, HAL_MAX_DELAY) != HAL_OK)
    {
        // 错误处理
    }
}

int main(void)
{
    // 初始化 HAL 库
    HAL_Init();

    // 配置系统时钟
    SystemClock_Config();

    // 初始化 GPIO 和 UART 外设
    MX_GPIO_Init();
    MX_USART1_UART_Init();

    uint8_t send_data[] = "Hello from STM32!";
    uint8_t recv_data[50];

    // 发送数据
    UART_Transmit(send_data, sizeof(send_data)-1);

    // 接收数据
    UART_Receive(recv_data, sizeof(recv_data));

    // 在这里可以处理接收到的数据
    // 例如,将接收到的数据通过 UART 再次发送
    UART_Transmit(recv_data, sizeof(recv_data));

    while (1)
    {
        // 主循环
    }
}

6. 小结

  1. UART 初始化:通过 STM32CubeMX 配置 UART 外设,并在 usart.c 中生成初始化代码。
  2. 数据发送与接收:使用 HAL_UART_TransmitHAL_UART_Receive 进行同步数据传输。
  3. 中断模式:启用 UART 接收中断,实现异步数据接收。
  4. DMA模式:可进一步通过 DMA 进行大数据量的高效传输。

通过上述步骤,您可以实现 UART 的基本使用。可以根据需求进一步优化,例如通过 DMA 实现更高效的通信,或通过 RTOS 中的任务管理 UART 通信。

;