当前位置: 首页 > news >正文

STM32F103_LL库+寄存器学习笔记12.1 - 串口DMA高效收发实战:引入ringbuffer结构

导言


在这里插入图片描述
在STM32串口通信中,传统中断方式处理效率低、耦合度高,难以应对高频收发场景。为此,本章引入ringbuffer结构,配合USART1的DMA机制,实现接收数据的自动搬运与发送数据的非阻塞输出。ringbuffer作为中间缓冲区,有效解耦了硬件DMA与用户代码逻辑,不仅提升了数据处理效率,也增强了系统稳定性和可扩展性。

效果如下:
在这里插入图片描述
如上所示,从SSCOM串口助手与单片机的全局变量看来,单片机没有丢包。单片机一共发送356607bytes,接收344960bytes。

项目地址:
github:

  • LL库: https://github.com/q164129345/MCU_Develop/tree/main/stm32f103_ll_library12_1_usart_dma_ringbuffer
  • 寄存器方式:https://github.com/q164129345/MCU_Develop/tree/main/stm32f103_reg_library12_1_usart_dma_ringbuffer

gitee(国内):

  • LL库: https://gitee.com/wallace89/MCU_Develop/tree/main/stm32f103_ll_library12_1_usart_dma_ringbuffer
  • 寄存器方式: https://gitee.com/wallace89/MCU_Develop/tree/main/stm32f103_reg_library12_1_usart_dma_ringbuffer

一、代码


LL库与寄存器方式的代码类似的,这里只介绍LL库。

1.1、myUsartDrive.c

1.1.1、ringbuffer初始化

在这里插入图片描述
在这里插入图片描述
如上所示,完成发送ringbuffer与接收ringbuffer的初始化。

1.1.2、接收ringbuffer

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如上所示:

  1. 函数USART1_Put_Data_Into_Ringbuffer()的作用是将从串口收到的数据放入ringbuffer。此外,它会有一些额外的处理。比如当ringbuffer的剩余空间不足以放入新的数据时,会将旧的数据丢弃,让后放入新的数据。
  2. 在DMA接收中断与串口空闲接收中断里分别调用函数USART1_Put_Data_Into_Ringbuffer(),将接收到的数据放入ringbuffer。

1.1.3、发送ringbuffer

在这里插入图片描述
如上所示,函数USART1_Put_TxData_To_Ringbuffer()的目的是给其他模块调用,将需要发送的数据先放入ringbuffer,等待DMA一次性发送出去。

1.1.4、接收、发送ringbuffer的处理

在这里插入图片描述

1.2、main.c

在这里插入图片描述

二、细节补充


2.1、其他模块的代码,调用哪个函数将字符串从串口发送出去??

在这里插入图片描述
如上所示,外部的模块可以调用两个函数,将数据从串口发送出去:

  1. 函数USART1_SendString_Blocking()串行发送。
  2. 函数USART1_Put_TxData_To_Ringbuffer()非阻塞,异步发送。

相关文章:

  • [计算机网络]网络层
  • Matlab 模糊控制节水洗衣机模型
  • 中科院无人机导航物流配送的智能变革!LogisticsVLN:基于无人机视觉语言导航的低空终端配送系统
  • 9.渐入佳境 -- 套接字的多种可选项
  • iptables实现DDos
  • 计算频谱的方法
  • [Java实战]Spring Boot 整合 Session 共享(十七)
  • 什么是 NoSQL 数据库?它与关系型数据库 (RDBMS) 的主要区别是什么?
  • ros1+docker环境快速搭建
  • postgresql主从集群一键搭建脚本分享
  • 人工智能领域1-4区所有SCI汇总!
  • springCloud/Alibaba常用中间件之Setinel实现熔断降级
  • ctfshow——web入门351~356
  • WebGL图形编程实战【6】:性能优化 × 调试工具与技巧精讲
  • 基于FastAPI框架的日志模块设计
  • STM32入门教程——GPIO输出
  • 信息瓶颈理论(Information Bottleneck Theory)中的“最小化信息”是否意味着“最大化抽象能力”?
  • 【超详细教程】安卓模拟器如何添加本地文件?音乐/照片/视频一键导入!
  • Spring的异步
  • Linux系统管理与编程19:自动部署dns
  • 西王食品连亏三年:主业齐“崩”,研发人员多为专科生
  • 2025年上海科技节5月17日启动,56家重点实验室和大科学设施将向公众开放
  • 茅台1935今年动销达到预期,暂无赴港上市计划!茅台业绩会回应多个热点
  • 长沙通报一出租房疑存非法代孕:查封涉事场所,相关人员被控制
  • 人民日报:浙江着力提升民营企业核心竞争力
  • 中方发布会:中美经贸高层会谈取得了实质性进展,达成了重要共识