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

STM32F103_LL库+寄存器学习笔记12.2 - 串口DMA高效收发实战2:进一步提高串口接收的效率

导言


通过优化代码算法,在串口空闲中断回调里不需要暂时关闭DMA接收,达到提高串口接收的效率。在IDLE接收中断里关闭DMA接收会导致接收过程中有数据丢失风险(关DMA的瞬间如果有数据到来,会丢帧!)。
在这里插入图片描述
回顾一下三种中断并用的本质优势:

  1. DMA半传输中断(HT):大包时减少等待时间,能及时处理前半区数据,不等整个缓冲区满。
  2. DMA完成中断(TC):大包时搬运后半区数据,保证不会丢数据。
  3. USART空闲中断(IDLE):短包/不定长帧/突发帧,能及时取走实际收到的数据,极大减少帧延迟。
    总之,三者结合既保证高吞吐大包效率,也保证短包/突发帧实时性

项目地址:
github:

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

gitee(国内):

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

一、之前的串口空闲中断代码


在这里插入图片描述
如上所示,在串口接收空闲中断里短暂地关闭DMA接收,函数的尾部在重新开启DMA接收。

二、本章节新代码


2.1、LL库

在这里插入图片描述
在这里插入图片描述
如上所示,核心的函数USART1_DMA_RX_Copy()被三种中断分别调用,将接收到的串口数据放入ringbuffer,在大循环中在处理ringbuffer消息。注意,代码不再出现函数LL_DMA_DisableChannel()关闭DMA接收。而且,代码更加简洁了。

2.2、寄存器方式

在这里插入图片描述

三、细节补充


3.1、USART1_DMA_RX_Copy()如何避免数据重复/遗漏?

关键点是:每次处理后都要有记录“DMA读到哪里了”,三类中断都要对“已处理指针”做同步!
在这里插入图片描述

http://www.xdnf.cn/news/542791.html

相关文章:

  • Java实现基于bitmap的字符串去重统计
  • 鸿蒙路由参数传递
  • sqlite
  • Django快速入门篇
  • 基于 ESP32 与 AWS 全托管服务的 IoT 架构:MQTT + WebSocket 实现设备-云-APP 高效互联
  • 2025年渗透测试面试题总结-华顺信安[实习]安全服务工程师(题目+回答)
  • sqlite的拼接字段的方法(sqlite没有convert函数)
  • STL中list的模拟
  • React 第四十三节 Router中 useBlocker 的使用详解及案例注意事项
  • 深入解析Spring Boot与Kafka的集成实践
  • kafka入门(二)
  • [创业之路-369]:企业战略管理案例分析-9-战略制定-差距分析的案例之华为
  • 「华为」持续加码人形机器人赛道!
  • 动态规划之爬楼梯模型
  • 如何将内网的IP地址映射到外网?常见方法及详细步骤
  • 头歌实践平台:动态NAT配置
  • Java虚拟机 - 程序计数器和虚拟机栈
  • DeepSeek-V3 vs GPT-4:技术对比与性能评测
  • php、laravel框架下如何将一个png图片转化为jpg格式
  • 2025年医美行业报告60+份汇总解读 | 附 PDF 下载
  • II-Medical-8B论文速读:课程SFT,DPO和RL 为长思维链推理从无到有
  • 焊接结构动力疲劳计算
  • Nvidia - NVLink Fusion
  • CouchDB 可观测最佳实践
  • ChatGPT助力继续教育自动答题
  • PyTorch进阶实战指南:01自定义神经网络组件开发
  • LLM的应用
  • Java转Go日记(四十四):Sql构建
  • 服务器磁盘不同格式挂载区别
  • Python数据可视化再探——Matplotlib模块 之一