轻松搞懂STM32F4之DMA

发布者:玉树琼花最新更新时间:2022-08-05 来源: csdn关键字:STM32F4  DMA  存储器 手机看文章 扫描二维码
随时随地手机看文章

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,可配置是否继续循环传输。


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

关键字:STM32F4  DMA  存储器 引用地址:轻松搞懂STM32F4之DMA

上一篇:轻松搞懂STM32F4SysTick定时器
下一篇:轻松搞懂STM32F407串口通信(USART)

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved