Pulitzer 发表于 2025-1-22 07:54

基于STM32H743的USART通信详解

STM32H743是一款高性能MCU,广泛应用于物联网、工业控制和嵌入式系统等领域。本文将以STM32H743为例,介绍USART通信的基本配置与实现方法,并提供完整的代码示例。
USART通信简介USART(通用同步异步收发器)是STM32的常用外设之一,支持串口通信功能,可以实现设备间的可靠数据传输。USART既支持同步通信,也支持异步通信,本文主要介绍异步通信。
在异步模式下,USART需要配置以下参数:

[*]波特率(Baud Rate):通信速度,通常为9600、115200等。
[*]数据位(Data Bits):每次发送的数据位数,常用8位。
[*]停止位(Stop Bits):标识数据包结束,常用1位。
[*]校验位(Parity):数据校验,可选奇校验、偶校验或无校验。
配置步骤
[*]初始化GPIO:配置USART的TX和RX引脚为复用功能。
[*]配置USART外设:设置波特率、数据位、停止位等参数。
[*]实现发送和接收功能:通过轮询、中断或DMA方式进行数据通信。
下面以USART3为例,通信波特率为115200,使用HAL库实现一个简单的串口通信功能。
实现代码#include "main.h"

UART_HandleTypeDef huart3;

/* 初始化USART3 */
void MX_USART3_UART_Init(void)
{
    huart3.Instance = USART3;
    huart3.Init.BaudRate = 115200;                  // 设置波特率
    huart3.Init.WordLength = UART_WORDLENGTH_8B;   // 数据位长度
    huart3.Init.StopBits = UART_STOPBITS_1;      // 停止位
    huart3.Init.Parity = UART_PARITY_NONE;         // 无校验位
    huart3.Init.Mode = UART_MODE_TX_RX;            // 启用发送和接收
    huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;   // 无硬件流控
    huart3.Init.OverSampling = UART_OVERSAMPLING_16;
    if (HAL_UART_Init(&huart3) != HAL_OK)
    {
      Error_Handler();
    }
}

/* 初始化GPIO */
void MX_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    /* GPIO时钟使能 */
    __HAL_RCC_GPIOB_CLK_ENABLE();

    /* 配置USART3 TX(PB10)和RX(PB11)引脚 */
    GPIO_InitStruct.Pin = GPIO_PIN_10 | GPIO_PIN_11;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

/* 主函数 */
int main(void)
{
    uint8_t data[] = "Hello, USART3!\r\n";

    HAL_Init();
    SystemClock_Config();

    MX_GPIO_Init();
    MX_USART3_UART_Init();

    while (1)
    {
      // 发送数据
      HAL_UART_Transmit(&huart3, data, sizeof(data) - 1, HAL_MAX_DELAY);

      // 接收数据
      uint8_t recvData = {0};
      if (HAL_UART_Receive(&huart3, recvData, 100, 1000) == HAL_OK)
      {
            // 回显接收到的数据
            HAL_UART_Transmit(&huart3, recvData, strlen((const char*)recvData), HAL_MAX_DELAY);
      }

      HAL_Delay(1000);// 延时1秒
    }
}
代码解析
[*]USART初始化:通过MX_USART3_UART_Init配置USART3的参数,包括波特率、数据位、停止位等。
[*]GPIO复用配置:PB10配置为USART3的TX引脚,PB11为RX引脚。
[*]发送数据:HAL_UART_Transmit函数用于发送字符串。
[*]接收数据:HAL_UART_Receive函数实现接收功能,此处设置超时时间为1秒。
[*]回显数据:接收到数据后通过串口回显,方便调试。
测试与验证通过USB转TTL模块连接到PC,使用串口调试助手,可以观察到每秒发送的字符串“Hello, USART3!”。如果发送数据到串口,也可以在终端看到回显结果。
总结本文详细介绍了基于STM32H743的USART通信配置及实现方法,并通过代码演示了发送和接收数据的基本操作。USART作为嵌入式开发中常用的通信方式,灵活性高、配置简单,是开发者的得力工具。

公羊子丹 发表于 2025-1-22 07:55

终于找到USART的教程了,代码讲得很清楚,收藏!

周半梅 发表于 2025-1-22 07:55

有没有用LL库实现USART的教程?听说效率更高。

帛灿灿 发表于 2025-1-22 07:55

USART能不能同时支持多个波特率通信?

童雨竹 发表于 2025-1-22 07:56

刚好在学STM32H7系列,这篇文章太及时了!

万图 发表于 2025-1-22 07:56

能不能加个DMA的实现版本?数据量大的时候好像更方便。

Wordsworth 发表于 2025-1-22 07:56

USART收发的时候会不会出现数据丢失的问题?

Bblythe 发表于 2025-1-22 07:56

STM32的USART比单片机强多了,感谢分享!

Uriah 发表于 2025-1-22 07:57

如果波特率设置不对,是不是通信就完全失败了?

Clyde011 发表于 2025-1-22 07:57

串口调试助手用哪个比较好?推荐一个呗。

SophiaOP 发表于 2025-1-22 08:01

我用的lcom

Amazingxixixi 发表于 2025-1-24 12:52

学习一下,提升技能,新年快乐

Amazingxixixi 发表于 2025-1-24 12:53

学习一下,提升技能,新年快乐
页: [1]
查看完整版本: 基于STM32H743的USART通信详解