这是我仿着官方例程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; }