[STM32H7] 基于STM32H743的USART通信详解与实现

[复制链接]
 楼主| Wordsworth 发表于 2025-1-16 09:53 | 显示全部楼层 |阅读模式
STMicroelectronics的STM32H7系列凭借其强大的性能和丰富的外设广泛应用于嵌入式系统开发中。STM32H743是该系列中的高性能微控制器,支持高速的USART通信,非常适合用于数据采集、设备互联等场景。本文将通过代码实例,详细讲解如何基于STM32H743实现USART通信。
1. STM32H743简介STM32H743是基于ARM Cortex-M7内核的高性能微控制器,主频高达480MHz,支持双精度FPU和L1缓存,其特点包括:
  • 最大2MB的闪存和1MB的SRAM
  • 支持多达8个USART模块
  • 支持最高16 Mbps的高速通信
2. USART通信基础USART(通用同步异步接收器)是一种用于串行通信的硬件模块,可在主机与外设之间实现高效的数据交换。USART支持异步通信模式,常用于设备间的数据交互。
3. STM32H743 USART配置与实现通过STM32CubeMX和HAL库,我们可以快速完成USART的配置与代码实现。以下为具体代码示例。
代码实现
  1. #include "main.h"
  2. #include <string.h>

  3. // 定义USART句柄
  4. UART_HandleTypeDef huart3;

  5. // USART初始化函数
  6. void MX_USART3_UART_Init(void)
  7. {
  8.     huart3.Instance = USART3;
  9.     huart3.Init.BaudRate = 115200;  // 波特率
  10.     huart3.Init.WordLength = UART_WORDLENGTH_8B;  // 数据位
  11.     huart3.Init.StopBits = UART_STOPBITS_1;  // 停止位
  12.     huart3.Init.Parity = UART_PARITY_NONE;  // 校验位
  13.     huart3.Init.Mode = UART_MODE_TX_RX;  // 发送和接收模式
  14.     huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;  // 无硬件流控
  15.     huart3.Init.OverSampling = UART_OVERSAMPLING_16;  // 过采样
  16.     if (HAL_UART_Init(&huart3) != HAL_OK)
  17.     {
  18.         Error_Handler();
  19.     }
  20. }

  21. // 发送字符串数据
  22. void UART_SendString(const char* str)
  23. {
  24.     HAL_UART_Transmit(&huart3, (uint8_t*)str, strlen(str), HAL_MAX_DELAY);
  25. }

  26. // 接收字符串数据
  27. void UART_ReceiveString(char* buffer, uint16_t buffer_size)
  28. {
  29.     HAL_UART_Receive(&huart3, (uint8_t*)buffer, buffer_size, HAL_MAX_DELAY);
  30. }

  31. // 主函数
  32. int main(void)
  33. {
  34.     HAL_Init();
  35.     SystemClock_Config();
  36.     MX_USART3_UART_Init();

  37.     char rx_buffer[100];  // 接收缓冲区

  38.     UART_SendString("USART Communication Initialized!\r\n");

  39.     while (1)
  40.     {
  41.         memset(rx_buffer, 0, sizeof(rx_buffer));  // 清空缓冲区

  42.         // 接收数据并回显
  43.         UART_ReceiveString(rx_buffer, sizeof(rx_buffer));
  44.         UART_SendString("Received: ");
  45.         UART_SendString(rx_buffer);
  46.         UART_SendString("\r\n");
  47.     }
  48. }
代码说明
  • USART初始化:通过MX_USART3_UART_Init函数,配置USART3模块的波特率、数据位、停止位等参数。
  • 数据发送:使用HAL_UART_Transmit发送字符串数据。
  • 数据接收:通过HAL_UART_Receive接收外设发送的数据。
  • 数据回显:将接收到的数据通过USART发送回主机,用于验证通信效果。
4. 测试与优化测试时,可使用串口调试助手或终端工具(如Tera Term)与开发板进行交互,验证数据收发的正确性。进一步优化可以:
  • 使用中断模式接收数据,提高实时性
  • 配合DMA减少CPU占用率
  • 增加错误检测机制,确保通信可靠性
5. 总结本文通过详细的代码实例,介绍了如何基于STM32H743实现基本的USART通信功能。USART作为嵌入式系统中重要的通信接口,与STM32H743强大的性能结合,为复杂系统开发提供了灵活可靠的解决方案。

公羊子丹 发表于 2025-1-16 09:53 | 显示全部楼层
STM32H743的性能确实强,USART通信用着感觉很流畅!
周半梅 发表于 2025-1-16 09:53 | 显示全部楼层
这个例子太实用了,刚好我想用USART收发传感器数据。
帛灿灿 发表于 2025-1-16 09:53 | 显示全部楼层
楼主能不能分享一下如何用DMA优化USART收发的代码
童雨竹 发表于 2025-1-16 09:54 | 显示全部楼层
有没有更高波特率的配置例子,比如921600?想试试高性能。
万图 发表于 2025-1-16 09:54 | 显示全部楼层
H7系列真的很强,用来做工业控制简直太合适了!
Bblythe 发表于 2025-1-16 09:54 | 显示全部楼层
最近用USART和ESP32通信,感觉这代码很合适,改改就能用了。
Pulitzer 发表于 2025-1-16 09:54 | 显示全部楼层
STM32CubeMX配置USART确实方便,不过调试起来有点细节要注意。
Uriah 发表于 2025-1-16 09:54 | 显示全部楼层
楼主有没有试过用USART的硬件流控?用RTS/CTS效果怎么样?
Clyde011 发表于 2025-1-16 09:55 | 显示全部楼层
建议加入一些错误检测的例子,比如帧错误和超时处理。
Amazingxixixi 发表于 2025-1-21 17:26 | 显示全部楼层
学习一下啊,还有好多需要学习的。
SophiaOP 发表于 2025-1-22 21:26 来自手机 | 显示全部楼层
h7的串口波特率能到多高?
花间一壶酒sd 发表于 2025-1-31 23:39 | 显示全部楼层
STM32H743 支持 USART 的 异步通信模式,主要用于设备间的串行数据交换。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

144

主题

5783

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部