16.6410DMA简述

16.6410DMA简述

16.6410DMA简述_第1张图片

1.为什么需要DMA

首先看串口来传递信息:发送字符串。

发送函数:在uart.c里增加下面发送函数:

16.6410DMA简述_第2张图片

接下来在main.c里调用:

编译make,

16.6410DMA简述_第3张图片

烧写到开发板:

制作SD卡,设置开发板从SD卡启动,设置好minicom后给开发板上电,紧接着按着空格键:

16.6410DMA简述_第4张图片

选择[1]格式化NandFlash:

16.6410DMA简述_第5张图片

16.6410DMA简述_第6张图片

按照上面,选择从USB烧写image,然后选择1,烧写uboot。然后把USB线拉到虚拟机,会显示USB按着成功了。接下来就可以烧写编译好的.bin文件了。

16.6410DMA简述_第7张图片

在Linux里按着USB驱动:

接下来烧写:

16.6410DMA简述_第8张图片

串口信息:

16.6410DMA简述_第9张图片

设置开发板从NandFlash启动:

16.6410DMA简述_第10张图片

可以看到我们串口的信息已经打印出来了。说明串口发送信息成功了。

 

 

 

 

接下来看原始数据的传输:

16.6410DMA简述_第11张图片

上面就是原始数据的传输机制,输出的传输需要CPU全程参与,当buf里的数据很大的时候,这机制就浪费了CPU的大部分资源。

所以DMA机制就出现了,有DMA的机制如下:

16.6410DMA简述_第12张图片

该机制里,当需要传输数据的时候,CPU给DMA控制器命令,告诉DMA要去源地址拿数据,送到目的地址,然后就可以去干别的事了。DMA控制器接受到CPU的命令后,通过内存与串口的数据通道,会不停从源地址获取数据,送到目的地址,知道结束。这就是DMADirect Memory Access机制。

接下来看看2440的DMA:

 

可以看到2440的DMA是四通道的。

每一个通道的请求源:

16.6410DMA简述_第13张图片

DMA的基本时序:

例如UART0的请求源,对应的是通道0(Ch-0),UART2对应的是通道3.

DMA请求到启动的过程时序图:

16.6410DMA简述_第14张图片

首先是DREQ,DMA请求信号生效,当请求信号生效两个时钟之后,响应信号DACK生效,生效的时间是3个时钟。DMA控制器正式接管了总线,就可以实现Read and Write了。

 

DMA的两种工作模式:

16.6410DMA简述_第15张图片

 

 

6410的DMA:

可以看到6410有四个DMA控制器,每一个控制器有8个通道,就是说6410支持的是32DMA通道。

 

32通道支持的DMA源:

16.6410DMA简述_第16张图片

第一行的意思是:在DMA0或者SDMA0控制器的0通道上面,可以使用的是UART0源。依此类推。

四个控制器是DMA0,DMA1和SDMA0和SDMA1。在默认的情况使用的是SDMA控制器,默认值是0.

 

基本工作时序:

16.6410DMA简述_第17张图片

原理跟2440一样的。

 

210的DMA:

16.6410DMA简述_第18张图片

上面可以看到210支持两种类型的DMA:一种是内存到内存的,另一种是内存到外设的。

210有三个控制器:DMA(内存)、DMA0、DMA1.

 

三个控制器对应的DMA源:

16.6410DMA简述_第19张图片

16.6410DMA简述_第20张图片

可以看到DMA源的后面都的是by only DMA0或DMA1,说明这种的DMA源只能给对应的DMA控制器处理,如果是空白的则两个都可以处理。

你可能感兴趣的:(16.6410DMA简述)