打印
[STM32F1]

STM32F103深入应用:实现基本UART通信

[复制链接]
303|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
周半梅|  楼主 | 2024-11-21 07:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在嵌入式开发中,MCU通过UART与外设或上位机进行通信是一项重要且常见的任务。本文将以STM32F103C8T6为例,介绍如何通过UART实现基本通信功能。通过这篇文章,你将了解如何配置UART外设、实现数据发送与接收,并掌握调试中需要注意的关键点。

一、STM32F103C8T6简介STM32F103C8T6是ST公司推出的一款基于ARM Cortex-M3内核的MCU,具有64KB Flash和20KB SRAM,主频可达72MHz。它支持多种外设接口,包括USART、SPI、I2C等,非常适合用于中小型嵌入式项目。
二、硬件连接在进行UART通信前,需要将STM32的相关引脚与外部设备连接:
  • STM32 TX (PA9) 接至外设 RX
  • STM32 RX (PA10) 接至外设 TX
  • 共用地线
硬件准备完成后,就可以进入代码实现部分。

三、代码实现以下代码使用STM32 HAL库实现UART通信。开发环境为STM32CubeIDE,主要功能包括UART初始化、数据发送与接收。
#include "main.h"
#include <string.h>

// UART句柄定义
UART_HandleTypeDef huart1;

// UART初始化函数
void MX_USART1_UART_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();
    }
}

// 数据发送函数
void UART_SendData(char *data) {
    HAL_UART_Transmit(&huart1, (uint8_t *)data, strlen(data), HAL_MAX_DELAY);
}

// 数据接收函数
void UART_ReceiveData(char *buffer, uint16_t size) {
    HAL_UART_Receive(&huart1, (uint8_t *)buffer, size, HAL_MAX_DELAY);
}

// 主函数
int main(void) {
    HAL_Init();               // 初始化HAL库
    SystemClock_Config();     // 配置系统时钟
    MX_USART1_UART_Init();    // 初始化UART1

    char tx_data[] = "Hello, UART!";
    char rx_data[20];

    while (1) {
        // 发送数据
        UART_SendData(tx_data);
        HAL_Delay(1000);

        // 接收数据(示例)
        UART_ReceiveData(rx_data, sizeof(rx_data));
        // 假设收到数据后处理
    }
}

四、关键步骤解析
  • UART初始化
    通过MX_USART1_UART_Init函数配置波特率、数据位长度、停止位等参数。这些配置需要根据外设通信协议的要求进行调整。
  • 数据发送
    使用HAL_UART_Transmit函数完成数据的发送,传入数据指针、长度和超时时间。
  • 数据接收
    通过HAL_UART_Receive实现接收功能,需要提前准备好接收缓冲区。
  • 调试要点

    • 检查硬件连接是否正确,尤其是交叉连接的TX与RX。
    • 配置的波特率和外设端是否一致。
    • 使用示波器或逻辑分析仪检查信号。

五、扩展功能
  • DMA支持
    为了提高通信效率,可以启用DMA模式,避免占用CPU资源。
  • 中断处理
    使用UART中断方式可以实现非阻塞通信,特别适合实时性要求高的场景。

六、总结本文通过实例讲解了STM32F103C8T6的UART通信实现,涵盖了从硬件连接到代码实现的全过程。UART作为一种经典的通信协议,其在嵌入式开发中的应用极其广泛,熟练掌握UART能为更复杂的项目开发打下坚实基础。

使用特权

评论回复
沙发
公羊子丹| | 2024-11-21 07:54 | 只看该作者
啊这!终于找到一篇详细讲UART通信的文章了,膜拜大佬!

使用特权

评论回复
板凳
帛灿灿| | 2024-11-21 07:54 | 只看该作者
我也是用STM32F103,感觉用HAL库还挺方便的,就是初学时略复杂。

使用特权

评论回复
地板
童雨竹| | 2024-11-21 07:55 | 只看该作者
最近刚搞UART,有个问题请教一下:DMA模式要怎么配置呢?

使用特权

评论回复
5
万图| | 2024-11-21 07:55 | 只看该作者
波特率这块要是不匹配是不是直接通信失败?

使用特权

评论回复
6
Wordsworth| | 2024-11-21 07:55 | 只看该作者
学到了,用示波器调试信号这点确实很重要,之前老忽略。

使用特权

评论回复
7
Pulitzer| | 2024-11-21 07:55 | 只看该作者
有没有关于中断模式的示例代码?听说比轮询模式更高效。

使用特权

评论回复
8
Bblythe| | 2024-11-21 07:56 | 只看该作者
字符串发送部分可以直接加一个换行符,这样更适合调试。

使用特权

评论回复
9
Uriah| | 2024-11-21 07:56 | 只看该作者
STM32CubeIDE真是神器,不愧是官方出品,省了不少配置时间。

使用特权

评论回复
10
Clyde011| | 2024-11-21 07:56 | 只看该作者
这代码也太整齐了,直接抄走用在我项目上!

使用特权

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

本版积分规则

41

主题

3715

帖子

0

粉丝