一、H7系列MCU的DMA的介绍
首先根据以下框图,我们可以看到D1域的 MDMA、DMA2D,D2域的两个通用DMA,即DMA1、DMA2,还有D3域的BDMA。
这么多的DMA都是干什么用的呢?我们做个简单介绍。
1. MDMA
MDMA位于D1域,使用的是64bit的AXI总线,可以访问TCM空间,例如如下位置空闲,而其他的DMA是不能访问此空间的。
DTCMRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
2. DMA2D
DMA2D是处理GUI专用得图形加速器,也叫chrome-ART,在处理基本的数据搬移(部分或全部)的同时,还具有颜色格式转换,像素不同的图源混合等功能,此处不多做介绍。
3. DMA1、DMA2
DMA1和DMA2属于两个通用DMA,通过双AHB总线连接到四通八达的总线矩阵,除TCM空间外,能访问其他所有的内存及外设。两个控制器共有16个数据控制流(每个DMA控制器8个)且每个流都有独立的FIFO,在F4里被称为通道。
每个DMA流由独立的DMAMUX(DMA多路选择器)通道驱动,通过对DMAMUX选择DMA的请求信号,可以从115个请求源里任意配置,不再像F4里,DMA通道对应固定的DMA请求源,下边会详细介绍.
4. BDMA
BDMA是位于D3域的DMA控制器,具有8个通道,因为属于D3域,所以可以在进入低功耗状态下依然处于工作状态。
5. 专用DMA
其实在其他Host器件中,如SDMMC、以太网控制器、USB控制器中都有其专用得DMA,以增强MCU的整体性能。
二、DMAMUX多路选择器介绍
DMAMUX是位于通用DMA(DMA1、DMA2)控制器前一级的一个多路选择器,通过此选择器,DMA每个流(通道)的输入就不需要被绑定到固定的外设请求源上,而是通过多路选择器任意选择请求源。
上图即为DMAMUX的结构框图
1. 左侧DMA requests form peripherals作为DMA 请求的输入。
DMA requests form peripherals:
其中DMAMUX1共有115个请求源(8个dmamux_evtx + 107个外设请求源),在RM手册中 Table 121. DMAMUX1: assignment of multiplexer inputs to resources 。
DMAMUX2共有17个触发源(6个dmamux_evtx + 9个外设请求源),在RM手册中 Table 126. DMAMUX2: assignment of synchronization inputs to resources
这里提到的dmamux_evtx是指DMA传输完成后产生的一次事件,这个事件同时又可以作为一次新的DMA的请求源,这样就可以在输出和输入上形成一个环形或链行的DMA事件。
2. 在没有外设DMA请求的情况下,但又想使用DMA进行传输,如何操作呢?通过DMAMUX模块中的Request genertor来产生一个请求源,同样也能像外设请求一样来触发一次( 也可以是多次,由Request generator counter配置决定 )DMA传输。而genertor是通过trigger输入触发的,不同的genertor通道可以配置成相同的trigger源,当然也可以配置成不同的trigger源。
Trigger inputs:
DMAMUX1共有8个trigger源(3个dmamux1_evtx + 5个外设trigger源),详见RM Table 112。
DMAMUX2共有30个trigger源(7个dmamux1_evtx + 23个外设trigger源),详见RM Table 125.
增加了Trigger inputs之后,就可以变换出非常灵活的多种多样的DMA用途,比如,定时器作为trigger,可以通过DMA在任意IO口产生PWM波、定时trigger触发DMA去采集ADC、EXTI0触发一次DMA的采集传输等,各位工程师可以在应用时,根据项目需求自由发挥。
上面我们提到了Request generator counter,我们顺便说一下,这个数可以配置一次trigger产生几次DMA传输(最大的32),如果在传输还未完成之前又来了trigger,就会产生一个相应的中断(当然前提是中断已开启的话)
3. 中断接口用于DMAMUX产生中断信号
Interrupt interface
4 . 同步输入,同步输入的位置位于DMAMUX多路选择器输出到DMA控制器之前,用于控制来了触发源(n+p+2)后不立即给DMA控制器进行传输,需等待同步信号来临后再发送给DMA控制器,使其进行传输。当然也可以不使用同步输入功能,完全由请求源或请求发生器的信号决定输出时机。
用途:比如可以传输完成一次后产生一个事件信号输出,决定下次某个传输的同步信号输入,效果就是两个序列的传输,即使后边的请求源提前来了也会等到前一个的事件完成。
synchronization inputs
同步信号的信号源见:Table 123. DMAMUX1: assignment of synchronization inputs to resources和Table 126. DMAMUX2: assignment of synchronization inputs to resources
三、DMA控制器
从DMAMUX出来的信号进入DMA控制器的Arbitrer仲裁器,根据配置的不同优先级处理同时来的DMA请求。在DMA1和DMA2及BDMA中,在D3域的BDMA中是没有FIFO的,但是BDMA是支持从外设到外设的传输,而其他DMA不支持。
FIFO可以降低对总线带宽的要求,同时在传输过程中可以实现源数据和目标数据宽度不相等时的传输,传输的具体步骤可通过RM中 Table 109. Packing/unpacking and endian behavior (bit PINC = MINC = 1)了解。
-
FIFO和突发
一次突发可以理解为一次DMA请求后可以连续传输几次数据项,支持4、8、16次。
使用或不使用FIFO有一些规则:
例如:禁用FIFO后,要保证外设和内存位宽相同;使用内存到内存传输时必须开启FIFO;使用cubeMX图形化配置时,选项会遵守这些规则被展示。
下表为FIFO阈值配置对应的突发传输次数
用途:例如在配电终端FTU DTU上经常使用到的16位ADC:AD7606,具有8通道同步采样功能,使用突发模式时,可以通过定时器最为trigger源,产生一次DMA请求,通过突发模式就可以触发8次传输,使用一次DMA读到8个通道的数据。