定义

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一般支持以下几种工作模式:

  1. 内存到内存(Memory to Memory):适用于大量数据的内存拷贝操作。

  2. 外设到内存(Peripheral to Memory):从外设采集数据并存储到内存中,常用于数据采集系统。

  3. 内存到外设(Memory to Peripheral):适用于音频输出、图像显示等需要将处理数据传输到外设的场景。

  4. 循环模式(Circular Mode)

    • DMA传输完成后,自动回到起始位置进行下一轮传输,适用于持续数据流(如音频采样、视频采集)的场景。
    • DMA在传输完一次数据后,不会停止,而是继续从指定的内存位置读取或写入数据。

DMA控制器工作原理

  1. 配置:CPU配置DMA控制器,指定源地址、目标地址、数据传输大小等参数。此配置通常通过寄存器完成。

  2. 传输启动:DMA传输可以通过外设的中断触发或软件触发来启动。外设如ADC完成一次采样并发出中断,DMA控制器根据配置将数据从外设传输到内存。

  3. 数据传输:DMA控制器根据预设配置直接控制数据的读写。数据传输过程中,CPU可以进行其他操作,减少等待时间。

  4. 传输完成:一旦DMA传输完成,DMA控制器通常会通过中断通知CPU,表明数据传输已完成,CPU可以处理后续任务。

DMA的优势与挑战

优势

  • 高效:减少CPU参与数据传输,提升系统效率。
  • 低功耗:通过减少CPU占用,系统整体功耗降低。
  • 实时性:DMA传输大块数据时,能够避免CPU中断带来的延迟,保证实时性。

挑战

  • 硬件资源依赖:DMA需要额外的硬件资源,通常会增加芯片复杂性。
  • 管理复杂性:DMA传输涉及到内存管理和外设同步,配置较为复杂,尤其是在复杂的多通道DMA应用中。
  • 数据一致性问题:DMA直接操作内存时,可能会与CPU并发访问内存,造成数据一致性问题,需要谨慎处理。

DMA双缓存采样

  1. 初始化DMA控制器

    • 配置DMA控制器,包括源地址(外设的寄存器地址)、目标地址(内存中的两个缓冲区)、传输大小、传输方向等。
    • 配置DMA为循环模式,确保DMA可以不断循环进行数据采样。
  2. 设置两个缓冲区

    • 分配两个内存缓冲区(例如BufferABufferB),DMA交替使用这两个缓冲区进行数据存储。
    • 配置DMA使得第一个缓冲区可以接收数据采样,当DMA完成第一个缓冲区的采样后,它将切换到第二个缓冲区,继续采样。
  3. 启用DMA和外设

    • 启动DMA,并使外设(如ADC)开始工作,DMA开始从外设读取数据并存储到缓冲区中。
  4. 中断或标志触发

    • DMA每完成一次缓冲区的传输后,会触发中断或设置标志位。CPU通过中断服务例程(ISR)来接管处理任务,处理完第一个缓冲区的数据后,将第二个缓冲区激活,继续进行数据采样。
  5. 缓冲区切换

    • 在每次采样完成后,CPU可以切换到另一个缓冲区并继续处理数据,DMA开始采样下一个缓冲区的数据,保证了数据的持续采样和处理。