打印
[STM32F4]

使用 STM32F4 系列实现 UART 串口通信

[复制链接]
59|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Wordsworth|  楼主 | 2025-1-21 07:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在嵌入式系统中,UART(通用异步收发传输器)是最常用的通信接口之一。它的简单性、低成本和广泛的支持使其在嵌入式应用中得到了广泛的应用。STM32F4 系列微控制器,作为一款基于 ARM Cortex-M4 内核的高性能 MCU,内置多个 UART 接口,能够轻松实现串口通信。本篇文章将介绍如何在 STM32F4 上实现基本的 UART 串口通信功能,并提供一个示例代码来展示如何使用 STM32 HAL 库配置和使用 UART。
1. STM32F4 系列简介STM32F4 系列是 STMicroelectronics 推出的基于 ARM Cortex-M4 核心的微控制器,拥有高达 180 MHz 的主频和丰富的外设接口。它广泛应用于各种嵌入式系统,如工业控制、汽车电子、通信设备等。STM32F4 系列不仅具备强大的计算能力,还集成了多个串口(USART),使其在处理通信任务时非常高效。
2. 系统设计与架构本项目的目标是使用 STM32F4 系列的 UART 串口进行数据通信。我们将 STM32F4 作为串口的主机,通过 UART 向外部设备发送数据,并接收外部设备返回的数据。此功能可以应用于串口调试、传感器数据采集、无线通信等场景。
我们将通过以下步骤实现 UART 串口通信:
  • 配置 UART 外设:选择一个 UART 接口并设置其波特率、数据位、停止位等参数。
  • 串口发送数据:编写代码通过 UART 发送数据。
  • 串口接收数据:通过中断或轮询的方式接收 UART 数据。
  • 测试与调试:使用串口调试工具进行测试,确保通信正常。
3. 硬件连接在 STM该函数等待接收一个字节,并返回接收到的字符。
4.4. 主函数在主函数中,我们可以调用上述函数进行数据发送和接收。32F4 中,UART 接口通常通过两个引脚(TX 和 RX)与外部设备连接:
  • TX:STM32F4 的 TX 引脚,用于发送数据。
  • RX:STM32F4 的 RX 引脚,用于接收数据。
假设我们使用的是 STM32F407VG 型号,它具有多个 UART 外设,我们可以选择其中一个(例如 UART1)进行串口通信。
4. 配置与代码实现首先,我们可以使用 STM32CubeMX 工具进行外设配置,选择 UART1,并设置适当的波特率(例如 9600 bps)、数据位(8 位)、停止位(1 位)。然后生成初始化代码框架。接下来,我们编写实际的代码,完成串口发送和接收功能。
4.1. UART 初始化代码
#include "main.h"

// UART 句柄
UART_HandleTypeDef huart1;

// 初始化 UART1
void UART1_Init(void)
{
    huart1.Instance = USART1;
    huart1.Init.BaudRate = 9600;
    huart1.Init.WordLength = UART_WORDLENGTH_8B;
    huart1.Init.StopBits = UART_STOPBITS_1;
    huart1.Init.Parity = UART_PARITY_NONE;
    huart1.Init.Mode = UART_MODE_TX_RX;
    huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart1.Init.OverSampling = UART_OVERSAMPLING_16;

    if (HAL_UART_Init(&huart1) != HAL_OK) {
        Error_Handler();
    }
}
这段代码将 UART1 配置为 9600 波特率,8 位数据,1 位停止位,并启用 TX/RX 模式。
4.2. 发送数据通过 HAL_UART_Transmit 函数,可以向 UART 发送数据。以下代码示例展示了如何通过 UART1 发送字符串数据。
// 发送字符串数据
void UART_SendString(char *str)
{
    while (*str)
    {
        HAL_UART_Transmit(&huart1, (uint8_t *)str++, 1, HAL_MAX_DELAY);
    }
}
此函数逐个字符发送字符串,直到字符串结束。
4.3. 接收数据可以通过轮询方式或中断方式接收数据。以下代码展示了使用轮询方式接收一个字符。
// 接收一个字符
char UART_ReceiveChar(void)
{
    uint8_t receivedByte;
    if (HAL_UART_Receive(&huart1, &receivedByte, 1, HAL_MAX_DELAY) == HAL_OK)
    {
        return (char)receivedByte;
    }
    return 0;
}
该函数等待接收一个字节,并返回接收到的字符。
4.4. 主函数在主函数中,我们可以调用上述函数进行数据发送和接收
int main(void)
{
    HAL_Init();
    UART1_Init();

    // 发送欢迎消息
    UART_SendString("Hello, STM32 UART!\r\n");

    while (1)
    {
        // 接收数据并回显
        char receivedChar = UART_ReceiveChar();
        if (receivedChar != 0)
        {
            UART_SendString("Received: ");
            UART_SendString(&receivedChar);
            UART_SendString("\r\n");
        }
    }
}
在该主函数中,首先初始化 UART1,然后发送一个字符串“Hello, STM32 UART!”。接着,进入一个无限循环,不断接收数据并回显到串口。
5. 测试与调试为了测试 UART 串口通信功能,可以使用串口调试工具(如 PuTTY、Tera Term 或 STM32CubeProgrammer)连接到 STM32 的 UART1 接口。配置相应的波特率和参数后,观察串口的发送和接收情况,确保数据正确发送和接收。
6. 总结本文介绍了如何使用 STM32F4 系列微控制器实现 UART 串口通信。通过配置 UART 外设,编写数据发送与接收函数,我们可以轻松实现基于 UART 的数据传输。这种通信方式广泛应用于嵌入式系统中,如与外部设备通信、调试信息输出、传感器数据采集等场景。

使用特权

评论回复
沙发
公羊子丹| | 2025-1-21 07:57 | 只看该作者
这个教程对我帮助很大!我最近也在用 STM32F4 进行串口通信,遇到一些配置问题,这篇文章解答了我的疑惑。

使用特权

评论回复
板凳
周半梅| | 2025-1-21 07:58 | 只看该作者
感谢分享!代码很清晰,特别是那个接收字符的部分,我在项目中也用到了类似的功能。

使用特权

评论回复
地板
帛灿灿| | 2025-1-21 07:58 | 只看该作者
文章写得不错,简单明了。之前用 STM32F103 进行串口通信时遇到了一些麻烦,打算尝试 STM32F4,这篇文章给了我不少帮助。

使用特权

评论回复
5
童雨竹| | 2025-1-21 07:58 | 只看该作者
我在使用 STM32F407VG 时,波特率设置不当导致数据不稳定。看完这篇文章,我更清楚如何配置了。

使用特权

评论回复
6
万图| | 2025-1-21 07:58 | 只看该作者
学习了!对于新手来说,串口通信的确有点复杂,作者的代码示例特别有助于理解。

使用特权

评论回复
7
Bblythe| | 2025-1-21 07:59 | 只看该作者
我之前一直用的是软件串口,硬件串口的性能提升真是非常明显!以后会更倾向于用 STM32F4 的 UART。

使用特权

评论回复
8
Pulitzer| | 2025-1-21 07:59 | 只看该作者
STM32F4 系列真是非常强大,配置 UART 功能也比我想象中简单。文章中介绍的代码非常实用,感谢分享!

使用特权

评论回复
9
Uriah| | 2025-1-21 07:59 | 只看该作者
感觉 HAL 库封装得很好,使用起来更简单了。我试过直接操作寄存器,感觉不如用 HAL 库方便。

使用特权

评论回复
10
Clyde011| | 2025-1-21 07:59 | 只看该作者
刚接触 STM32,串口通信这部分我学了很多。希望能继续分享一些更高级的串口应用。

使用特权

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

本版积分规则

37

主题

3776

帖子

1

粉丝