当前位置:文档之家› DMA模块详解

DMA模块详解

//北京联合大学实训基地潘峰//qq:66797490//微博:潘峰_buu//博客:/panpan_0315/blog/DMA模块DMA模块简介所谓DMA就是直接内存存取(Direct Memory Access),是计算机科学中的一种内存访问技术。

以前我们向内存传送数据,都是通过CPU来进行。

比如AD完成后,我们要把结果寄存器中的值传送到内存的一个变量中,一种方法就是查询COCO标志位(详见ADC模块一节),一旦置1,就读取结果寄存器并传送。

这种方法CPU需要不断查询标志位,耽误时间,降低效率。

我们也可以使用中断的方式,CPU并不需要轮询标志位,而是AD转换完成后触发中断,CPU中断当前的程序,转向执行中断服务程序,在中断服务程序中读取结果寄存器,然后传送到内存中。

这种方式虽然省去了轮询的时间消耗,但传送数据仍然是由CPU完成的,如果是大批量数据高速传输的话,频繁的中断也将造成很重的CPU负担,于是就有了DMA。

和轮询方式、中断方式不同的是,DMA是通过DMA控制器接管数据和地址总线,根据事先设定好的源地址和目的地址,以及传送的字节数,将数据自动传送到指定的位置,而不需要CPU的介入,从而CPU的负担大大减轻。

如果CPU正在执行指令,DMA控制利用空闲的地址和数据总线完成数据传送,某种程度上说,CPU运算和数据传送是在并行进行的。

在制作智能车的应用中,摄像头组的同学,需要将摄像头采集的数据用最快的速度传送到内存变量中,以采集更多的点。

Kinetis芯片的DMA功能这个时候就能发挥重要的作用了。

首先我们需要了解一下和Kinetis芯片的DMA功能有关的一些概念。

1.DMA源和DMA通道在Kinetis芯片中,很多模块都可以请求DMA模块进行数据传送。

所谓DMA源,也就是DMA传送请求是谁发出的。

以K60DN512Z为例,共有63个DMA源。

而DMA源发出的DMA请求并不是直接提交到DMA控制器,而是通过DMA多路复用器的16个DMA通道提交的。

需要设置相关的寄存器建立DMA源和DMA通道之间的映射关系。

如图错误!文档中没有指定样式的文字。

-1所示。

图错误!文档中没有指定样式的文字。

-1 DMA多路复用器2.DMA模块框图DMA控制模块分为两部分,一个是DMA引擎(eDMA Engine)。

一个是DMA传输控制描述符(TCD),如图错误!文档中没有指定样式的文字。

-2所示。

图错误!文档中没有指定样式的文字。

-2 DMA控制框图3.DMA描述符每个通道需要一个32个字节的传输控制描述符用于定义我们想要的数据传送操作。

描述符按通道0~通道15的顺序依次存放在DMA模块的内存中。

描述符中包含了对应的数据传送的所有信息,主要有源地址,目的地址,传送次数,每次传送的字节数,传送完毕后源地址和目的地址如何调整等等,当一个通道的DMA传送结束后,源地址和目的地址需要加上各自的调整量回写到TCD中,传送计数也需要重新初始化并回写到TCD中。

如表错误!4.主循环和副循环数据的传送分为主循环(major loop)和副循环(minor loop)。

如何理解这两个概念呢。

我们不妨假设用软件来实现有规律的顺序数据传送,使用C语言来实现的话,可以用for循环。

好比用两层嵌套的for循环来实现。

如使用DMA做同样的工作,过程是相同的,外层的循环又称主循环,即major loop。

内层循环称为副循环,即minor loop。

major loop 循环一次,可能需要minor loop循环多次。

每个minor loop循环都需要DMA源发来请求或者通过软件请求。

每个minor loop传送完毕,对应的DMA通道就进入空闲模式,等待下一次DMA 请求。

当所有DMA传送完毕,即置DONE标志,并且可以通过设置选择传送完毕是否触发中断。

5.主/副循环链接功能Kinetis的DMA模块有个功能叫主/副循环链接,就是当一个通道的主循环(Major loop)或副循环(minor loop)结束后,自动链接到另一个通道进行传输。

比如你可以用通道0传送AD数据到内存,完毕后,立刻链接到通道1将内存中的数再传送到DAC。

如果要使用这个功能,需要设置DMA_TCDn_CSR寄存器或DMA_TCD_CITER寄存器。

6.散/聚模式Kinetis的DMA模块还有个特殊的功能叫散/聚模式(Scatter/Gather)。

在这个模式下,当一个通道的主循环(major loop)传输结束后,由一个指针指向一个内存中的新的传输控制描述符(TCD)的起始地址,DMA控制器将从内存中载入该描述符。

这种应用可用在分散存储的内存应用中。

多个需要传送的数据块没有按地址连续存放,而是分散存储在内存的不同位置时,可采用这种方式。

如果要使用这个功能,需要设置DMA_TCDn_CSR寄存器。

7.副循环映射前面提到,数据的传送分为主循环(major loop)和副循环(minor loop)。

一般情况下,每传送一次指定宽度的数据,源地址和目的地址都会加上一个设定好的偏移量,直到这次副循环传送的字节数全部完成,等待下一次DMA请求。

当下一次请求到来时,下一次副循环开始传送,访问的源地址或目的地址和上一次都是连续的,如果不希望连续,而是跳过若干字节,可启用副循环映射,并设定好源地址或目的地址的偏移量。

相关寄存器1.DMA控制寄存器(DMA_CR)●CX:取消传输。

向该位写1将取消当前的传送。

CX=0:普通操作模式;CX=1:取消剩下的传送,该位在取消操作完成后自动清0。

●ECX:错误取消传送。

ECX=0:普通操作模式;ECX=1:和CX作用相同,但是ECX置位会被视为DMA错误,相关的错误寄存器会置位且可能引发错误中断。

●EMLM:使能副循环映射。

在传输控制描述符中有一个字段NBYTE,当EMLM=0和EMLM=1时,该字段的内容有不同的含义,详细参见DMA_TCD_NBYTES寄存器介绍。

EMLM=0:禁止副循环映射;EMLM=1:使能副循环映射。

●CLM:连续链接模式。

CLM=0:当一个副循环(minor loop)结束后,在再次被激活之前,还必须通过通道裁决;CLM=1:当一个副循环(minor loop)结束后,在再次被激活之前,不需要通过通道裁决。

●HALT:停止DMA操作。

HALT=0:普通操作模式;HALT=1:停止任何新通道的启动,正在执行的通道可继续执行到结束。

直到该位清0,各通道方可恢复正常。

●HOE:错误停止,该位置位时,一旦发生DMA传送错误则会将HALT置位。

HOE=0:正常模式;HOE=1:任何错误都会造成HALT位置位,所有服务请求被忽略直到HALT被清除。

●ECRE:使能循环通道裁决。

所谓裁决就是当多个通道优先级判断,通过设置ECRE可选择不同的判断方法。

ECRE=0:固定优先级的通道裁决方法;ECRE=1:使用循环通道裁决方法,即从最高的通道号到最低的通道号依次响应DMA 请求而不考虑其优先级。

●EDBG:使能调试。

EDBG=0:在调试模式下,DMA继续运行;EDBG=1:调试模式下,新通道的启动被停止。

正在运行的通道可继续执行到结束。

各通道直到系统退出调试状态或EDBG位被清0时恢复。

2.错误状态寄存器(DMA_ES)该寄存器用于报告通道错误,该寄存器反映的错误是来自上一次DMA请求并记录的DMA传送造成的。

通道错误由以下因素造成:●设置错误,传输控制描述符TCD的非法设置或在固定优先级裁决中设置了非法的优先级;●在总线控制器读写周期中出现了非法终止。

●VLD:所有错误状态位的逻辑或。

该寄存器中其它任何一个错误位置1,该位都会置1。

VLD=0:没有任何错误发生;VLD=1:至少一个错误位被置位。

●ECX:传输取消。

ECX=0:没有被取消的传输;ECX=1:上一个登记的入口是一个被错误传输输入取消的传输。

●CPE:通道优先级错误。

CPE=0:没有通道优先级错误;CPE=1:上一个登记的错误是优先级配置错误,优先级的设置不唯一。

●ERRCHN:错误的通道号或被取消的通道号。

●SAE:源地址错误。

SAE=0:无源地址错误;SAE=1:源地址错误。

TCDn_SADDR域和TCDn_ATTR[SSIZE]不一致。

●SOE:源偏移量错误。

SOE:=0:无源偏移量错误;SOE=1:源偏移量错误,TCDn_SOFF域和TCDn_ATTR[SSIZE]不一致。

●DAE:目的地址错误。

DAE=0:无目的地址错误;DAE=1:最后登记的错误是目的地址错误。

即TCDn_DADDR域和TCDn_ATTR[SSIZE]不一致。

●DOE:目的地址偏移量错误。

DOE=0:无目的地址偏移量错误;DOE=1:目的地址偏移量错误,TCDn_DOFF域和TCDn_ATTR[SSIZE]不一致。

●NCE:NBYTES/CITER 设置错误。

NCE=0:没有NBYTES/CITER 设置错误;NCE=1:NBYTES/CITER错误。

TCDn_NBYTES不是TCDn_ATTR[SSIZE] 和TCDn_ATTR[DSIZE]的倍数;TCDn_CITER[CITER]设为0;TCDn_CITER[ELINK]和TCDn_BITER[ELINK]不相等。

●SGE:散/聚模式(Scatter/Gather)错误。

SGE=0:无散/聚模式设置错误;SGE=1:散/聚模式设置错误。

●SBE:源总线错误。

SBE=0:无源总线错误;SBE=1:最后一个被记录的错误是读取源地址时发生的总线错误。

●DBE:目的总线错误。

3.DMA请求使能寄存器(DMA_ERQ)●ERQn:使能通道n的DMA请求。

ERQn=0:通道n的DMA请求信号被禁止;ERQn=1:通道n的DMA请求信号被使能。

注意:在硬件DMA请求到达之前,对应位必须置1,但软件DMA请求和链接通道的DMA请求不受该位影响。

4.DMA错误中断使能寄存器(DMA_EEI)●EEIn:通道n的错误中断使能。

EEIn=0:通道n的错误中断被禁止;EEIn=1:通道n的错误中断被使能。

5.中断请求寄存器(DMA_INT)●INTn:中断请求n。

INTn=0:对应通道无中断请求;INTn=1:对应通道发出中断请求。

6.错误寄存器(DMA_ERR)●ERRn:通道n错误。

ERRn=0:对应通道没有出现错误;ERRn=1:对应通道出现错误。

7.硬件请求状态寄存器(DMA_HRS)●HRSn:通道n硬件请求。

HRSn=0:对应通道未出现硬件服务请求;HRSn=1:对应通道出现硬件服务请求。

8.通道n优先级寄存器(DMA_DCHPRIn)所谓优先级裁决,即当有多个DMA通道发出DMA请求时,如何决定响应的先后顺序?或有新的DMA请求到达,而当前的DAM传送还未完成,如何处理?这跟中断优先级的判断是一个道理。

相关主题