定义
DMA
(Direct Memory Access
,直接存储器访问) 在不依赖CPU的情况下提供在外设与内存、存储器和存储器、外设与外设之间的高速数据传输使用。
一次DMA传输是不可中断的
- 搬运存储器、外设的数据:
- 外设指的是spi、usart、iic、adc 等基于APB1 、APB2或AHB时钟的外设。
- 存储器包括自身的闪存(flash)或者内存(SRAM)以及外设的存储设备都可以作为访问源或者目的。
作用
节省CPU资源、实时传输数据
- 节省CPU资源:数据搬运是一个耗时、相对简单的任务,利用DMA机制,外部设备可以直接与内存进行数据传输,无需CPU的参与,从而减轻了CPU的负担。
- 实时传输数据:DMA能够以高效率和高速度进行数据传输,满足对数据及时性的要求。
ARM架构中的DMA配置
在
ARM
架构中,DMA
通常是通过专门的硬件控制器来实现的。
- 配置
DMA
控制器:设置源地址、目标地址、传输数据大小等参数。 - 触发
DMA
传输:启动DMA
控制器开始数据传输。 DMA
传输过程:DMA
控制器根据配置的参数,自动从源地址读取数据,并将数据写入目标地址。- 完成传输:
DMA
控制器完成数据传输后,触发相应的中断信号或事件通知。
在ARM嵌入式系统中,DMA(Direct Memory Access) 是一种允许外设与内存之间直接传输数据的机制,无需经过CPU干预。DMA的核心优势是减少CPU负担,提高数据传输的效率,尤其在数据量大、频繁传输的应用中尤为重要。
DMA基本原理
- 数据传输:DMA允许外设(如ADC、UART、SPI、I2C等)或内存之间直接交换数据,通常由DMA控制器(DMA Controller, DMAC)管理。
- CPU交互:在数据传输过程中,CPU不需要处理每一个数据字节,DMA控制器自动完成数据的读取或写入。CPU可以在DMA传输期间执行其他任务,极大地提高系统效率。
- 触发机制:DMA通常由外设的中断信号或软件触发启动,一旦传输完成,DMA会通知CPU(通常是通过中断机制)处理后续任务。
DMA工作模式
ARM嵌入式系统中的DMA一般支持以下几种工作模式:
-
内存到内存(Memory to Memory):适用于大量数据的内存拷贝操作。
-
外设到内存(Peripheral to Memory):从外设采集数据并存储到内存中,常用于数据采集系统。
-
内存到外设(Memory to Peripheral):适用于音频输出、图像显示等需要将处理数据传输到外设的场景。
-
循环模式(Circular Mode):
- DMA传输完成后,自动回到起始位置进行下一轮传输,适用于持续数据流(如音频采样、视频采集)的场景。
- DMA在传输完一次数据后,不会停止,而是继续从指定的内存位置读取或写入数据。
DMA控制器工作原理
-
配置:CPU配置DMA控制器,指定源地址、目标地址、数据传输大小等参数。此配置通常通过寄存器完成。
-
传输启动:DMA传输可以通过外设的中断触发或软件触发来启动。外设如ADC完成一次采样并发出中断,DMA控制器根据配置将数据从外设传输到内存。
-
数据传输:DMA控制器根据预设配置直接控制数据的读写。数据传输过程中,CPU可以进行其他操作,减少等待时间。
-
传输完成:一旦DMA传输完成,DMA控制器通常会通过中断通知CPU,表明数据传输已完成,CPU可以处理后续任务。
DMA的优势与挑战
优势:
- 高效:减少CPU参与数据传输,提升系统效率。
- 低功耗:通过减少CPU占用,系统整体功耗降低。
- 实时性:DMA传输大块数据时,能够避免CPU中断带来的延迟,保证实时性。
挑战:
- 硬件资源依赖:DMA需要额外的硬件资源,通常会增加芯片复杂性。
- 管理复杂性:DMA传输涉及到内存管理和外设同步,配置较为复杂,尤其是在复杂的多通道DMA应用中。
- 数据一致性问题:DMA直接操作内存时,可能会与CPU并发访问内存,造成数据一致性问题,需要谨慎处理。
DMA双缓存采样
-
初始化DMA控制器:
- 配置DMA控制器,包括源地址(外设的寄存器地址)、目标地址(内存中的两个缓冲区)、传输大小、传输方向等。
- 配置DMA为循环模式,确保DMA可以不断循环进行数据采样。
-
设置两个缓冲区:
- 分配两个内存缓冲区(例如
BufferA
和BufferB
),DMA交替使用这两个缓冲区进行数据存储。 - 配置DMA使得第一个缓冲区可以接收数据采样,当DMA完成第一个缓冲区的采样后,它将切换到第二个缓冲区,继续采样。
- 分配两个内存缓冲区(例如
-
启用DMA和外设:
- 启动DMA,并使外设(如ADC)开始工作,DMA开始从外设读取数据并存储到缓冲区中。
-
中断或标志触发:
- DMA每完成一次缓冲区的传输后,会触发中断或设置标志位。CPU通过中断服务例程(ISR)来接管处理任务,处理完第一个缓冲区的数据后,将第二个缓冲区激活,继续进行数据采样。
-
缓冲区切换:
- 在每次采样完成后,CPU可以切换到另一个缓冲区并继续处理数据,DMA开始采样下一个缓冲区的数据,保证了数据的持续采样和处理。