DMA原理理解

时间:2024-04-05 09:37:22

声明:如果涉及侵权,请联系本人删除侵权内容。
  声明:本文由本人以以往工作经验为依据,总结而得,如果错误,欢迎指正,便于后人参考,少走弯路。 

 如果图片加载失败,可访问github查看:DMA_intro-stm32

 编写MCU外设模块驱动时,经常会配置DMA的使用,之前在ADC采集,UART模块通信中都使用过,但是只知道使用,具体没细究过。

找了之前用过的几款MCU芯片(51&52系列,STM32F系列,MC9S12系列,S32K14系列等),也找了几款SOC芯片的数据手册,但是发现只有STM32F系列的文档中有具体的总线介绍,现就基于STM32F1系列芯片的总线框图,总结以下我对DMA的理解。

1. 系统框图

以下是从STM32参考手册中截取的结构框图:

DMA原理理解

2. DMA相关单元

  • 驱动单元

    • Cortex™-M3内核DCode总线(D-bus);
    • Cortex™-M3内核系统总线(S-bus);
    • 通用DMA1;
    • 通用DMA2;
  • 被动单元

    • 内部SRAM;
    • 内部闪存存储器;
    • FSMC;
    • AHB到APB的桥(AHB2APBx);
  • 总线矩阵

      为什么会有"DMA和CPU有竞争"这么一说?
      其实理解了总线矩阵,就应该知道了原因,原理类似木桶效应(一个木桶盛水多少取决于最短的那块木板)。总线矩阵就是那块最短的木板,任何驱动单元要通过总线矩阵访问存储单元,都需要仲裁,每个时刻,有且只有一个驱动单元能通过总线矩阵进行访问存储单元,所以就出现了竞争关系。

    DMA原理理解

3. DMA无关单元

  • Cortex™-M3内核ICode总线(I-bus)

      从框图上可以看出,I-Bus直接与"FLASH接口"相连,中间没有总线矩阵参与,所以CPU的指令预取操作和DMA不冲突。也就是说,即使CPU在进行取指操作,DMA也可以同时工作。

4. 摘录相关概念介绍

  • Code 总线

      该总线将Cortex™-M3内核的指令总线与闪存指令接口相连接。指令预取在此总线上完成。

  • DCode 总线

      该总线将Cortex™-M3内核的DCode总线与闪存存储器的数据接口相连接(常量加载和调试访问)。

  • 系统总线

    此总线连接Cortex™-M3内核的系统总线(外设总线)到总线矩阵,总线矩阵协调着内核和DMA间的访问。

  • DMA 总线

      此总线将DMA的AHB主控接口与总线矩阵相联,总线矩阵协调着CPU的DCode和DMA到SRAM、闪存和外设的访问。

  • 总线矩阵

      总线矩阵协调内核系统总线和DMA主控总线之间的访问仲裁,仲裁利用轮换算法。

  • AHB/APB 桥(APB)

      AHB外设通过总线矩阵与系统总线相连,允许DMA访问。
      两个AHB/APB桥在AHB和2个APB总线间提供同步连接。APB1操作速度限于36MHz,APB2操作于全速(最高72MHz)。

 5. 备注

之前一直误以为CPU时时刻刻都要读指令,DMA只能在每次读指令之后的译指和ALU运算的这个间隙执行,这种和CPU之间来回切换的机制怎么能提高效率,看了框图之后才知道自己理解错了。