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

[复制链接]
2297|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
复制代码
  1. #include "main.h"
  2. #include "string.h"

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

  6. /* 串口初始化函数 */
  7. void USART1_Init(void)
  8. {
  9.     GPIO_InitTypeDef GPIO_InitStruct = {0};
  10.     USART_InitTypeDef USART_InitStruct = {0};
  11.    
  12.     /* 启用USART1外设和GPIOA时钟 */
  13.     __HAL_RCC_USART1_CLK_ENABLE();
  14.     __HAL_RCC_GPIOA_CLK_ENABLE();

  15.     /* 配置PA9为USART1_TX,PA10为USART1_RX */
  16.     GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10;
  17.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  18.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  19.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  20.    
  21.     /* 配置USART1 */
  22.     USART_InitStruct.BaudRate = 115200;
  23.     USART_InitStruct.WordLength = USART_WORDLENGTH_8B;
  24.     USART_InitStruct.StopBits = USART_STOPBITS_1;
  25.     USART_InitStruct.Parity = USART_PARITY_NONE;
  26.     USART_InitStruct.HwFlowCtl = USART_HWCONTROL_NONE;
  27.     USART_InitStruct.Mode = USART_MODE_TX_RX;
  28.     HAL_USART_Init(&USART_InitStruct);
  29. }

  30. /* 主程序 */
  31. int main(void)
  32. {
  33.     /* HAL初始化 */
  34.     HAL_Init();
  35.    
  36.     /* 配置系统时钟 */
  37.     SystemClock_Config();
  38.    
  39.     /* 初始化串口 */
  40.     USART1_Init();
  41.    
  42.     /* 接收和发送数据 */
  43.     uint8_t data;
  44.    
  45.     while (1)
  46.     {
  47.         /* 等待接收到数据 */
  48.         if (HAL_USART_Receive(&husart1, &data, 1, HAL_MAX_DELAY) == HAL_OK)
  49.         {
  50.             /* 接收到数据后回显 */
  51.             HAL_USART_Transmit(&husart1, &data, 1, HAL_MAX_DELAY);
  52.         }
  53.     }
  54. }

  55. /* 系统时钟配置函数 */
  56. void SystemClock_Config(void)
  57. {
  58.     /* 代码略,默认时钟设置 */
  59. }

  60. /* HAL库中断处理函数 */
  61. void HAL_MspInit(void)
  62. {
  63.     /* 初始化硬件抽象层(HAL) */
  64.     /* 代码略 */
  65. }
代码解析
  • 串口初始化: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 | 显示全部楼层
这篇文章写得很好,特别是代码部分,直接就能复制粘贴,省了不少时间。
万图 发表于 2025-1-9 07:47 | 显示全部楼层
STM32的串口配置一开始看起来有点复杂,但通过这个例子轻松理解了。
Wordsworth 发表于 2025-1-9 07:47 | 显示全部楼层
非常详细,尤其是每一步操作都写得清清楚楚,点赞!
Pulitzer 发表于 2025-1-9 07:47 | 显示全部楼层
用STM32做串口通信真是太方便了,我一直以为需要外接复杂的模块。
Bblythe 发表于 2025-1-9 07:47 | 显示全部楼层
今天学会了如何用STM32与PC通信,真的很开心!
Uriah 发表于 2025-1-9 07:48 | 显示全部楼层
不太懂HAL库的操作,看到这个教程后,串口部分终于搞明白了。
Clyde011 发表于 2025-1-9 07:48 | 显示全部楼层
虽然是个简单的回显程序,但我觉得它是我理解STM32的重要一步。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

192

主题

6453

帖子

1

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