这是我仿着官方例程mcu_plus_sdk_am64x_08_03_00_18\examples\drivers\udma\udma_memcpy_interrupt\am64x-evm\r5fss0-0_nortos来写的,想把uint32_t srcData = 10的数值通过DMA给uint32_t destData = 0;最后打印出来;程序中DMA的配置App_udmaTrpdInit(chHandle, trpdMem, destBuf, srcBuf, length)和例程的一样,没做任何改变;程序的执行结果DebugP_log("destData = %d\r\n",destData)的输出为destData = 0,没有任何改变;在函数void DMAMemcpy(uint32_t *srcBuf,uint32_t *destBuf,uint32_t length)中我用了断言都没有提示错误;卡位while(!gDataSendFinishFlag)也能出来说明DMA的运行是有到中断的回调函数去更改标志位的,但是我不知道为什么destData 的数值没有改变,麻烦有空帮忙看下,谢谢!
#include <stdio.h>
#include <kernel/dpl/DebugP.h>
#include "ti_drivers_config.h"
#include "ti_drivers_open_close.h"
#include "ti_board_open_close.h"
/*
* µ±¸ø¶¨Ô´µØÖ·ºÍÄ¿±êµØÖ·ÒÔ¼°³¤¶È
* ´Ëº¯Êý½«Æô¶¯DMA°áÔËÁ½¸öµØÖ·µÄÊý¾Ý
*/
#define UDMA_TEST_TRPD_SIZE (UDMA_GET_TRPD_TR15_SIZE(1U))
uint8_t gDataSendFinishFlag = 0;
/**/
uint8_t gUdmaTestTrpdMem[UDMA_TEST_TRPD_SIZE] __attribute__((aligned(UDMA_CACHELINE_ALIGNMENT)));
/*ÉùÃ÷º¯Êý*/
void App_udmaEventCb(Udma_EventHandle eventHandle, uint32_t eventType, void *appData);
static void App_udmaTrpdInit(Udma_ChHandle chHandle,uint8_t *trpdMem, const void *destBuf, const void *srcBuf, uint32_t length);
void DMAMemcpy(uint32_t *srcBuf,uint32_t *destBuf,uint32_t length)
{
uint32_t trRespStatus;
int32_t retVal = UDMA_SOK;
uint64_t pDesc;
Udma_ChHandle chHandle;
uint8_t *trpdMem = &gUdmaTestTrpdMem[0U];
uint64_t trpdMemPhy = (uint64_t) Udma_defaultVirtToPhyFxn(trpdMem, 0U, NULL);
/*»ñȡͨµÀ²Ù×÷¾ä±ú*/
chHandle = gConfigUdma0BlkCopyChHandle[0];
/*ʹÄÜͨµÀ*/
retVal = Udma_chEnable(chHandle);
DebugP_assert(UDMA_SOK == retVal);
/*³õʼ»¯TRÃèÊö·û*/
App_udmaTrpdInit(chHandle, trpdMem, destBuf, srcBuf, length);
/*½«ÃèÊö·ûÌá½»¸øÍ¨µÀ¿ªÊ¼Êý¾ÝµÄ´«Êä*/
retVal = Udma_ringQueueRaw(Udma_chGetFqRingHandle(chHandle), trpdMemPhy);
DebugP_assert(UDMA_SOK == retVal);
/*µÈ´ýÊý¾Ý´«ÊäÍê³É£¬»Øµ÷º¯Êý¸ü¸Ä±ê־λ*/
while(!gDataSendFinishFlag);
/*½«ÃèÊö·û´Ó»·Öе¯³ö*/
retVal = Udma_ringDequeueRaw(Udma_chGetCqRingHandle(chHandle), &pDesc);
DebugP_assert(UDMA_SOK == retVal);
/*¼ì²âTR»ØÓ¦×´Ì¬*/
CacheP_inv(trpdMem, UDMA_TEST_TRPD_SIZE, CacheP_TYPE_ALLD);
trRespStatus = UdmaUtils_getTrpdTr15Response(trpdMem, 1U, 0U);
DebugP_assert(CSL_UDMAP_TR_RESPONSE_STATUS_COMPLETE == trRespStatus);
}
void empty_main(void *args)
{
uint32_t srcData = 10;
uint32_t destData = 0;
/* Open drivers to open the UART driver for console */
Drivers_open();
Board_driversOpen();
DMAMemcpy(&srcData,&destData,1024);
while(1){
DebugP_log("destData = %d\r\n",destData);
}
Board_driversClose();
Drivers_close();
}
/*Êý¾Ý´«ÊäÍê³ÉµÄÖжϻص÷º¯Êý*/
void MyDMACallback(Udma_EventHandle eventHandle, uint32_t eventType, void *appData)
{
gDataSendFinishFlag = 1;
}
static void App_udmaTrpdInit(Udma_ChHandle chHandle,uint8_t *trpdMem,const void *destBuf,const void *srcBuf,uint32_t length)
{
CSL_UdmapTR15 *pTr;
uint32_t cqRingNum = Udma_chGetCqRingNum(chHandle);
/* Make TRPD with TR15 TR type */
UdmaUtils_makeTrpdTr15(trpdMem, 1U, cqRingNum);
/* Setup TR */
pTr = UdmaUtils_getTrpdTr15Pointer(trpdMem, 0U);
pTr->flags = CSL_FMK(UDMAP_TR_FLAGS_TYPE, CSL_UDMAP_TR_FLAGS_TYPE_4D_BLOCK_MOVE_REPACKING_INDIRECTION);
pTr->flags |= CSL_FMK(UDMAP_TR_FLAGS_STATIC, 0U);
pTr->flags |= CSL_FMK(UDMAP_TR_FLAGS_EOL, CSL_UDMAP_TR_FLAGS_EOL_MATCH_SOL_EOL);
pTr->flags |= CSL_FMK(UDMAP_TR_FLAGS_EVENT_SIZE, CSL_UDMAP_TR_FLAGS_EVENT_SIZE_COMPLETION);
pTr->flags |= CSL_FMK(UDMAP_TR_FLAGS_TRIGGER0, CSL_UDMAP_TR_FLAGS_TRIGGER_NONE);
pTr->flags |= CSL_FMK(UDMAP_TR_FLAGS_TRIGGER0_TYPE, CSL_UDMAP_TR_FLAGS_TRIGGER_TYPE_ALL);
pTr->flags |= CSL_FMK(UDMAP_TR_FLAGS_TRIGGER1, CSL_UDMAP_TR_FLAGS_TRIGGER_NONE);
pTr->flags |= CSL_FMK(UDMAP_TR_FLAGS_TRIGGER1_TYPE, CSL_UDMAP_TR_FLAGS_TRIGGER_TYPE_ALL);
pTr->flags |= CSL_FMK(UDMAP_TR_FLAGS_CMD_ID, 0x25U); /* This will come back in TR response */
pTr->flags |= CSL_FMK(UDMAP_TR_FLAGS_SA_INDIRECT, 0U);
pTr->flags |= CSL_FMK(UDMAP_TR_FLAGS_DA_INDIRECT, 0U);
pTr->flags |= CSL_FMK(UDMAP_TR_FLAGS_EOP, 1U);
pTr->icnt0 = length;
pTr->icnt1 = 1U;
pTr->icnt2 = 1U;
pTr->icnt3 = 1U;
pTr->dim1 = pTr->icnt0;
pTr->dim2 = (pTr->icnt0 * pTr->icnt1);
pTr->dim3 = (pTr->icnt0 * pTr->icnt1 * pTr->icnt2);
pTr->addr = (uint64_t) Udma_defaultVirtToPhyFxn(srcBuf, 0U, NULL);
pTr->fmtflags = 0x00000000U; /* ÏßÐÔѰַ, 1 byte per elem */
pTr->dicnt0 = length;
pTr->dicnt1 = 1U;
pTr->dicnt2 = 1U;
pTr->dicnt3 = 1U;
pTr->ddim1 = pTr->dicnt0;
pTr->ddim2 = (pTr->dicnt0 * pTr->dicnt1);
pTr->ddim3 = (pTr->dicnt0 * pTr->dicnt1 * pTr->dicnt2);
pTr->daddr = (uint64_t) Udma_defaultVirtToPhyFxn(destBuf, 0U, NULL);
/* »º´æ»ØÐ´ */
CacheP_wb(trpdMem, UDMA_TEST_TRPD_SIZE, CacheP_TYPE_ALLD);
return;
}

