STM32 串口通信

news2025/4/25 21:26:16

引言

在嵌入式系统开发中,串口通信是最基础且重要的通信方式之一。无论是设备调试、模块对接还是远程通信,串口都扮演着关键角色。本文将从通信协议原理出发,结合STM32F4系列MCU,深入讲解串口通信的硬件实现和软件配置,并通过实战案例展示其应用。

一、串口通信协议深度解析

1.1 串口通信核心概念

串行接口(Serial Port)采用逐位顺序传输方式,其优势在于:

  • 硬件成本低(仅需2根信号线)
  • 传输距离远(RS485可达千米级)
  • 抗干扰能力强
  • 协议简单易实现

常见串口类型对比:

类型电平标准传输距离通信方式
TTL0-3.3V/5V<3m全双工
RS232±3-15V15m全双工
RS485±1.5-6V1200m半双工

1.2 通信协议分层模型

物理层规范

  • 接口类型:DB9、RJ45、端子排
  • 电平标准:RS232使用负逻辑(逻辑1=-3-15V,逻辑0=+3+15V)
  • 连接拓扑:点对点、总线型

协议层规范

  • 数据帧格式
  • 波特率精度(误差<2%)
  • 校验机制
  • 流控协议(硬件RTS/CTS,软件XON/XOFF)

1.3 数据帧结构详解

标准异步串行数据帧构成:

[Start Bit][Data Bits][Parity Bit][Stop Bits]

典型参数配置示例:

c

Copy

/* 8位数据位,无校验,1位停止位 */
UART_InitStructure.WordLength = UART_WORDLENGTH_8B;
UART_InitStructure.StopBits = UART_STOPBITS_1;
UART_InitStructure.Parity = UART_PARITY_NONE;

校验方式性能对比:

校验类型错误检测能力数据开销
奇校验单比特错误+1 bit
偶校验单比特错误+1 bit
CRC校验多比特错误+1-4字节

二、STM32F4串口硬件架构剖析

2.1 USART功能框图

https://example.com/stm32-usart-block-diagram.png

关键功能模块:

  1. 波特率发生器:BRR寄存器实现分数波特率生成
  2. 数据寄存器(TDR/RDR)
  3. 校验控制单元
  4. 中断控制器
  5. DMA接口

2.2 时钟系统配置

时钟树路径:
APBx总线时钟 → USARTDIV分频器 → 生成比特周期

波特率计算公式:

波特率 = fCK / (16 * USARTDIV)

其中USARTDIV为16位浮点数(高12位整数,低4位小数)

配置示例(72MHz时钟,115200波特率):

c

Copy

// USARTDIV = 72000000/(16 * 115200) = 39.0625
USART1->BRR = (39 << 4) | 0x1; // 0x271

2.3 GPIO映射配置

STM32F407 USART1引脚映射:

功能引脚复用功能
TXPA9AF7
RXPA10AF7
CTSPA11AF7
RTSPA12AF7

配置代码示例:

c

Copy

GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

三、STM32串口编程实战

3.1 基础通信实现

初始化流程:

c

Copy

UART_HandleTypeDef huart1;

void USART1_Init(void)
{
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  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;
  HAL_UART_Init(&huart1);
}

数据收发函数:

c

Copy

// 阻塞式发送
HAL_UART_Transmit(&huart1, (uint8_t*)"Hello", 5, 1000);

// 中断接收
HAL_UART_Receive_IT(&huart1, &rx_data, 1);

3.2 中断处理机制

中断服务函数示例:

c

Copy

void USART1_IRQHandler(void)
{
  HAL_UART_IRQHandler(&huart1);
}

// 回调函数实现
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  if(huart->Instance == USART1){
    // 处理接收数据
    process_data(rx_data);
    // 重新使能接收
    HAL_UART_Receive_IT(huart, &rx_data, 1);
  }
}

3.3 DMA高效传输

DMA配置示例:

c

Copy

// 发送DMA配置
hdma_usart1_tx.Instance = DMA2_Stream7;
hdma_usart1_tx.Init.Channel = DMA_CHANNEL_4;
hdma_usart_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_usart_tx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_usart_tx.Init.MemInc = DMA_MINC_ENABLE;
hdma_usart_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_usart_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usart_tx.Init.Mode = DMA_NORMAL;
HAL_DMA_Init(&hdma_usart_tx);

// 启动DMA传输
HAL_UART_Transmit_DMA(&huart1, tx_buffer, BUFFER_SIZE);

四、典型应用案例

4.1 串口调试终端实现

重定向printf函数:

c

Copy

int __io_putchar(int ch)
{
  HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 1000);
  return ch;
}

使用示例:

c

Copy

printf("System Clock: %ld Hz\r\n", HAL_RCC_GetSysClockFreq());

4.2 MODBUS协议实现

协议帧结构:

[地址][功能码][数据][CRC校验]

CRC16校验实现:

c

Copy

uint16_t CRC16(uint8_t *buf, int len)
{
  uint16_t crc = 0xFFFF;
  for(int pos=0; pos<len; pos++){
    crc ^= (uint16_t)buf[pos];
    for(int i=8; i!=0; i--){
      if((crc & 0x0001) != 0){
        crc >>= 1;
        crc ^= 0xA001;
      }
      else
        crc >>= 1;
    }
  }
  return crc;
}

五、调试技巧与常见问题

5.1 故障排查指南

  1. 无数据收发
    • 检查物理连接
    • 验证波特率设置
    • 确认GPIO复用配置
  2. 数据错乱
    • 校验时钟精度
    • 检查电磁干扰
    • 验证电平匹配
  3. 接收数据不完整
    • 调整缓冲区大小
    • 优化中断优先级
    • 启用硬件流控

5.2 性能优化建议

  • 使用DMA进行大数据传输
  • 合理设置FIFO阈值
  • 采用环形缓冲区管理
  • 启用硬件校验功能

结语

通过本文的系统讲解,我们不仅深入理解了串口通信的协议原理,还掌握了STM32平台下的硬件配置和软件开发技巧。在实际项目中,建议根据具体需求选择合适的通信模式(轮询/中断/DMA),并注意做好电磁兼容设计。随着对串口技术的深入掌握,开发者可以更高效地实现各种工业通信需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2342706.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

hi3516cv610构建音频sample工程代码步骤

hi3516cv610构建音频sample工程代码步骤 sdk版本&#xff1a;Hi3516CV610_SDK_V1.0.1.0 硬件&#xff1a;非es8388 工程代码&#xff1a; 通过网盘分享的文件&#xff1a;audio_easy.zip 链接: https://pan.baidu.com/s/1gx61S_F3-pf6hPyfbGaRXg 提取码: 4gbg --来自百度网盘…

12.QT-Combo Box|Spin Box|模拟点餐|从文件中加载选项|调整点餐份数(C++)

Combo Box QComboBox 表⽰下拉框 核⼼属性 属性说明currentText当前选中的⽂本currentIndex当前选中的条⽬下标.从0开始计算.如果当前没有条⽬被选中,值为-1editable是否允许修改设为true时, QComboBox 的⾏为就⾮常接近 QLineEdit ,也可以 设置 validatoriconSize下拉框图标…

UML 顺序图:电子图书馆管理系统的交互之道

目录 一、初识 UML 顺序图 二、电子图书馆管理系统顺序图解析 &#xff08;一&#xff09;借阅流程 &#xff08;二&#xff09;归还流程 三、顺序图绘画 四、顺序图的优势与价值 五、总结 UML 顺序图是描绘系统组件交互的有力工具。顺序图直观展示消息传递顺序与对象协…

访问者模式:分离数据结构与操作的设计模式

访问者模式&#xff1a;分离数据结构与操作的设计模式 一、模式核心&#xff1a;将操作从数据结构中分离&#xff0c;支持动态添加新操作 在软件开发中&#xff0c;当数据结构&#xff08;如树、集合&#xff09;中的元素类型固定&#xff0c;但需要频繁添加新的操作&#xf…

【AI训练环境搭建】在IDE(Pycharm或VSCode)上使用WSL2+Ubuntu22.04+Conda+Tensorflow+GPU进行机器学习训练

本次实践将在IDE&#xff08;Pycharm或VSCode&#xff09;上使用WSL2Ubuntu22.04TensorflowGPU进行机器学习训练。基本原理是在IDE中拉起WSL2中的Python解释器&#xff0c;并运行Python程序。要运行CondaTensorflowGPU你可能需要进行以下准备工作。 1. 此示例中将使用一个mnis…

Leetcode19(亚马逊真题):删除链表的倒是第N个节点

题目分析 删除节点关键&#xff1a;找到被删节点的前一个节点&#xff0c;指针指向 虚拟头节点&#xff0c;方便删除头结点&#xff0c;形成统一操作 为啥要让快指针先行&#xff1f; 我认为更好懂的一种解释&#xff1a;快指针先行n步&#xff0c;这样快慢指针之间形成了一…

Hadoop+Spark 笔记 2025/4/21

读书笔记 定义 1. 大数据&#xff08;Big Data&#xff09; - 指传统数据处理工具难以处理的海量、高速、多样的数据集合&#xff0c;通常具备3V特性&#xff08;Volume体量大、Velocity速度快、Variety多样性&#xff09;。扩展后还包括Veracity&#xff08;真实性&#x…

Redis从入门到实战基础篇

前言&#xff1a;Redis的安装包含在Redis从入门到实战先导篇中&#xff0c;需要的可移步至此节 目录 1.Redis简单介绍 2.初始Redis 2.1.认识NoSQL 2.2.认识Redis 2.3.安装Redis 3.Redis常见命令 3.1 Redis数据结构 3.2 通用命令 3.3 String命令 3.4 Key的层级结构 3…

Java虚拟机(JVM)家族发展史及版本对比

Java虚拟机&#xff08;JVM&#xff09;家族发展史及版本对比 一、JVM家族发展史 1. 早期阶段&#xff08;1996-2000&#xff09; Classic VM&#xff08;Java 1.0-1.1&#xff09;&#xff1a; 厂商&#xff1a;Sun Microsystems&#xff08;Oracle前身&#xff09;。特点&…

【学习笔记】Cadence电子设计全流程(三)Capture CIS 原理图绘制(下)

【学习笔记】Cadence电子设计全流程&#xff08;三&#xff09;Capture CIS 原理图绘制&#xff08;下&#xff09; 3.16 原理图中元件的编辑与更新3.17 原理图元件跳转与查找3.18 原理图常见错误设置于编译检查3.19 低版本原理图文件输出3.20 原理图文件的锁定与解锁3.21 Orca…

OpenCV 图形API(54)颜色空间转换-----将图像从 RGB 色彩空间转换到 HSV色彩空间RGB2HSV()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将图像从 RGB 色彩空间转换为 HSV。该函数将输入图像从 RGB 色彩空间转换到 HSV。R、G 和 B 通道值的常规范围是 0 到 255。 输出图像必须是 8 位…

JavaWeb学习打卡-Day1-分层解耦、Spring IOC、DI

三层架构 Controller&#xff08;控制层&#xff09;&#xff1a;接收前端发送的请求&#xff0c;对请求进行处理&#xff0c;并响应数据。Service&#xff08;业务逻辑层&#xff09;&#xff1a;处理具体的业务逻辑。DAO&#xff08;数据访问层/持久层&#xff09;&#xff…

基于 Electron、Vue3 和 TypeScript 的辅助创作工具全链路开发方案:涵盖画布系统到数据持久化的完整实现

基于 Electron、Vue3 和 TypeScript 的辅助创作工具全链路开发方案&#xff1a;涵盖画布系统到数据持久化的完整实现 引言 在数字内容创作领域&#xff0c;高效的辅助工具是连接创意与实现的关键桥梁。创作者需要一款集可视化画布、节点关系管理、数据持久化于一体的专业工具&…

[Java · 铢积寸累] 数据结构 — 数组类型 - 增 删 改 查

&#x1f31f; 想系统化学习 Java 编程&#xff1f;看看这个&#xff1a;[编程基础] Java 学习手册 在上一章中我们介绍了如何声明与创建数组&#xff0c;还介绍了数组的基本使用方式。本章我们将在上一章的基础上&#xff0c;拓展数组的使用方式&#xff08;可能会涉及一些思…

前端笔记-Axios

Axios学习目标 Axios与API交互1、Axios配置与使用2、请求/响应拦截器3、API设计模式&#xff08;了解RESTful风格即可&#xff09; 学习参考&#xff1a;起步 | Axios中文文档 | Axios中文网 什么是Axios Axios 是一个基于 Promise 的现代化 HTTP 客户端库&#xff0c;专…

C# 类型、存储和变量(值类型引用类型)

本章内容 C#程序是一组类型声明 类型是一种模板 实例化类型 数据成员和函数成员 预定义类型 用户定义类型 栈和堆 值类型和引用类型 变量 静态类型和dynamic关键字 可空类型 值类型引用类型 数据项的类型定义了存储数据需要的内存大小及组成该类型的数据成员。类型还决定了对象…

智慧校园从配电开始:AISD300为校园安全加上智能防护罩

安科瑞刘鸿鹏 摘要 随着校园用电需求不断上升及其安全保障要求的提高&#xff0c;传统低压配电系统已逐渐难以满足现代校园的安全与智能化管理需求。本文基于安科瑞电气推出的AISD300系列三相智能安全配电装置&#xff0c;探讨其在校园电力系统中的应用优势及关键技术特性。…

一 、环境的安装 Anaconda + Pycharm + PaddlePaddle

《从零到一实践&#xff1a;系统性学习生成式 AI(NLP)》 一 、环境的安装 Anaconda Pycharm PaddlePaddle 1. Anaconda 软件安装 Anaconda 软件安装有大量的教程&#xff0c;此处不在说明&#xff0c;安装完成之后界面如下&#xff1a; 2. 创建 Anaconda 虚拟环境 Paddl…

十倍开发效率 - IDEA插件之 Maven Helper

0X00 先看效果 第一个选项表示存在冲突的依赖&#xff0c;可以看到图片中 mysql 的连接依赖发生了冲突&#xff0c;在低版本的上面直接右键选择 Exclude&#xff0c;冲突的依赖就被解决掉了。 0X01 安装 在 Plugins 中直接搜索 Maven Helper&#xff0c;选择第一个进行安装&am…

人机共跑,马拉松人型机器人同跑

马拉松比赛对人形机器人来说&#xff0c;是一场对硬件极限的测试&#xff0c;涉及机械、传感器、能源管理等多个方面。用户问的是硬件方面的考察和改进&#xff0c;这意味着我的回答需要聚焦于硬件性能&#xff0c;而不是算法或软件的优化。 对人形机器人硬件的考研 机械结构与…