博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

阅读DMA Controller Core 官方手册

Posted on 2017-03-02 14:35  沉默改良者  阅读(1402)  评论(0编辑  收藏  举报

阅读DMA Controller Core 官方手册

 

DMA控制器框架图

怎样去设定一个DMA控制器

实例化DMA控制器

参数配置界面如下图所示:

 对于width of the DMA length register的配置尝试如下: 

 

 

正如官方文档中描述的那样:

DMA Length register的位宽决定了DMA Length的最大值,决定了可以用这个DMA控制器传递数据的个数。

DMA的工作模式:

搭建一个系统:

数据从ROM里面,经过DMA控制器传送到RAM里面,软件程序单独在RAM_Pro内存空间里面运行。

注意:片上ROM与片上RAM可以不与Nios II 处理器相连,这样会导致处理器监控不到ROMRAM里面的数据,在Eclipse里面的debug界面中没法查找到相应的内存空间,但是连上处理器之后,可以查询得到,建议连上

顶层例化:

 DMA控制器软件程序的编写:

 需要根据用户手册来指导编写:

在Eclipse中编写代码如下:

/*
 * "Hello World" example.
 *
 * This example prints 'Hello from Nios II' to the STDOUT stream. It runs on
 * the Nios II 'standard', 'full_featured', 'fast', and 'low_cost' example
 * designs. It runs with or without the MicroC/OS-II RTOS and requires a STDOUT
 * device in your system's hardware.
 * The memory footprint of this hosted application is ~69 kbytes by default
 * using the standard reference design.
 *
 * For a reduced footprint version of this template, and an explanation of how
 * to reduce the memory footprint for a given application, see the
 * "small_hello_world" template.
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include "sys/alt_dma.h"
#include "system.h"
static volatile int rx_done = 0;
static void done(void* handle, void* data)
{
    rx_done++;
}

int main(int argc, char* argv[], char* envp[])
{
    int rc;
    alt_dma_txchan txchan;
    alt_dma_rxchan rxchan;
    void* tx_data = (void*) 0x2000;
    void* rx_data = (void*) 0x1000;
    if((txchan = alt_dma_txchan_open("/dev/dma")) == NULL)
    {
        printf ("Failed to open transmit channel\n");
        exit(1);
    }

    if((rxchan = alt_dma_rxchan_open("/dev/dma")) == NULL)
    {
        printf ("Failed to open receive channel\n");
        exit(1);
    }

    if((rc = alt_dma_txchan_send(txchan,tx_data,256,NULL,NULL)) < 0)
    {
        printf ("Failed to post transmit request,reason = %i\n",rc);
        exit(1);
    }

    if ((rc = alt_dma_rxchan_prepare(rxchan,rx_data,256,NULL,NULL)) < 0)
    {
        printf ("Failed to post read request,reason = %i\n",rc);
        exit(1);
    }

    while(!rx_done)
    {
        printf ("Transfer successful!\n");
    }
    printf ("Hello from Nios II!\n");
    return 0;
}

由于数据存储在片上的ROMRAM中,因此可以用In-System Memory Content Editor来进行查看:

首先给ROM初始化数据文件和Instance ID:

 

 然后,同样需要给RAM分配Instance ID

 

最后在In-System Memory Content Editor里面进行查看:

 经过核对:数据传输无误。