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

2019-07-20 00:52发布

本帖最后由 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的部分概念,其中也可能有理解错的地方,或是理解不到位之处,希望看大家指出,
我定万分感激。最后就是希望用过突发传输的前辈们,大佬们......分享一下这个突发传输的方式用在哪?为什么非要用?改用单次传输会用什么样的影响呢?








友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。