三种传输模式
- 外设到存储器传输
- 存储器到外设传输
- 存储器到存储器传输
- 两个 DMA 控制器
- 每个 DMA 控制器具有 8 个数据流
- 每个数据流对应 8 个外设请求
-
每个数据流都独立拥有四级 32 位 (16个字节) FIFO( 先进先出存储器缓冲区 )
外设对应的数据流通道
FIFO
有4字的FIFO(16个字节的FIFO)
直接模式:每个外设请求都立即启动对存储器传输
突发模式:突发传输就是用非常短时间结合非常高 数据信号率传输数据,相对正常传输速度,突发传输就是在传输阶段把速度瞬间提高,实现高速传输,在数据传输完成后恢复正常速度,有点类似达到数据块“秒传”效果
DMA突发模式的理解 https://blog.csdn.net/weixin_43527214/article/details/104710659
DMA传输类型分为直接模式和突发模式
FIFO一共16个字节
MBURST = INCR8意思是每次传输8*MSIZE数据,且FIFO必须是此乘积的整数倍,
比如:
MBURST = INCR8
MSIZE = 字节
一次传输的数据量 = 8 x 字节 = 8字节
此时FIFO有两种可能, 8 x 1 = 8 或者 8 x 2 = 16
如果选择FIFO = 8 ,那么一次突发就刚好满足FIFO大小
如果选择FIFO = 16, 那么需要两次突发 2 x 8 = 16,因此需要两次突发
双缓冲模式下,两个存储器地址指针都有效,即 DMA_SxM1AR寄存器将被激活使用。开始传输使用 DMA_SxM0AR 寄存器的地址指针所对应的存储区,当这个 存储区数据传输完 DMA 控制器会自动切换至 DMA_SxM1AR 寄存器的地址指针所对应的另一 块存储区,如果这一块也传输完成就再切换至 DMA_SxM0AR 寄存器的地址指针所对应的存储 区,这样循环调用。
DMA_InitTypeDef 初始化结构体
typedef struct {
uint32_t Channel; //通道选择
uint32_t Direction; //传输方向
uint32_t PeriphInc; //外设递增
uint32_t MemInc; //存储器递增
uint32_t PeriphDataAlignment; //外设数据宽度
uint32_t MemDataAlignment; //存储器数据宽度
uint32_t Mode; //模式选择
uint32_t Priority; //优先级
uint32_t FIFOMode; //FIFO 模式
uint32_t FIFOThreshold; //FIFO 阈值
uint32_t MemBurst; //存储器突发传输
uint32_t PeriphBurst; //外设突发传输
} DMA_InitTypeDef;
解释突发模式:http://www.openedv.com/forum.php?mod=viewthread&tid=285474&extra=page=1
- <>DMA传输需要用到总线矩阵,有个总线仲裁管理总线事务,由它来控制该谁谁用总线
- <>普通的DMA传输可能传一个数据就必须跟总线仲裁提要求,总线仲裁才来安排传输
- <>如果是增量突发传输,(就是一次性就传输4、8、16个数据,其间不被中断--说法感觉不对)
- <>因为要求不被中断也就会产生一个问题,总线给你占用了,其他组件就没得用了