历史上的今天
今天是:2025年03月24日(星期一)
2021年03月24日 | 【STM32】STM32之深入理解DMA
2021-03-24 来源:eefocus
任何一个技术的出现都是为了解决当时出现的问题,任何一个技术既有优点也会有缺点,任何一个技术的适用都需要分场景,看条件。DMA也不例外。
1 直接存储器存取DMA(Direct Memory Access)

DMA处于总线矩阵的前级,与内核cortex-M3同级别,属于主设备(Master)。DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。
2 DMA工作过程
手册描述:

以上的官方描述信息量较大:
1) DMA会暂停系统总线若干个周期。意思是DMA工作时,CPU被挂起?
2) 然后总线仲裁器又执行循环调度。如何调度保证CPU可执行?
分析:
DMA在进行外设1与内存之间的数据传输时,CPU依然可以通过总线矩阵访问外设工作,只不过无法访问外设1,这可以理解(被DMA占用)。那CPU是否也无法访问内存呢?答案是可以访问内存,有以下三种方式(wiki解释):

主要意思:
1)突发传输,停止CPU访问内存:由DMA控制器发一个停止信号给CPU,要求CPU放弃对连接内存的数据总线的使用权。DMA控制器获得总线控制权以后,开始进行数据传输,知道传输完成后发送完成信息中断,通知CPU。
优点:控制简单,它适用于数据传输率很高的设备进行传输。
缺点:在DMA控制器访内阶段,内存的效能没有充分发挥,相当一部分内存工作周期是空闲的。
2)周期挪用:当外设I/O设备没有DMA请求时,CPU按程序要求访问内存;一旦I/O设备有DMA请求,则由I/O设备挪用一个或几个内存周期。
与停止CPU访内的DMA方法比较,该方法既实现了I/O传送,又较好地发挥了内存和CPU的效率,是一种广泛采用的方法。
3)透明传输模式
DMA与CPU相互配合,交替执行,时分复用。这种DMA传送对CPU来说,如同透明的玻璃一般,没有任何感觉或影响。在透明的DMA方式下工作,CPU既不停止主程序的运行,也不进入等待状态,是一种高效率的工作方式。当然,相应的硬件逻辑也就更加复杂。
3 适用场景
DMA方式主要适用于一些高速的外设I/O设备。这些设备传输字节或字的速度非常快。对于这类高速I/O设备,如果用输入输出指令或采用中断的方法来传输字节信息,会大量占用CPU的时间,同时也容易造成数据的丢失。而DMA方式能使I/O设备直接和存储器进行成批数据的快速传送。
但是,使用DMA也是有缺点的:它势必会影响到CPU访问内存的速度(CPU与DMA时分复用数据总线),影响其他功能的执行速度。
对于数据量较小的传输来说,更没必要使用DMA,毕竟DMA每一次传输完成后也会引发CPU中断,而直接使用CPU中断,也是一次中断。只不过在中断向量表中的位置不同而已。
4 寄存器配置
配置通道,传输地址,字节数,方式等。具体可参考手册。
参考资料:
STM32F103C8T6参考手册
史海拾趣
|
我创建了一个下载型工程,就用zinc中Hello的实例做的,在下载的时候老是出现这个错误: Errors while downloading G:/tornado2.2/target/proj/Project1/SIMNTgnu/Project1.out: _LinkMain__14ZafApplication _Control__14ZafApplicationUi ___1 ...… 查看全部问答> |
|
以前使用ADS1.2时都是在原有的工程上添加自己的程序,这次自己建了一个工程,发现ARM竟然不会动,程序和以前的程序一样。可能是建工程的时候设置的问题导致不能运行。 哪个好心的大哥能否建立一个工程,每设置一步剪一个图片下来,并加以说明!急 ...… 查看全部问答> |
|
嵌入式系统无疑是当前最热门最有发展前途的IT应用领域之一。嵌入式系统用在一些特定专用设备上,通常这些设备的硬件资源(如处理器、存储器等)非常有限,并且对成本很敏感,有时对实时响应要求很高等。特别是随着消费家 ...… 查看全部问答> |
|
最近在做FFT,发几个用到的三角函数计算程序 #define DSP32_Q(x) ((int) ((x)*(((unsigned) (1 << (20)))))) const int atanLUT[20] = { DSP32_Q(0.78539816340), DSP32_Q(0.46364760900), DSP32_Q(0.24497866313), DSP32_Q(0. ...… 查看全部问答> |
|
最近看了DCMI的摄像头程序,终于调通了程序,摄像头工作起来了,PC通过串口接收到了摄像头采集的图像, 程序主循环里检测一帧图像采集完成的标志,然后关闭DCMI模块,串口传输数据,并清jpg_flag标志,最后再打开DCMI模块,等待下次中断: DCMI中 ...… 查看全部问答> |




