STM32 DMA控制器

三种传输模式

  •     外设到存储器传输
  •     存储器到外设传输
  •     存储器到存储器传输

  • 两个 DMA 控制器  
  • 每个 DMA 控制器具有 8 个数据流
  • 每个数据流对应 8 个外设请求
  • 每个数据流都独立拥有四级 32 位 (16个字节) FIFO( 先进先出存储器缓冲区 )

 外设对应的数据流通道

 FIFO

        有4字的FIFO(16个字节的FIFO)

        直接模式:每个外设请求都立即启动对存储器传输

        突发模式:突发传输就是用非常短时间结合非常高 数据信号率传输数据,相对正常传输速度,突发传输就是在传输阶段把速度瞬间提高,实现高速传输,在数据传输完成后恢复正常速度,有点类似达到数据块“秒传”效果

DMA突发模式的理解  https://blog.csdn.net/weixin_43527214/article/details/104710659

如果数据存储量达到阈值级别时,FIFO 内容将传输到目标中。
要求 FIFO 阈值一定要是内存突发传输数据量的整数倍
 

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,因此需要两次突发

 

DMA1 不能实现存储器到存储器传输
数据流 x 数据项数最大65535
突发传输,会占用AHB总线

直接模式---要求源地址和目标地址的数据宽度必须一致,所以只有 PSIZE 控制,而 MSIZE 值被忽略

双缓冲模式下,两个存储器地址指针都有效,即 DMA_SxM1AR寄存器将被激活使用。开始传输使用 DMA_SxM0AR 寄存器的地址指针所对应的存储区,当这个 存储区数据传输完 DMA 控制器会自动切换至 DMA_SxM1AR 寄存器的地址指针所对应的另一 块存储区,如果这一块也传输完成就再切换至 DMA_SxM0AR 寄存器的地址指针所对应的存储 区,这样循环调用。

DMA 中断
1) 达到半传输
2) 传输完成
3) 传输错误
4)FIFO 错误,发生 FIFO 下溢或者上溢时
5) 直接模式错误

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个数据,其间不被中断--说法感觉不对)
  • <>因为要求不被中断也就会产生一个问题,总线给你占用了,其他组件就没得用了

猜你喜欢

转载自blog.csdn.net/u010261063/article/details/119154167