This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM335x EDMA配制示例



在哪里可以找一个有关EDMA配制的DEMO示例(用DMA将数据搬到DDR中),谢谢。

  • 可以参考Starterware的例程中,有个UART_EDMA。

  • 谢谢你的回复。

    我用的是uartEcho_edma示例,但是整个工程跑不下来。就会在主函数    UartEDMARxConfTransfer(EDMA3_UART_RX_CHA_NUM, EDMA3_UART_RX_CHA_NUM, rxBuffer, sizeof(rxBuffer)); 下面的while处死掉了,希望能够给予指导,谢谢。

     

    nt main(void)
    {
        /* Configure and enable the MMU. */
        MMUConfigAndEnable();
    
        /* Enable all levels of Cache. */
        CacheEnable(CACHE_ALL);
    
        /* Configuring the system clocks for EDMA. */
        EDMAModuleClkConfig();
    
        /* Configuring the system clocks for UART0 instance. */
        UART0ModuleClkConfig();
    
        /* Performing Pin Multiplexing for UART0 instance. */
        UARTPinMuxSetup(0);
    
        /* Enabling IRQ in CPSR of ARM processor. */
        IntMasterIRQEnable();
    
        /* Initializing the ARM Interrupt Controller. */
        IntAINTCInit();
    
        /* Initializing the EDMA. */
        EDMA3Initialize();
    
        /* Initializing the UART0 instance for use. */
        UARTInitialize();
    
        /*
        ** Configuring the EDMA.
        */
    
        /* Request DMA Channel and TCC for UART Transmit*/
        EDMA3RequestChannel(SOC_EDMA30CC_0_REGS, EDMA3_CHANNEL_TYPE_DMA,
                            EDMA3_UART_TX_CHA_NUM, EDMA3_UART_TX_CHA_NUM,
                            EVT_QUEUE_NUM);
    
        /* Registering Callback Function for TX*/
        cb_Fxn[EDMA3_UART_TX_CHA_NUM] = &callback;
    
        /* Request DMA Channel and TCC for UART Receive */
        EDMA3RequestChannel(SOC_EDMA30CC_0_REGS, EDMA3_CHANNEL_TYPE_DMA,
                            EDMA3_UART_RX_CHA_NUM, EDMA3_UART_RX_CHA_NUM,
                            EVT_QUEUE_NUM);
    
        /* Registering Callback Function for RX*/
        cb_Fxn[EDMA3_UART_RX_CHA_NUM] = &callback;
    
        /******************** Transmission of a string **************************/
    
        /* Configuring EDMA PaRAM sets to transmit 'welcome' message. */
        UartEDMATxConfTransfer(EDMA3_UART_TX_CHA_NUM,
                               EDMA3_UART_TX_CHA_NUM,
                               welcome,
                               sizeof(welcome) - 1);
    
        /* Wait for return from callback */
        while(0 == clBackFlag);
        clBackFlag = 0;
    
        /******************** Transmission of a string **************************/
    
        /* Configuring EDMA PaRAM sets to transmit 'intent' message. */
        UartEDMATxConfTransfer(EDMA3_UART_TX_CHA_NUM,
                               EDMA3_UART_TX_CHA_NUM,
                               intent,
                               sizeof(intent) - 1);
     
        /* Wait for return from callback */
        while(0 == clBackFlag);
        clBackFlag = 0;
    
        /******************** Transmission of a string **************************/
    
        /* Configuring EDMA PaRAM sets to transmit 'enter' message. */
        UartEDMATxConfTransfer(EDMA3_UART_TX_CHA_NUM,
                               EDMA3_UART_TX_CHA_NUM,
                               enter,
                               sizeof(enter) - 1);
     
        /* Wait for return from callback */
        while(0 == clBackFlag);
        clBackFlag = 0;
    
        /********************* Receiving Data from User *************************/
    
        /* Configuring the PaRAM set for reception. */
        UartEDMARxConfTransfer(EDMA3_UART_RX_CHA_NUM,
                               EDMA3_UART_RX_CHA_NUM,
                               rxBuffer,
                               sizeof(rxBuffer));
        
        /* Wait for return from callback */
       while(0 == clBackFlag);     clBackFlag = 0;
    
        /******************* Echoing received bytes *****************************/
    
        /* Configuring the PaRAM set to transmit the bytes that were received. */
        UartEDMATxConfTransfer(EDMA3_UART_TX_CHA_NUM,
                               EDMA3_UART_TX_CHA_NUM,
                               rxBuffer,
                               sizeof(rxBuffer));
    
        /* Wait for return from callback */
        while(0 == clBackFlag);
        clBackFlag = 0;
    
        /******************* Freeing of allocated channels **********************/
    
        /* Free EDMA3 Channels for TX and RX */
        EDMA3FreeChannel(SOC_EDMA30CC_0_REGS, EDMA3_CHANNEL_TYPE_DMA,
                         EDMA3_UART_TX_CHA_NUM, EDMA3_TRIG_MODE_EVENT,
                         EDMA3_UART_TX_CHA_NUM, EVT_QUEUE_NUM);
    
        EDMA3FreeChannel(SOC_EDMA30CC_0_REGS, EDMA3_CHANNEL_TYPE_DMA,
                         EDMA3_UART_RX_CHA_NUM, EDMA3_TRIG_MODE_EVENT,
                         EDMA3_UART_RX_CHA_NUM, EVT_QUEUE_NUM);
    
        /* Support for Automation Testing. */
        PRINT_RESULT_PASS();
    
        while(1);
    }

  • 谢谢你的回复。用DMA将数据从DDR拷到DDR的这种方式与uart_edma示例在DMA配制上的区别有哪些,谢谢。

  • 谢谢你的回复。我对这个示例我点疑问:就是从串口收数据时,怎么没有通过DMA将数据搬到指定rxBuffer数组里面去,因为通过调试我发现rxBuffer数组里面全是0。

        /* Configuring the PaRAM set for reception. */
        UartEDMARxConfTransfer(EDMA3_UART_RX_CHA_NUM,
                               EDMA3_UART_RX_CHA_NUM,
                               rxBuffer,
                               sizeof(rxBuffer));
        
        /* Wait for return from callback */
        while(0 == clBackFlag);
  • 差别主要是在写parameter表的时候,你要拷贝的源地址和目的地址的差异。用EDMA之前,建议先好好看看TRM手册上面的EDMA章节,说的还是挺详细的。

  • 谢谢你的指导。我拿到的这个Demo示例中怎么从串口通过DMA搬数据,怎么目的数组rxBuffer没有数据,希望能够给予指导下。

        /********************* Receiving Data from User *************************/
    
        /* Configuring the PaRAM set for reception. */
        UartEDMARxConfTransfer(EDMA3_UART_RX_CHA_NUM,
                               EDMA3_UART_RX_CHA_NUM,
                               rxBuffer,
                               sizeof(rxBuffer));
    
        /* Wait for return from callback */
        while(0 == clBackFlag);
  • 我有点忘了这一步是做到哪里了。先简单说一下几点要注意的:一个是你打断点的时候,这个DMA事件是否已经产生,是否已经接收进来了?另外一点是,看一下程序中是否打开了cache,打开了cache后,如果使用DMA进行数据搬运要特别注意数据一致性,因为DMA对数据的搬运是独立的,也就是说不经过CPU的,有一种可能性是你接入进去进行监测时通过CPU读,可还是从cache中读的,这就造成了实际数据过去了,但是cache中没有更新。这时候刷一下cache,应该就能看到了。印象中有现成函数做这个操作的,我有些忘了,你打开cache的那个相关头文件中找找看。

  • 是的,谢谢你的指导,程序中确实开了Cache,关闭就看到数据了。

  • 你好,将UART_EDMA示例修改为从DDR到DDR的,我只修改目的地址,但是EVENT Num如何进行修改,谢谢。

  • Steven Liu, 您好,请问一下,修改uart edma,怎样可以实现串口的不定长DMA接收数据?

    AM335x的串口接收超时中断Rx timeout interrupt 不能单独使能啊。

    谢谢了!

  • 用定时器固定周期的读DMA接收的长度来判断是否接收完成,也可以使用UART的空闲中断来处理