如果对芯片架构图和DMA不熟悉可以看看下面两篇文章,对本篇文章的理解有所帮助
DMA初学者必看!帮小白从系统CPU层理解DMA原理-CSDN博客认识芯片架构图和总线矩阵以及FIFO的作用-CSDN博客
了解DMA内部的构成
a.DMA控制器在MCU内部是一个AMBA advcanced high-performance bus(AHB) Master。
b.DMA控制器和AHB有三个接口:
一个Slave接口(用于CPU对它进行编程)
两个Master接口,允许将DMA去开启两个AHB总线上两个从设备之间的信号通信。
c.每个DMA都具有8个Streams
i.每个Stream都只能单向传输
ii.Steam可被配置的模式
从内存到外设
从外设到内存
从内存到内存
DMA功能框图
DMA既然是Master , 又有slave接口不是冲突了吗?
实则不然 , DMA如果想要开始工作 , 就需要CPU对其内部寄存器进行编程 ,如果没有slave接口, 内部寄存器就没办法被设置, 所以需要slave接口让CPU通过AHB总线对寄存器/计算器进行编程
STREAM流&FIFO
假设现在UART有数据要传输到SRAM , 如图所示 , 会进入到一个特定的Stream流 , 通过这个Stream流传输到SRAM里 , 如果SRAM里暂时有数据,那么数据就会暂存到FIFO里,等待接收完毕
如果此时不碰巧 , 又有一个SPI的数据要传输过来, 那么高优先级的数据会先传输 , 低优先级的数据会在FIFO里等待
每一个STREAM流在某一刻只能执行单项传输
每个stream会有八个通道 , 每个通道都能产生DMA的Request , 产生了Request之后 , 它就会去触发Stream的数据流动
在项目布局的时候,不能只管外面的外设具体用哪一个 , 还要管内部的DMA是怎么去触发的,他们的触发关系也是你在设计架构的时候 , 必须去考虑的 , 跟硬件人员沟通的时候, DMA的这条暗线是必须沟通的
系统架构图:
仲裁
假如Stream1 和Stream2 同时过来了
首先判断的规则是通过软件进行
在软件当中 , 会设置DMASXCR寄存器 , 为每一个stream流设置优先级
如果Stream2的优先级比Stream1的优先级高,所以Stream2置起
如果Stream2 和Stream1 的优先级都是very high
这个时候就看硬件了,谁的 Stream的数字小谁就先置起
DMA FIFO的应用
AHB总线一个字的宽度就是32位
当FIFO存放了四个字节刚刚好是32位,那么它会被一起被放到AHB总线上 ,然后运到Memory里 , 这样AHB总线就只被打断了一次 , 并且一个周期内就能传递完成
FIFO一般是存放两个字节的大小
FIFO的作用:
1,减少AHB带宽的占用,减少AHB总线的仲裁,让CPU能够在AHB总线上占用更大的带宽而不需要和DMA经常竞争总线。(DMA接收数据时可以旁路AHB总线)
2,减少溢出,在需要动态扩展内存时,DMA会暂存数据进入FIFO,给CPU执行动态扩展内存争取时间,防止溢出。
3、DMA多路Stream仲裁时,FIFO可以多路Stream缓冲,极大提高并发性。
Burst介绍:
DMA控制器可以生成单次传输或增量突发传输,传输的节拍数为4、8或16.为了确保数据一致性,构成突发传输的每组传输都是不可分割的:AHB传输被锁定,AHB总线矩阵的仲裁器在突发传输序列期间不会撤销DMA主设备的授权。
作用:
可以通过Brust进行多个寄存器的同时修改,在M2P时同时配置多个定时器