在哪里可以找一个有关EDMA配制的DEMO示例(用DMA将数据搬到DDR中),谢谢。
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.
谢谢你的回复。
我用的是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的空闲中断来处理