打印
[STM32F4]

如何使用STM32F407VGT6实现串口通信(UART)

[复制链接]
75|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
周半梅|  楼主 | 2025-1-9 07:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32F407VGT6是STMicroelectronics推出的高性能微控制器,广泛应用于工业控制、通信、消费电子等领域。作为STM32F4系列的一员,STM32F407VGT6具备强大的计算能力和丰富的外设,适合用于处理高速数据和复杂算法。在本篇文章中,我们将通过一个简单的串口通信(UART)示例,演示如何在STM32F407VGT6上进行串口数据的发送和接收。
项目背景串口通信(UART)是一种广泛使用的异步通信协议,可以在两个设备之间传输数据。本项目中,我们将使用STM32F407VGT6的UART外设来实现与PC之间的串口通信,利用STM32的硬件特性实现数据的发送和接收。
硬件要求
  • STM32F407VGT6开发板(如STM32F4 Discovery)
  • 一台PC,安装有串口通信软件(如Tera Term)
  • ST-Link编程器(用于烧录程序)
  • 跳线与适配器(将STM32的UART引脚连接到PC的串口)
软件要求
  • STM32CubeMX:用于配置STM32硬件的工具
  • STM32CubeIDE:用于编写、调试和下载代码
  • 串口调试工具(如Tera Term)
步骤一:配置STM32CubeMX
  • 创建新项目:打开STM32CubeMX,选择STM32F407VGT6作为目标芯片,创建一个新的工程。
  • 配置引脚:在“Pinout & Configuration”界面中,配置PA9(TX)和PA10(RX)为串口(USART1)功能。
  • 启用USART1外设:在“Peripherals”中,找到USART1,并将其配置为异步模式,设置波特率为115200,数据位8,停止位1,校验位无。
  • 配置系统时钟:在“Clock Configuration”中,默认设置已满足要求,不需要做太多改动。
  • 生成代码:在“Project”设置中选择IDE工具(如STM32CubeIDE),生成代码。

步骤二:编写代码在STM32CubeIDE中打开生成的项目文件,开始编写具体的应用代码。我们将实现一个简单的串口回显程序,当从PC串口发送数据时,STM32将接收到的数据回传给PC。
代码结构
  • main.c:主程序文件,包含初始化USART并进行串口通信的代码。
  • stm32f4xx_hal_conf.h:HAL库配置文件。
以下是完整的代码示例:
c
复制代码
#include "main.h"
#include "string.h"

/* 串口接收缓冲区 */
#define RX_BUFFER_SIZE 100
uint8_t rxBuffer[RX_BUFFER_SIZE];

/* 串口初始化函数 */
void USART1_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    USART_InitTypeDef USART_InitStruct = {0};
   
    /* 启用USART1外设和GPIOA时钟 */
    __HAL_RCC_USART1_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();

    /* 配置PA9为USART1_TX,PA10为USART1_RX */
    GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
   
    /* 配置USART1 */
    USART_InitStruct.BaudRate = 115200;
    USART_InitStruct.WordLength = USART_WORDLENGTH_8B;
    USART_InitStruct.StopBits = USART_STOPBITS_1;
    USART_InitStruct.Parity = USART_PARITY_NONE;
    USART_InitStruct.HwFlowCtl = USART_HWCONTROL_NONE;
    USART_InitStruct.Mode = USART_MODE_TX_RX;
    HAL_USART_Init(&USART_InitStruct);
}

/* 主程序 */
int main(void)
{
    /* HAL初始化 */
    HAL_Init();
   
    /* 配置系统时钟 */
    SystemClock_Config();
   
    /* 初始化串口 */
    USART1_Init();
   
    /* 接收和发送数据 */
    uint8_t data;
   
    while (1)
    {
        /* 等待接收到数据 */
        if (HAL_USART_Receive(&husart1, &data, 1, HAL_MAX_DELAY) == HAL_OK)
        {
            /* 接收到数据后回显 */
            HAL_USART_Transmit(&husart1, &data, 1, HAL_MAX_DELAY);
        }
    }
}

/* 系统时钟配置函数 */
void SystemClock_Config(void)
{
    /* 代码略,默认时钟设置 */
}

/* HAL库中断处理函数 */
void HAL_MspInit(void)
{
    /* 初始化硬件抽象层(HAL) */
    /* 代码略 */
}
代码解析
  • 串口初始化:USART1_Init()函数配置了PA9和PA10引脚,分别作为串口的TX(发送)和RX(接收)引脚。然后,配置USART1外设,设置波特率为115200,数据位为8位,停止位为1位,无校验位,使用异步模式。
  • 主程序:在主程序中,我们使用HAL_USART_Receive()函数接收串口数据,收到数据后,使用HAL_USART_Transmit()函数将数据回传给PC,实现串口回显功能。循环中等待接收数据,一旦接收到数据,立即回传。
  • 系统时钟配置:在SystemClock_Config()中,我们可以根据需求配置系统时钟,这里为了简化,直接使用STM32默认的时钟配置。

步骤三:编译和下载
  • 编译代码:在STM32CubeIDE中编译程序,确保没有编译错误。
  • 下载程序:使用ST-Link调试器将程序下载到STM32F407VGT6开发板中。
  • 连接串口:将STM32的PA9和PA10引脚通过串口线连接到PC,确保连接正确,并在PC上安装串口通信软件(如Tera Term)。
  • 调试:打开Tera Term,选择正确的COM端口,设置波特率为115200。发送任意字符,STM32将回显收到的数据。

常见问题及解决办法
  • 串口无法通信:确认STM32的PA9和PA10引脚已正确连接至PC串口,波特率和设置是否匹配。
  • 数据接收乱码:检查波特率、数据位、停止位和校验位设置是否与PC端一致。
  • 串口驱动问题:确保PC上已正确安装串口驱动,并且选择了正确的COM端口。

总结通过这个简单的串口通信示例,我们成功实现了STM32F407VGT6与PC之间的双向数据通信。串口通信是嵌入式系统中常见的通信方式,掌握了这一基本技能后,您可以在STM32开发中实现更加复杂的数据交换和控制功能。





使用特权

评论回复
沙发
公羊子丹| | 2025-1-9 07:46 | 只看该作者
太棒了!这个串口回显功能实用简单,马上就可以用到我的项目中!

使用特权

评论回复
板凳
帛灿灿| | 2025-1-9 07:46 | 只看该作者
看完这个教程,我的串口通信终于搞明白了,感谢作者分享!

使用特权

评论回复
地板
童雨竹| | 2025-1-9 07:46 | 只看该作者
这篇文章写得很好,特别是代码部分,直接就能复制粘贴,省了不少时间。

使用特权

评论回复
5
万图| | 2025-1-9 07:47 | 只看该作者
STM32的串口配置一开始看起来有点复杂,但通过这个例子轻松理解了。

使用特权

评论回复
6
Wordsworth| | 2025-1-9 07:47 | 只看该作者
非常详细,尤其是每一步操作都写得清清楚楚,点赞!

使用特权

评论回复
7
Pulitzer| | 2025-1-9 07:47 | 只看该作者
用STM32做串口通信真是太方便了,我一直以为需要外接复杂的模块。

使用特权

评论回复
8
Bblythe| | 2025-1-9 07:47 | 只看该作者
今天学会了如何用STM32与PC通信,真的很开心!

使用特权

评论回复
9
Uriah| | 2025-1-9 07:48 | 只看该作者
不太懂HAL库的操作,看到这个教程后,串口部分终于搞明白了。

使用特权

评论回复
10
Clyde011| | 2025-1-9 07:48 | 只看该作者
虽然是个简单的回显程序,但我觉得它是我理解STM32的重要一步。

使用特权

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

本版积分规则

42

主题

3749

帖子

0

粉丝