当前位置: 首页 > 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()非阻塞,异步发送。
http://www.xdnf.cn/news/413011.html

相关文章:

  • STM32实现循环队列
  • 系统架构-通信系统架构设计
  • 如何理解“数组也是对象“——Java中的数组
  • old kali网站下载链接爬取-Kali linux 全部版本镜像下载--Index of /kali-images
  • 基于STM32、HAL库的DPS368XTSA1气压传感器 驱动程序设计
  • [Windows] Honeyview V5.53
  • 深度解析Crawl4AI:面向大模型的新一代智能爬虫
  • 2025系统架构师考试押题总结
  • 学习黑客Windows 任务管理器详解
  • 解决WSL、Ubuntu的.ico图标不正确显示缩略图
  • VBA会被Python代替吗
  • LeetCode:513、找树左下角的值
  • 滑动窗口/单调队列
  • [网络层]ICMP协议
  • Java——API基础(String类和StringBuilder类)
  • 手写 vue 源码 === computed 实现
  • JavaScript高级进阶(七)
  • shell命令大全
  • 基于STM32、HAL库的BMP581气压传感器 驱动程序设计
  • springBoot中的Starter-启动器
  • 重学安卓14/15自由窗口freeform企业实战bug-学员作业
  • 本地文件查重管理工具EasyFileCount v3.0.5.1绿色版,支持查找大重复文件+自动分类
  • 客户端限流主要采用手段:纯前端验证码、禁用按钮、调用限制和假排队
  • jwt学习
  • 如何通过DNS解析实现负载均衡?
  • Android Exoplayer 实现多个音视频文件混合播放以及音轨切换
  • 3d模型的添加与设置
  • VMware虚拟机实例-docker启动失败
  • Linux文件编程——read函数与lseek函数
  • 火狐浏览器安装自定义插件