> 技术文档 > STM32 DMA的理论学习附带个人思路分析!!(启蒙基础版~)_stm32f7的dma和eth dma有什么区别?

STM32 DMA的理论学习附带个人思路分析!!(启蒙基础版~)_stm32f7的dma和eth dma有什么区别?

(笔者的话:写下这一行字的时候我也完全不知道DMA是什么东西,希望我写到最后一张的时候能知道,也希望你们能知道) 

概论

        那我们先来思考一下两个问题

        1.什么是DMA?

        2.为什么需要DMA?

        (想要学习DMA,哪最开始肯定要从这个名字理解起喽,于是乎我们了解了一下)

        DMA,全称Direct(直接) Memory(内存) Access(访问),官方学名为
“直接存储器访问”。

        (但是众所周知在嵌入式开发学习中呢,没有任何一个名字是没有意义的)

        如果DMA代表是直接访问,哪是不是说明,不使用DMA的情况,STM32并不能直接访问内存

呢?

答:当然不是,STM32的cpu可以随时随地的访问内存.

        而着给直接存储器访问的意思是其实是指,外设和存储器之前的交互,虽然上面说了stm32的cpu可以直接访问内存,但是外设却做不到这点,外设则需要通过stm32的cpu这个中转站来进行内存访问.

传统(无 DMA 的系统中)外设(如 UART、ADC)访问内存的方式为:      

                                  ​​​​​​​        ​​​​​​​       ​​​​​外设 → CPU 寄存器 → 内存  

        那么问题来了,如果外设访问内存,都需要经过cpu,那么当大量外设都需要一直访问内存的时候,cpu岂不是不用执行其他任务了,cpu的资源被耗尽.

于是乎,我们是不是得自己想个办法专门来处理外设和内存之间的访问问题,于是恭喜你,你发明了DMA

(不用我们自己想,牛逼前辈们,早就想到了这一点,所以DMA应运而生)

那经过我们上面的这一段思考,我们已经知道了DMA到底是啥!

总结:

1.什么是DMA?

DMA(Direct Memory Access,直接内存访问)​​ 是一种计算机硬件技术,允许外设(如硬盘、网卡、传感器)与系统内存(RAM)之间直接传输数据,​无需CPU全程参与。其核心目标是提升数据传输效率,减少CPU的资源占用。

2.为什么需要DMA?

在传统数据传输模式中,CPU需要全程干预外设与内存的交互, ​​​​​外设 → CPU 寄存器 → 内存  

  • CPU的痛点​:
    • 频繁占用总线,导致其他任务延迟(如实时响应按键输入)。
    • 需要逐字节/逐块搬运数据,消耗计算资源。
  • DMA的解决方案​:
    引入DMA控制器(DMAC),接管数据传输任务: ​​​​​外设 → DMA控制器 → 内存 

    • CPU的角色​:仅初始化传输参数,并在完成后处理数据。

那么通过使用DMA,外设和数据之间就能进行绕过CPU的访问,就不再需要频繁的占用CPU资源

二.stm32中的DMA

了解了DMA的基本概念那我们来看看他的实际应用依旧是STM32F407ZET6为例

        DMA的特点

在数据手册里找到DMA相关的内容,这里提到了这款芯片里有两个DMA控制器分别是DMA1和DMA2,每个控制器有8个通道,他们能处理从内存到外设的各种相关操作,他们专门为APB和AHB设计了专用的FIFO(先进先出缓冲区),来适配他的这个总线的速度

(后面的大概是说他提供了双缓冲模式,可以自动切换,不用软件干预啥的,他说不用代码干预,我们就暂时放在一边.)

数据手册先看到这里,我看了一下后面有提到DMA的相关内容,大部分都是告诉你某某外设可以使用DMA传输数据,还有就是DMA的功耗大小,以后使用到相关内容的时候我们再去看.

STM32DMA外设

既然DMA也是外设的一种,那我们自然可以在外设手册里找到他

这个简介理论学习我们已经在上面去了解过了,这个总线矩阵架构在数据手册里也有提到:长这个样子

STM32DMA的主要特性

DMA控制器主要特性(从文档中,解读了一部分出来)

  1. 双AHB总线架构​:独立总线分别处理存储器与外设访问,优化系统带宽。
  2. 高性能数据传输​:
    • 支持32位地址/数据访问,每个DMA控制器含8个数据流,每个数据流最多8个通道。
    • 每个数据流配备32位四级FIFO缓冲区,支持FIFO模式(可配置阈值:1/4、1/2、3/4 FIFO大小)与直接传输模式。
  3. 灵活传输模式​:
    • 支持外设→存储器、存储器→外设、存储器→存储器三类传输方向。
    • 源/目标地址支持增量/非增量寻址,突发传输支持4/8/16节拍(软件可配置突发大小,通常匹配外设FIFO)。
  4. 智能管理机制​:
    • 循环缓冲区管理​:每个数据流独立支持,简化循环数据处理。
    • 数据宽度自适应​:源与目标数据宽度相同时自动转换位宽(FIFO模式下可用)。
  5. 优先级与仲裁​:
    • 数据流级优先级:8个数据流优先级可通过软件配置(4级:非常高、高、中、低)。
    • 通道级仲裁:每个数据流内8个通道由硬件仲裁器管理优先级。
  6. 事件与中断​:
    • 5个独立事件标志(传输完成、FIFO错误、传输错误、直接模式错误、半传输完成),支持逻辑或运算生成单中断请求。
  7. 高效外设协同​:
    • 支持外设通过DMA触发传输(仅需配置通道请求),直接利用AHB总线矩阵启动传输,减少CPU干预。

核心优势:高速数据搬运、低CPU占用、灵活配置,适用于外设通信、存储器间数据交互等高频场景。

(如果你想仔细了解,还是去手册里找原版文档)

接下来我们对照着这个特性看框图!

那我们从左边看起,根据主要特性里面讲的,DMA有8个数据流,每个数据流有8个通道正好对照着框图,左边红色蓝色方框的部分.“CH”在stm32中一般指通道,STR我暂时也不知道是啥意思,于是我们可以反推一下,如果我们猜测的不错应该指代的是数据流的意思,

str正是stream的缩写

验证完毕,那我们上面的分析完全正确

那我们继续来解释中间的这个部分,我们可以看到有8条线路连接到仲裁器,这就是8个数据流啦,每个数据流对应8个通道

这里描述的有点抽象,根据查阅资料,大概是说:8个流各自汇总其8个通道的请求,生成1个流请求信号(REQ_STREAMx)送给仲裁器,其实有8个仲裁器,每个数据流都有一个.

然后仲裁器会根据优先级,来对数据流进行处理,每个数据流都有一个仲裁器.

上图红色部分大概就是存储器到外设了,绿色方框部分是外设到存储器,而第三种模式存储器到存储器也大致是这样的流程.

那么框图部分就简单介绍完了,虽然还有一些东西我们没有看到,但是已经初步了了解一下DMA的框图.

笔者的话:这篇简单的DMA入门的的讲解其实过于简陋了,但是正如笔者所说,笔者也是自己纯看手册学习这个内容,希望看手册的思路上能给初学者一点帮助.要想掌握的更加熟悉还是要结合代码实践.笔者也算是个初学者,如果后面写了相关代码,我在补一篇进阶版。