打印
[STM32H7]

基于STM32H743的USART通信详解

[复制链接]
58|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Pulitzer|  楼主 | 2025-1-22 07:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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[100] = {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能不能同时支持多个波特率通信?

使用特权

评论回复
5
童雨竹| | 2025-1-22 07:56 | 只看该作者
刚好在学STM32H7系列,这篇文章太及时了!

使用特权

评论回复
6
万图| | 2025-1-22 07:56 | 只看该作者
能不能加个DMA的实现版本?数据量大的时候好像更方便。

使用特权

评论回复
7
Wordsworth| | 2025-1-22 07:56 | 只看该作者
USART收发的时候会不会出现数据丢失的问题?

使用特权

评论回复
8
Bblythe| | 2025-1-22 07:56 | 只看该作者
STM32的USART比单片机强多了,感谢分享!

使用特权

评论回复
9
Uriah| | 2025-1-22 07:57 | 只看该作者
如果波特率设置不对,是不是通信就完全失败了?

使用特权

评论回复
10
Clyde011| | 2025-1-22 07:57 | 只看该作者
串口调试助手用哪个比较好?推荐一个呗。

使用特权

评论回复
11
SophiaOP| | 2025-1-22 08:01 | 只看该作者
我用的lcom

使用特权

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

本版积分规则

37

主题

3721

帖子

0

粉丝