DMA

DMA

1. DMA介绍

Direct memory access(直接存储器存取)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。

2个DMA控制器有12个通道(DMA1有7个通道,DMA2有5个通道),每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁器来协调各个DMA请求的优先权。

DMA控制器和Cortex™-M3核心共享系统数据总线,执行直接存储器数据传输。当CPU和DMA同时访问相同的目标(RAM或外设)时,DMA请求会暂停CPU访问系统总线达若干个周期,总线仲裁器执行循环调度,以保证CPU至少可以得到一半的系统总线(存储器或外设)带宽。

DMA2只存在于大容量产品和互联型产品中。

2. DMA框图

image-20250418134829807

2.1 DMA请求

​ 如果外设要想通过DMA来传输数据,必须先给DMA控制器发送DMA请求,DMA控制器收到请求信号之后,控制器会给外设一个应答信号,当外设得到控制器的应答信号后,外设会立即释放它的请求。

​ DMA有DMA1和DMA2两个控制器,DMA1有7个通道,DMA2有5个通道,不同DMA控制器的通道对应着不同的外设请求,这决定了我们在软件编程上该怎么设置。

image-20250418135249147

image-20250418135324792

2.2 通道

DMA具有12个独立可编程的通道,其中 DMA1有7个通道DMA2有5个通道,每个通道对应不同的外设的DMA请求。虽然每个通道可以接收多个外设的请求,但是同一时间只能接收一个,不能同时接收多个。

2.3 仲裁器

当发生多个DMA通道请求时,就意味着有先后响应处理的顺序问题,这个就由仲裁器管理。仲裁器管理DMA通道请求分为两个阶段。

  • 第一阶段属于软件阶段,可以在DMA_CCRx寄存器中设置,有4个等级:最高级>高级>中级>低级
  • 第二阶段属于硬件阶段,如果两个或以上的DMA通道请求设置的优先级一样,则他们优先级取决于通道编号,编号越低优先权越高,比如通道 1 高于通道 2。

image-20250418135958063

image-20250418140022469

在大容量产品和互联型产品中,DMA1控制器拥有高于DMA2控制器的优先级。

2.4 传输方向

三种传输方向:

  • 存储器→存储器(例如:复制某特别大的数据buf)

image-20250419221947713

  • 存储器→外设 (例如:将某数据buf写入串口TDR寄存器)

image-20250419222016450

  • 外设→存储器 (例如:将串口RDR寄存器写入某数据buf)

image-20250419222032827

这里的存储器指的是ROM和RAM。

DMA没有办法把数据从RAM传输到ROM(Flash)。

3. DMA传输方式

  • DMA_Mode_Normal(正常模式)
    • 一次DMA数据传输完后,停止DMA传送 ,也就是只传输一次
  • DMA_Mode_Circular(循环传输模式)
    • 当传输结束时,硬件自动会将传输数据量寄存器进行重装,进行下一轮的数据传输。 也就是多次传输模式