打印
[STM32H7]

STM32H743入门教程:基于CubeMX和HAL库的UART通信实现

[复制链接]
29|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
公羊子丹|  楼主 | 2024-11-20 07:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32H743是一款高性能的微控制器,广泛应用于嵌入式系统开发中。本文将以实现UART通信为例,详细介绍如何使用STM32CubeMX生成代码,并结合HAL库完成基本的UART通信功能。本教程适合初学者,希望能帮助你快速上手STM32H743开发。
一、硬件与软件环境准备
  • 硬件环境

    • STM32H743开发板
    • USB转串口模块
    • 杜邦线若干
    • PC机(安装串口调试助手)
  • 软件环境

    • STM32CubeMX
    • STM32CubeIDE
    • 串口调试工具(如SSCOM或SecureCRT)
二、UART通信简介UART(通用异步收发传输)是一种常见的串行通信协议,使用简单,广泛应用于嵌入式开发中。在STM32中,UART由USART模块支持,可配置为异步模式,实现设备之间的数据传输。
三、开发步骤1. 使用STM32CubeMX配置工程
  • 打开STM32CubeMX,创建一个新的工程,选择STM32H743的芯片型号。
  • 在引脚配置界面,启用USART3,并设置其引脚为Tx(PD8)和Rx(PD9)。
  • 设置时钟树,将HCLK配置为400MHz。
  • 在“Configuration”界面设置USART3的参数:波特率为115200,数据位为8位,无校验,1个停止位。
  • 生成代码,选择STM32CubeIDE作为工具链。
2. 编写代码生成代码后,打开STM32CubeIDE,我们将在生成的工程基础上进行修改。目标是实现通过UART发送和接收数据。
以下是核心代码:
#include "main.h"
#include "string.h"

UART_HandleTypeDef huart3;
char rxBuffer[100]; // 接收缓冲区

// UART回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
    if (huart->Instance == USART3) {
        HAL_UART_Transmit(&huart3, (uint8_t*)rxBuffer, strlen(rxBuffer), HAL_MAX_DELAY); // 回显收到的数据
        memset(rxBuffer, 0, sizeof(rxBuffer)); // 清空缓冲区
        HAL_UART_Receive_IT(&huart3, (uint8_t*)rxBuffer, sizeof(rxBuffer) - 1); // 再次启用接收中断
    }
}

int main(void) {
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_USART3_UART_Init();

    // 初始化接收中断
    HAL_UART_Receive_IT(&huart3, (uint8_t*)rxBuffer, sizeof(rxBuffer) - 1);

    while (1) {
        // 主循环可以进行其他任务
        HAL_Delay(1000);
    }
}

void SystemClock_Config(void) {
    // 时钟配置代码由CubeMX自动生成,此处略。
}

void MX_GPIO_Init(void) {
    // GPIO初始化代码由CubeMX自动生成,此处略。
}

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;
    huart3.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
    huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
    if (HAL_UART_Init(&huart3) != HAL_OK) {
        Error_Handler();
    }
}
3. 下载与测试
  • 将代码烧录到STM32H743开发板中。
  • 使用USB转串口模块连接开发板的USART3引脚到PC。
  • 打开串口调试助手,设置波特率为115200,选择正确的串口号。
  • 发送任意字符串,观察是否能收到相同的数据回显。
四、关键点分析
  • 中断接收
    本文使用了UART接收中断,避免了在主循环中持续轮询UART状态,从而提高了代码的效率。
  • 缓冲区管理
    接收缓冲区的清理和重新初始化是确保通信稳定的关键。
  • 可扩展性
    代码结构清晰,可以很容易地扩展为支持多种通信协议的系统。

五、总结通过本次教程,我们完成了STM32H743的UART通信实现。从中可以学习到CubeMX的基本使用方法、HAL库的配置技巧以及嵌入式系统中常见的通信实现方案。希望本文对你有所帮助,祝你的开发之旅顺利!

使用特权

评论回复
沙发
周半梅| | 2024-11-20 07:30 | 只看该作者
哇,这个教程讲得太细了,正好帮我解决了UART调试的问题!

使用特权

评论回复
板凳
帛灿灿| | 2024-11-20 07:30 | 只看该作者
刚入手H743,看完感觉没那么难了,感谢分享!

使用特权

评论回复
地板
童雨竹| | 2024-11-20 07:31 | 只看该作者
这代码逻辑清晰,我准备拿来改改用在我的项目上。

使用特权

评论回复
5
万图| | 2024-11-20 07:31 | 只看该作者
有没有可能讲讲DMA方式的UART通信?更适合大数据量传输啊。

使用特权

评论回复
6
Wordsworth| | 2024-11-20 07:31 | 只看该作者
CubeMX配置时钟总让我头疼,这篇文章的设置思路学到了!

使用特权

评论回复
7
Pulitzer| | 2024-11-20 07:31 | 只看该作者
中断的使用太棒了,我以前总是用轮询,效率低得要死。

使用特权

评论回复
8
Bblythe| | 2024-11-20 07:32 | 只看该作者
HAL库虽然简单,但用好确实得费点功夫,这篇教程给力!

使用特权

评论回复
9
Uriah| | 2024-11-20 07:32 | 只看该作者
看完这个教程,感觉可以直接拿来教初学者了。

使用特权

评论回复
10
Clyde011| | 2024-11-20 07:32 | 只看该作者
有没有可能再加一个调试LED的方法,确认通信是否正常?

使用特权

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

本版积分规则

64

主题

4058

帖子

1

粉丝