打印
[STM32F4]

轻松搞懂STM32F4之DMA

[复制链接]
475|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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吧。


使用特权

评论回复
评论
过期的塔头 2022-10-31 23:53 回复TA
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/weixin_44091010/article/details/118882195 ———————————————— 版权声明:本文为CSDN博主「佛系代码_BUG随缘」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/weixin_44091010/article/details/118882195  
沙发
过期的塔头|  楼主 | 2022-10-31 23:32 | 只看该作者
DMA理论知识

        祭出官方框图

        

DMA传输流程

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

使用特权

评论回复
板凳
过期的塔头|  楼主 | 2022-10-31 23:37 | 只看该作者
数据流与请求通道

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

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

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

使用特权

评论回复
地板
过期的塔头|  楼主 | 2022-10-31 23:39 | 只看该作者
仲裁器(优先级)

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

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

使用特权

评论回复
5
过期的塔头|  楼主 | 2022-10-31 23:41 | 只看该作者
数据传输的模式1(直接模式与FIFO模式)

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

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

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

使用特权

评论回复
6
过期的塔头|  楼主 | 2022-10-31 23:43 | 只看该作者
数据传输的模式2(单独模式与突发模式)

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

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

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

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

使用特权

评论回复
7
过期的塔头|  楼主 | 2022-10-31 23:52 | 只看该作者
DMA事物与循环模式以及双缓冲模式

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

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

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

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

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

使用特权

评论回复
8
过期的塔头|  楼主 | 2022-10-31 23:55 | 只看该作者
       双缓冲模式:即为多使用一个地址寄存器,使用一个后再换一个,循环使用,使用一个指针传输时,加载另一个指针,减少了传输动作。

使用特权

评论回复
9
过期的塔头|  楼主 | 2022-10-31 23:56 | 只看该作者
原文地址:https://blog.csdn.net/weixin_44091010/article/details/118882195

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

80

主题

946

帖子

0

粉丝