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

串口UART的深入使用

文章目录

    • 串口UART的深入使用
      • 怎样做到效率最高的UART?
        • 1、uart的三种方式
        • 2、uart+DMA存在的问题
        • 3、最屌的UART编程方式
        • UART+DMA+空闲中断IDLE+freertos的队列(裸机的话用环形buf)
        • 整个流程是什么?
        • 还有问题

串口UART的深入使用

怎样做到效率最高的UART?

1、uart的三种方式

uart:查询、中断、DMA

查询是直接排除了;

中断是,接收每个字节都会触发中断来中断cpu效率低;

DMA效率高,比如自己定义收满100个数据就触发一次中断,去中断cpu;

总结就是uart+DMA效率最高;

2、uart+DMA存在的问题

都是接收的问题,发送没这么多问题;

就是说DMA要接收满1000个字节,但是只有200个字节怎么办?或者如果是发生错误怎么办?

答:就要用到IDLE中断;

3、最屌的UART编程方式
UART+DMA+空闲中断IDLE+freertos的队列(裸机的话用环形buf)

注意这是接收,发送的话直接UART+DMA就行了不用管这么多;

DMA设置的接收1000个字节,但是只有200字节,此时就会触发IDLE的位空闲而中止的回调函数;

发生错误也有对应的IDLE的回调函数;

DMA需要的三个参数:哪一个串口用——huart4、存到一个buf里面——g_uart4_rx_buf、要存满多少个——100;

这个只是使能的函数;

整个流程是什么?

1、使能/启动DMA中断,开始接收

2、等待接收完成

1、接收完设置的DMA的1000,接收完成回调函数

2、没到1000,只有200,那就是空闲回调函数

3、发生错误,触发错误回调函数

4、接收一半数据,但是这个不常用

还有问题

数据如何传输的?

接收到数据后,存入FIFO,DMA会把数据搬运到buf中,不用经过cpu,搬运完指定数量才中断一下cpu;

这就出现了问题:数据丢失

就正常使能后,在这个while循环里面,后面放一个函数要执行很久比如30min,那么可能导致问题是,UART不停的有数据传输进FIFO,但是DMA接收完一次数据比如设置了1000个,那DMA要等待while的第二次循环再去使能他才能再次开始接收,也就是等待30min,这期间UART的FIFO里面还在不断有数据接收进去,满的话,多的数据就直接丢失了;

解决办法:

在while前面就直接使能DMA;

然后这里面的各种回调函数都要写个重新使能DMA;这就永动了,接受完的回调函数又立马使能DMA开始接收;

使能函数如下:


http://www.mrgr.cn/news/38830.html

相关文章:

  • YOLOv9改进策略 :IoU优化 | Unified-loU,用于高品质目标检测的统一loU ,2024年8月最新IoU
  • AI学习指南深度学习篇-批标准化的基本原理
  • DriveVLM 论文学习
  • STM32F103C8----3-3 蜂鸣器(跟着江科大学STM32)
  • 【CKA】CKA考题和注意事项
  • 减少重复的请求之promise缓存池(构造器版) —— 缓存promise,多次promise等待并返回第一个promise的结果
  • 浅谈Java之Redis缓存
  • 华为OD机试 - 找等值元素(Java 2024 E卷 100分)
  • PowerShell脚本在自动化Windows开发工作流程中的应用
  • 主流仿真软件Sigrity/HFSS/Siwave/Hyperlynx/ADS差异
  • 大堆对象是如何影响程序的性能的
  • 进销存软件:数字化转型下的企业运营新引擎
  • 2024.9.23-2024.9.29组会报告
  • 关于将inet引入的相关问题
  • 【快速删除 node_modules 】rimraf
  • MDIO Frame介绍
  • Unity中判断平面上两条线段是否有交点代码参考
  • leetcode641. 设计循环双端队列
  • Vue 之组件插槽Slot用法(组件间通信一种方式)
  • 磁盘管理器