轻松搞懂STM32F4之DMA

DMA直接存储器访问在传输数据时可以与CPU并行工作,但当它们需要使用相同的总线时会出现冲突。在总线矩阵调度下,CPU与DMA不能同时使用总线,导致一方需要等待。DMA通过AHB总线与CPU通信,传输速度快于CPU,适用于高带宽需求。 DMA传输流程包括接收外设请求、数据传输和优先级仲裁。其工作模式包括直接、FIFO、单独和突发模式,以及循环和双缓冲模式,提高效率并减少传输延迟。
摘要由CSDN通过智能技术生成

DMA的作用以及DMA与CPU干扰问题

 

        DMA(Direct memory access):直接存储器存储。

        目前网上对于DMA有两种说法,一种是在DMA传输时,CPU可以正常工作,一种说法是不可以,这两种说法其实有对也有错,经过我的大量查询后,终于得出了一个靠谱的答案。那么想弄清楚这点,需要先了解总线与时钟的关系(先凑合看,回头写个总线架构专讲)

        时钟:计算机的最小时间单位,用于同步控制电路,计算机中每个动作所用时都是以时钟周期为单位的,多个时钟周期或一个时钟周期等于一个机械周期,多个机械周期等于一个指令周期(写多个是因为不同芯片上他的不同周期的比值不同),指令周期执行指令集中的一条指令所需要的时间。

        总线:计算机中各个单元中的数据传输。STM中分为多种总线,有与外设沟通的也有与各种存储器沟通的,也有DMA的总线,但是DMA的总线用于连接AHB总线的。此外,总线本身是连接到总线矩阵的,这是为了使得总线之间的读取更加灵活,使得主设备与从设备之间可以相互访问,如果没有总线矩阵的话,主控主线与被控主线之间就无法进行访问。总线矩阵中,当两组主从总线之间进行访问时,如果XY两线其中任意一条发生冲突,则采取总线调度进行分配,且两组传输无法进行

     总线与时钟的关系:SYSCLK是时钟,但是AHB是总线,虽然频率相同,APB是总线,但是HCLK是时钟。

        那么这里要注意了,当总线矩阵冲突时,也就是CPU执行代码中的总线传输和DMA冲突时,则无法进行DMA和CPU的同时传输!!!

        在这里,DMA总线连接到了AHB总线上,而AHB只负责CPU与外设之间的通信。而不影响CPU与代码的通信。也就是说,当DMA传输时,CPU无法与外设之间进行通信,但是可以正常执行代码,只不过当代码中需要操控外设时,需要等待DMA传输完成或是使用交替的方式与DMA决定谁使用总线。

        打个比方的话,就是一总线可以看作是一条条城市之间的高速公路,成本足够的话,我们自然希望这些道路是专门的,是互不干扰的。但是由于现实中的成本等等问题,导致我们不得不将一些道路重复利用,设置红绿灯等东西来调节重复利用以避免道路冲突造成的堵车问题。

        另外,DMA在传输过程中虽然不使用总线,但是DMA向CPU申请总线使用权的时候,会通过AHB总线向CPU发送总线申请,以及在DMA传输总线时,归还总线也会和发送与总线申请类似的请求数据,当CPU收到DMA发来的这些数据后,会执行一些操作,如回应DMA的信息或是将总线释放(将总线设为高阻状态)。这些动作都会使用CPU资源。

        另外多一句,DMA的总线申请等与CPU交流的信息,高于一切异常的优先级!

        那么可能有些同学可能会有疑问,当DMA传输时CPU无法工作的总线架构下,是不是就不需要总线了呢?其实不然。DMA的传输速度是比CPU要快很多的,要不也对不起DMA高速传输的称号了。CPU执行一条代码的速度是多个指令周期的,一个指令周期又等于多个机械周期,一个机械周期又等于多个时钟周期,这是为了使得CPU有处理更加复杂事情的能力,如运算等等。而DMA是专门为了传输而生的,不需要多余的动作。所以当遇到对速度有高要求的传输时,还是使用DMA吧。

        

DMA理论知识

        祭出官方框图

        

DMA传输流程

        外设通过AHB总线发送给DMA一个传输请求,DMA与其之间

 数据流与请求通道

        通道:外设的传输请求。(8个数据流对应1个通道,共64个)

        数据流:数据的传输链路。(每个数据流可选择8个通道,共8条数据流)

     通道与数据流之间的关系是:每个通道对应一种外设的传输请求,每个数据流可选八个通道的其中一个与之对应,并在接收到传输请求后,使用数据流传输数据。

仲裁器(优先级)

        当多个数据流的数据来到DMA时,DMA同一时间只能服务一条数据流,那么就通过DMA优先级来决定谁先传输,优先级共四级(低,中,高,非常高),如果优先级相同,则比较数据流的号码(1-7),谁的数据流高,则为谁先提供服务。

FIFO介绍:传输缓冲器,用于源与目的直接的数据缓冲。FIFO大小为16个字节(4字)

数据传输的模式1(直接模式与FIFO模式)

        DMA申请总线后,当数据通过数据流传输到DMA后(DMA传输一次为传输一个MSIZE(即为源的一次传输的大小)),

                直接模式:数据传入FIFO,FIFO收到一字节数据后,直接发走,不在FIFO多做停留。

                FIFO模式:数据传入FIFO,FIFO收到数据后,只有当数据达到阈值后,再发走

数据传输的模式2(单独模式与突发模式)

        当数据要从FIFO向目的传输时,如何申请总线

                单独模式:申请一个MSIZE的传输,多次申请,直到发完FIFO内的数据

                突发模式:申请多个MSIZE的传输,将多组数据一次传输出去。

        突发模式的传输与FIFO的传输有关系,这里设计到节拍的概念,一次节拍的意思可简单理解为传输一次MSIZE,4节拍二次突发的意思就是当一次传输两个MSIZE。

DMA事物与循环模式以及双缓冲模式

        DMA事物包含传输的三个动作

                ①:通过DMA某个寄存器中获取源地址,并依据地址找到源数据并加载到DMA中

                ②:通过DMA某个寄存器中获取目标地址,并依据地址传输加载到DMA中的数据

                ③:DMA计数器减一,表示以完成一个动作

        DMA一次请求最多传输65535个bit的数据,当数据完成后,即为这个最大为65535事物寄存器减到0,可配置是否继续循环传输。

        双缓冲模式:即为多使用一个地址寄存器,使用一个后再换一个,循环使用,使用一个指针传输时,加载另一个指针,减少了传输动作。

                                                                                原创不易,未经允许禁止转载!!!

        

        

  • 8
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值