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

[复制链接]
1737|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初始化、数据发送与接收。
  1. #include "main.h"
  2. #include <string.h>

  3. // UART句柄定义
  4. UART_HandleTypeDef huart1;

  5. // UART初始化函数
  6. void MX_USART1_UART_Init(void) {
  7.     huart1.Instance = USART1;
  8.     huart1.Init.BaudRate = 9600;
  9.     huart1.Init.WordLength = UART_WORDLENGTH_8B;
  10.     huart1.Init.StopBits = UART_STOPBITS_1;
  11.     huart1.Init.Parity = UART_PARITY_NONE;
  12.     huart1.Init.Mode = UART_MODE_TX_RX;
  13.     huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  14.     huart1.Init.OverSampling = UART_OVERSAMPLING_16;

  15.     if (HAL_UART_Init(&huart1) != HAL_OK) {
  16.         Error_Handler();
  17.     }
  18. }

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

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

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

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

  34.     while (1) {
  35.         // 发送数据
  36.         UART_SendData(tx_data);
  37.         HAL_Delay(1000);

  38.         // 接收数据(示例)
  39.         UART_ReceiveData(rx_data, sizeof(rx_data));
  40.         // 假设收到数据后处理
  41.     }
  42. }

四、关键步骤解析
  • 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模式要怎么配置呢?
万图 发表于 2024-11-21 07:55 来自手机 | 显示全部楼层
波特率这块要是不匹配是不是直接通信失败?
Wordsworth 发表于 2024-11-21 07:55 来自手机 | 显示全部楼层
学到了,用示波器调试信号这点确实很重要,之前老忽略。
Pulitzer 发表于 2024-11-21 07:55 来自手机 | 显示全部楼层
有没有关于中断模式的示例代码?听说比轮询模式更高效。
Bblythe 发表于 2024-11-21 07:56 来自手机 | 显示全部楼层
字符串发送部分可以直接加一个换行符,这样更适合调试。
Uriah 发表于 2024-11-21 07:56 来自手机 | 显示全部楼层
STM32CubeIDE真是神器,不愧是官方出品,省了不少配置时间。
Clyde011 发表于 2024-11-21 07:56 来自手机 | 显示全部楼层
这代码也太整齐了,直接抄走用在我项目上!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

198

主题

6518

帖子

1

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