言归正传,上次说过要写篇DMA的介绍来,结果还是耽误了,这次就补上了,另外这里预告一下,下篇的从零入手打算写一下FlexBus的软件部分(前面说了说它的硬件设计),如果有用到的话敬请期待,不会用到或者早就已经熟用了就不用等了,当然期间还会穿插一些其他的工程技巧的,不要错过哦,亲...(咳咳,借用下淘宝体)下面就正式介绍下Kinetis的DMA: 1.先介绍下DMA。DMA(Direct Memory Access)是一种直接存储器访问技术,工作过程中不需要CPU干预,也不需要像中断处理方式那样需要保留现场、恢复现场之类的麻烦事,简单理解为一条直接连通外设与RAM的硬件通道(这句话需要仔细琢磨,下面**里会重点提一下),所以DMA技术可以提高系统运行效率(即CPU可以干其他的事去,算是一种简单的并行模式吧)。而对Kinetis来说,我们会看到eDMA,其实就是多了个e(enhanced,即增强型),嘿嘿,至于为什么会多了个e,从下面对Kinetis的eDMA特性的分析就可以看出来; 2.Kinetis的eDMA包括两部分,即DMA Muliplexer(DMA多路转换器,就是个矩阵开关,路由DMA触发源的)和DMA Controller(DMA控制器,这个是重点,用来配置DMA控制引擎(Engine)和DMA传输控制描述区(TCD)),其内部框图如下所示: DMAMUX框图 DMA Controller框图 3.下面介绍下Kinetis的eDMA的一些特性,有点多,就挑重点和特色的来说了: (1)16个独立可配置的DMA通道,其中前四个通道可配置成周期性触发(需要用到PIT模块),如上图DMAMUX框图所示; (2)52个外设触发slots(这个我担心翻译不好误人子弟了就直接用该单词替代了,呵呵,用过Qt的人都这是个槽的概念,大家权当触发源来理解吧),10个直通slots,每一个slot可以通过软件编程路由到16个DMA通道中的任意一个(这个通过配置DMAMUX_CONFIGn得到),这方面比STM32的M3好些,STM32是固定的,所以Kinetis灵活性好些(咳咳,该言论不代表贬低STM32,毕竟它还是很强大的); (3)独立可编程的源地址、目标地址和传输宽度(8bit,16bit,32bit,另外支持16byte的缓存),支持外设到RAM,RAM到外设,RAM到RAM之间的传输; (4)每一个通道都有一个11个寄存器的TCD(Tranfer control descripter),注意这11个寄存器(包括16位和32位宽度的寄存器)才是我们编写驱动的重点对象; (5)固定的优先级模式和时间轮询(round-robin)优先级模式(注意:如果不通过软件设置优先级的话,系统默认为每个通道的优先级等于它的通道号,即0通道的优先级为0,且优先级号越小,其优先级越低); (6)每个通道包括了三个中断标志,即DMA半传输完成标志、DMA传输完成标志和DMA传输出错标志,3个标志逻辑或成一个中断请求(所以如果都使能了,那可以通过查询相关标志寄存器来判断当前的中断类型); (7)可软件中断取消DMA传输(通过配置DMA_CR_CX位)。 4.DMA工作流程,这里先给出清华的一个功能框图,我觉着还是挺清晰的,便于理解,然后接下来的三幅图分别代表了一个DMA完整传输的流程,这里一句两句没法说清楚就只能上图了,不懂的可以下面留言,呵呵: 整体框图 part1 part2 part3 5.在具体软件编程之前,先说下次循环(minor loop)和主循环(major loop)这两个概念,用图来表达我觉着好些,上图,呼呼:
|