DMA模块详解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//北京联合大学实训基地潘峰
//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传送造成的。通道错误由以下因素造成: