OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 24398|回复: 10

STM32F4 DMA的单次传输与突发(BURST)传输理解

[复制链接]

3

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
177
金钱
177
注册时间
2017-9-27
在线时间
33 小时
发表于 2018-12-24 10:23:21 | 显示全部楼层 |阅读模式
本帖最后由 Bigflish 于 2018-12-24 10:34 编辑

       由于项目的要求,由于采用传统的方式控制USART发送数据的时间占用CPU过多的时间,导致裸机程序的误判(少判),所以想起了采用DMA控制器控制SUART 数据的发送。
之前没有接触过DMA的概念,现学现用呗!!!而导师的意见是,参考别人写的程序,修改修改,解决问题就行了,不必深入了解。果然,一搜索,一大堆的程序,修改修改,
利用到项目中,不到半天问题解决了。感叹DMA可真是好用啊,所以决定学习一下这个神奇的东西,参考《中文参考手册》,硬着头皮看一遍下去,云里雾里。。。。,脑子里
只有几个关键字:FIFO,突发增量传输,数据宽度,存储器,外设。再看了看自己的程序:
    DMA_InitStructure.DMA_MemoryBurst=DMA_MemoryBurst_Single;
    MA_InitStructure.DMA_PeripheralBurst=DMA_PeripheralBurst_Single;
    DMA_InitStructure.DMA_FIFOMode=DISABLE;
    DMA_InitStructure.DMA_FIFOThreshold=DMA_FIFOThreshold_Full;

----->FIFO禁止了,也不使用突发传输了。
       脑子里浮现一个念头,要是我允许Fifo,使用突发传输会是怎么样呢,会不会一次发送几组相同的数据呢?。。二话不说,改呗。下载测试。。。。没有任何的变化。。。没有得到预期的结果,很失望!!于是乎,在看一遍《手册》;   
突发传输和单次传输.png
还是毫无头绪,“突发大小指示突发中的节拍数,而不是传输的字节数”“,”“为确保数据一致性,形成突发的每一组传输都不可分割:在突发传输序列期间, AHB 传输会
锁定,并且 AHB 总线矩阵的仲裁器不解除对 DMA 主总线的授权。”。。。。。实在是读不懂,后来就在网上查找相关资料,可能是用到这个模式的人不多,分享的比较少,只找到了零星的几个帖子,看到底下的帖子才算是开始有点头绪:
  https://blog.csdn.net/gtkknd/article/details/51834668
帖子总结的很简短,就几句话,但是去很干练:
  • <>DMA传输需要用到总线矩阵,有个总线仲裁管理总线事务,由它来控制该谁谁用总线
  • <>普通的DMA传输可能传一个数据就必须跟总线仲裁提要求,总线仲裁才来安排传输
  • <>如果是增量突发传输,就是一次性就传输4、8、16个数据,其间不被中断
  • <>因为要求不被中断也就会产生一个问题,总线给你占用了,其他组件就没得用了

其中提到“总线矩阵”,“仲裁”,记得我刚开始学习STM32的时候,《手册》的第二章就讲的总线框架,说实话当时我是看不懂(可能是我的底子比较薄弱吧),
总线框架.png
再看一下手册里总线矩阵的概念“总线矩阵用于主控总线之间的访问仲裁管理。仲裁采用循环调度算法。”这才恍然大悟,
-->原来单片机里数据的访问都是通过总线来进行的,而一个总线上可能会同时挂载不同的外设。
-->同一个总线的外设在同一时间里可能有几个外设等待进行数据的访问
-->总线矩阵就得起到总裁的作用,也就是给总线的外设分配权限--使用总线的权限
这是我对总裁和总线的理解。在看一下上边的帖子里突发传输第3点,“如果是增量突发传输,就是一次性就传输4、8、16个数据,其间不被中断”,这是就彻底明白了
    以DMA的方式进行数据的访问时,例如当要将内存(flash)中的数据加载到外设上,则完成这一操作,必须
占用相应的DMA数据总线,和相应的DMA外设总线,总线的权限是仲裁器分配的。在DMA传输中,FIFO是源加
载数数据的缓冲区,即源的数据通过总线加载当FIFO中,然后将FIFO中的数据通过总线加载到目标中,突发增
量传输就规定了总线的一次权限可以可以使用多久(可以连续传输几个数据),而不会由于失去权限。在
一次突发传输期间,相应的总线是被锁定的,在突发传输完成之后,总线矩阵会再次分配权限,以相应其他外设
的请求。 因为每个数据流的STM32的每个数据流的FIFO有16个字节,所以最多有16个节拍的字节突发传输,或8
个节拍的半字传输,或是4个节拍的字传输。


     其实从总线矩阵,我们还可以理解DMA的另外一个要点,只有DMA2可以执行存储器到存储器的传输”那是因为DMA2的外设总线DMA_P2经过总线矩阵连接到了存
储器(可能Flash,SRAM1,SRAM,FSMC2)中,而DMA_P1并没有连接。
    洋洋洒洒谢了这么点东西,算是笔记,方便日后回忆,也希望可以帮到大家理解DMA的部分概念,其中也可能有理解错的地方,或是理解不到位之处,希望看大家指出,
我定万分感激。最后就是希望用过突发传输的前辈们,大佬们......分享一下这个突发传输的方式用在哪?为什么非要用?改用单次传输会用什么样的影响呢?








正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2019-7-3
在线时间
14 小时
发表于 2020-2-25 11:23:29 | 显示全部楼层
从字面上的意思看,单次传输一个字节就要总线仲裁一次。假设你的通信协议要求一次发送4个字节,用单次传输就需要总线仲裁4次,突发传输就可以只仲裁一次然后全发出去,这样就可以提高传输效率。当然这只是我的理解,如果不对麻烦大佬指正。
回复 支持 2 反对 0

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2021-12-23
在线时间
0 小时
发表于 2021-12-23 11:54:53 | 显示全部楼层
关于突发自己的理解:
*DMA传输需要用到总线矩阵,有个总线仲裁管理总线事务,由它来控制该谁谁用总线
*普通的DMA传输可能传一段数据就必须跟总线仲裁提要求,总线仲裁才来安排传输
这里的一段数据是根据根据MSIZE字段就行配置, 比如字节、半字(两个字节)、字(4个字节), 这是一个原子操作。
而1次突发就是传一段数据的优先级别提高到最高, 不需要总线仲裁。
而几个节拍的意思就是重复几次这样的操作。

1.为什么MSIZE=字节,FIFO级别是1/4,只有MBURST=INCR4可行?
因为MSIZE=1个字节  所以一个突发只能传一个字节, 而FIFO级别是1/4, FIFO的容量是4级32位, 相当于16个字节数。所以FIFO中的有效字节数是16*(1/4)=4字节。 所以只能选择4个节拍的1次突发。
2.为什么MSIZE=半字,FIFO级别是3/4,所有突发都不能使用?
因为MSIZE=半字=2个字节,  所以一个突发能传2个字节, 而FIFO级别是3/4。所以FIFO中的有效字节数是16*(3/4)=12字节=6个半字。
而MBURST=INCR4的时候是传输4个半字, MBURST=INCR8的时候是传输8个半字,MBURST=INCR16的时候是传输8个半字
不满足传送6个半字, 所以都不能使用。
3.为什么MSIZE=字,FIFO级别是满,只有MBURST=INCR4可行?
因为MSIZE=字=4个字节, 而FIFO级别是满, 所以FIFO中的有效字节数是16个字节=4个字
所以只能选择MBURST=INCR4,  即发送4段数据, 每段数据是一个字。
而MBURST=INCR8的意思是发送8段数据, 每段数据是一个字, 相当于传输了8个字(32个字节)。 同理MBURST=INCR16更不行。
回复 支持 1 反对 0

使用道具 举报

2

主题

474

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6248
金钱
6248
注册时间
2018-6-27
在线时间
534 小时
发表于 2019-2-18 16:50:29 | 显示全部楼层
谢谢分享,学习学习。
回复 支持 反对

使用道具 举报

23

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
242
金钱
242
注册时间
2015-11-11
在线时间
15 小时
发表于 2019-7-10 11:26:03 | 显示全部楼层
感觉还是没看懂。不过谢谢。
回复 支持 反对

使用道具 举报

7

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2019-4-19
在线时间
34 小时
发表于 2019-8-14 15:03:25 | 显示全部楼层
我正在看DMA,看到这有疑问。原来突发是多占用节拍,FIFO还没太懂。谢谢了~
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2019-7-30
在线时间
13 小时
发表于 2019-8-30 18:29:40 | 显示全部楼层
感谢!
回复 支持 反对

使用道具 举报

12

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2017-11-5
在线时间
31 小时
发表于 2020-6-22 20:21:51 | 显示全部楼层
如果用了两个DMA,则这两个DMA的传输也需要仲裁吗?还是说只是每个DMA中的各个通道才需要仲裁呢?
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2019-12-15
在线时间
10 小时
发表于 2020-9-3 15:14:53 | 显示全部楼层
看了这个贴子瞬间解开了关于突发传输的疑惑,
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2021-9-20
在线时间
3 小时
发表于 2022-5-8 16:06:33 | 显示全部楼层
feifeizhuer 发表于 2019-8-14 15:03
我正在看DMA,看到这有疑问。原来突发是多占用节拍,FIFO还没太懂。谢谢了~

FIFO就是你的源数据是4个字节,4个字节的收到的。然后存在FIFO凑够16字节(假设目标需要16字节进行完整解析),然后一起通过DMA总线发给目标。
回复 支持 反对

使用道具 举报

16

主题

103

帖子

0

精华

高级会员

Rank: 4

积分
830
金钱
830
注册时间
2020-7-1
在线时间
110 小时
发表于 2022-5-29 20:57:40 | 显示全部楼层
虽然没有用到FIFO ,但是大致能了解到这个的用途: 不希望我dma传输的数据被打断 , 亦或者 减少仲裁 加快传输?
刚跨过大门,入眼是海洋
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 18:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表