zoukankan      html  css  js  c++  java
  • 16.6410DMA简述

    16.6410DMA简述

    1.为什么需要DMA

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

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

    接下来在main.c里调用:

    编译make,

    烧写到开发板:

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

    选择[1]格式化NandFlash:

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

    在Linux里按着USB驱动:

    接下来烧写:

    串口信息:

    设置开发板从NandFlash启动:

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

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

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

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

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

    接下来看看2440的DMA:

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

    每一个通道的请求源:

    DMA的基本时序:

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

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

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

    DMA的两种工作模式:

    6410的DMA:

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

    32通道支持的DMA源:

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

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

    基本工作时序:

    原理跟2440一样的。

    210的DMA:

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

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

    三个控制器对应的DMA源:

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

  • 相关阅读:
    《VC++深入详解》学习笔记 第十二章 文件和注册表操作
    《VC++深入详解》学习笔记 第九章 定制应用程序外观
    《VC++深入详解》学习笔记 第七、八章对话框
    《VC++深入详解》学习笔记 第六章 菜单
    《VC++深入详解》学习笔记 第五章 文本编程
    《VC++深入详解》学习笔记 第四章 简单绘图
    《VC++深入详解》学习笔记 第三章 MFC框架程序剖析
    Inno_Setup使用笔记(简单完成安装包制作)
    《VC++深入详解》学习笔记 第一章 Windows程序内部运行机制
    搭建eclipse的nodejs开发环境图解
  • 原文地址:https://www.cnblogs.com/FORFISH/p/5188831.html
Copyright © 2011-2022 走看看