随笔 - 733  文章 - 2  评论 - 12  阅读 - 92万

STM32之DMA:

typedef struct
{
__IO uint32_t CCR; //复位
__IO uint32_t CNDTR; //传输的数据量
__IO uint32_t CPAR; //外设地址
__IO uint32_t CMAR; //存储器地址
} DMA_Channel_TypeDef;

用二维数组做DMA缓冲的串口发送:

发送函数先送到指定的二维缓冲数组中;

在定时回调函数里面看如果数组的前2个字节(长度信息不为0),就将其该数组的地址和长度信息给DMA的相关配置寄存器即启动DMA发送

DMA的buf与BURST:

  对于STM32F4来讲,每个DMA stream都有4个字的FIFO可用。它用来暂存来自DMA源端的数据,每当FIFO里存放的数据达到设定的阈值后,数据就会被移走。阈值可以设置为从1个字到4个字的深度。启用DMA的FIFO可以最大程度地避免数据传输过程中的溢出问题,可以减少DMA对内存的访问次数从而减少总线访问竞争,通过BURST分组传输优化传输带宽以提升芯片性能。利用FIFO,通过对源端/目标端的数据进行打包或拆包以适应不同数据宽度的访问需求.让DMA的使用更为方便灵活.

  FIFO阈值设置为1/4满,自源端的4个Byte被封装成1个word字。数据会按字方式逐一写入内存.传输过程中如果发生被打断的情况,此时就会遇到数据损坏的风险。因此就引入了DMA BURST传输,或称DMA节拍传输.

  即几个数据【4/8/16】被封装成1组,或称1个burst,或称1节.对于每1节内的数据传输,DMA对总线的占用不会被总线矩阵仲裁器解除或打断,以保证每节数据的可靠完成。

posted on   杰瑞鼠  阅读(649)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
历史上的今天:
2017-12-27 CD4051的切换时间
2017-12-27 C8051F单片机定时器的定时
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示