打印
[STM32F1]

使用STM32F103C8T6实现UART串口通信教程

[复制链接]
57|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Bblythe|  楼主 | 2024-11-29 07:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32F103C8T6是一款基于ARM Cortex-M3内核的高性价比微控制器,广泛应用于嵌入式开发中。在本教程中,我们将以STM32F103C8T6为例,讲解如何实现UART串口通信功能,涵盖硬件配置、代码编写以及调试过程。

什么是UART通信?UART(Universal Asynchronous Receiver/Transmitter)是一种异步通信协议,广泛用于嵌入式系统与外部设备之间的数据传输。UART通信的核心是通过TX(发送)和RX(接收)两条信号线实现数据交换。STM32F103C8T6支持多个UART接口,可以轻松与PC、传感器或其他MCU进行通信。

工程准备在开始之前,你需要准备以下材料:
  • STM32F103C8T6开发板(常见型号如蓝色小板)
  • USB转TTL模块(用于与PC通信)
  • 串口调试工具(如SecureCRT、Tera Term或串口助手)
  • STM32CubeIDE或Keil开发环境
  • 杜邦线(连接开发板与TTL模块)

实现步骤
  • 硬件连接

    • STM32F103的PA9连接到USB转TTL模块的RXD。
    • STM32F103的PA10连接到USB转TTL模块的TXD。
    • GND连接到共同地线。
  • 配置UART外设

    • 使用STM32CubeMX配置UART2为通信模式。
    • 设置波特率为9600,数据位为8位,无校验位,1个停止位。
  • 编写代码

    • 在主程序中初始化UART并实现数据发送与接收功能。
  • 调试运行

    • 使用串口调试工具验证通信效果。

代码实现以下是完整代码示例:
#include "main.h"
#include <string.h>

// 串口发送字符串函数
void UART_SendString(UART_HandleTypeDef *huart, const char *str) {
    HAL_UART_Transmit(huart, (uint8_t *)str, strlen(str), HAL_MAX_DELAY);
}

// 主程序
int main(void) {
    HAL_Init(); // 初始化HAL库
    SystemClock_Config(); // 配置系统时钟
    MX_GPIO_Init(); // 初始化GPIO
    MX_USART2_UART_Init(); // 初始化UART2

    char rx_buffer[50]; // 接收缓冲区
    char tx_message[] = "Hello from STM32!\r\n"; // 发送消息

    UART_SendString(&huart2, tx_message); // 向串口发送欢迎消息

    while (1) {
        // 接收数据
        HAL_UART_Receive(&huart2, (uint8_t *)rx_buffer, sizeof(rx_buffer) - 1, HAL_MAX_DELAY);

        // 回显数据
        UART_SendString(&huart2, "You sent: ");
        UART_SendString(&huart2, rx_buffer);
        UART_SendString(&huart2, "\r\n");
    }
}

// UART2初始化函数(由STM32CubeMX生成)
void MX_USART2_UART_Init(void) {
    huart2.Instance = USART2;
    huart2.Init.BaudRate = 9600; // 波特率
    huart2.Init.WordLength = UART_WORDLENGTH_8B; // 数据位长度
    huart2.Init.StopBits = UART_STOPBITS_1; // 停止位
    huart2.Init.Parity = UART_PARITY_NONE; // 无校验位
    huart2.Init.Mode = UART_MODE_TX_RX; // 启用发送和接收
    huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; // 无硬件流控
    huart2.Init.OverSampling = UART_OVERSAMPLING_16;

    if (HAL_UART_Init(&huart2) != HAL_OK) {
        Error_Handler();
    }
}
代码解析
  • UART初始化使用STM32CubeMX生成的初始化代码,设置串口通信参数,包括波特率、数据格式等。
  • 串口发送使用HAL_UART_Transmit发送字符串数据到PC。
  • 串口接收使用HAL_UART_Receive接收PC发送的数据,并存储到缓冲区。
  • 回显功能将接收到的数据通过串口回显到PC,便于调试。


注意事项
  • 波特率一致开发板和PC的波特率需一致,通常为9600。
  • 调试工具设置在PC端的串口调试工具中,关闭硬件流控(Flow Control),否则可能导致通信失败。
  • 硬件连接确保TX与RX正确连接,反接会导致通信中断。
  • 数据长度限制缓冲区大小需要根据实际应用调整,以避免数据溢出。


总结通过以上代码示例,STM32F103C8T6可以轻松实现UART串口通信功能。无论是调试信息输出还是与外部设备通信,UART都是一个非常高效的工具。希望本文能帮助你在实际项目中更好地使用STM32的串口功能!

使用特权

评论回复
沙发
公羊子丹| | 2024-11-29 07:53 | 只看该作者
看完文章,我终于明白为什么TX和RX要交叉连接了。

使用特权

评论回复
板凳
周半梅| | 2024-11-29 07:53 | 只看该作者
STM32F103真的很经典,用它做串口通信太方便了!

使用特权

评论回复
地板
帛灿灿| | 2024-11-29 07:54 | 只看该作者
我之前试过波特率设置错误,数据都是乱码,感谢提醒!

使用特权

评论回复
5
童雨竹| | 2024-11-29 07:54 | 只看该作者
请问如果接多个设备,可以用别的UART通道吗?

使用特权

评论回复
6
万图| | 2024-11-29 07:54 | 只看该作者
看了代码我才发现,HAL库简化了不少工作。

使用特权

评论回复
7
Wordsworth| | 2024-11-29 07:54 | 只看该作者
文章里提到的串口调试工具,哪个比较好用?

使用特权

评论回复
8
Pulitzer| | 2024-11-29 07:55 | 只看该作者
这篇文章对新手太友好了,学到了很多实用知识!

使用特权

评论回复
9
Uriah| | 2024-11-29 07:55 | 只看该作者
如果要用DMA传输数据,是不是要改HAL函数?

使用特权

评论回复
10
Clyde011| | 2024-11-29 07:56 | 只看该作者
有没有方法在不开PC的情况下验证串口通信?

使用特权

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

本版积分规则

33

主题

3636

帖子

0

粉丝