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.

[参考译文] TMS570LC4357:DMA 由软件从 RAM 触发到 RAM

Guru**** 2462900 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1111932/tms570lc4357-dma-triggered-by-software-from-ram-to-ram

器件型号:TMS570LC4357

我正在尝试使用软件触发器将 DMA 从 RAM 传输到 RAM。 但是、我无法看到 DMA 开始工作、因为目标中没有数据。 我不确定我的代码的问题在哪里、我也不知道如何调试这种情况。

这是我的参考代码。 期待您的回复。

#define DMA_TEST_SRC_ADDRESS               (uint32_t)(0x0807D200)                 //源数据地址
#define DMA_TEST_DEST_ADDRESS              (uint32_t)(0x0807D400)                 //目标数据地址
#define DMA_TEST_DATA_SIZE                 (uint32_t)(0x100)                      // DMA 传输的数据大小

void dma_Test_src_Data_Init (uint8_t STEP)

   uint32_t i = 0;
   uint8_t * srcPtr =(uint8_t *) dma_test_SRC_address;

   对于(i=0;i< dma_test_data_size;i++)
       *(srcPtr++)= i + step;

   返回;

void DMA_Test (void)

   静态 uint8_t seqDMATest = 0;
   uint8 u8PotStringBuf[64];

   g_dmaCTRL g_dmaCTRLPKT1;

   G_dmaCTRLPKT1.Sadd     =(uint32) dma_test_SRC_address;    //源地址            *
   G_dmaCTRLPKT1.DADD     =(uint32) dma_test_dest_address;   //目标 地址      *
   G_dmaCTRLPKT1.CHCTTRL   = 0;                               /*通道控制           *
   G_dmaCTRLPKT1.FRCNT    = 1;                               /*帧计数               */
   G_dmaCTRLPKT1.ELCNT    = DMA_TEST_DATA_SIZE;              /*元素计数             *
   G_dmaCTRLPKT1.ELDOFFSET = 4;                              /*元素目标偏移量*/
   G_dmaCTRLPKT1.ELSOFFSET = 4;                               /*元素目标偏移量*
   G_dmaCTRLPKT1.FRDOFFSET = 0;                               /*帧目标偏移  *
   G_dmaCTRLPKT1.FRSOFFSET = 0;                               /*帧目标偏移  *
   G_dmaCTRLPKT1.PORTASGN = PORTA_READ_PORTA_WRITE;
   G_dmaCTRLPKT1.RDSIZE   = ACCESS_8_BIT;                    /*读取大小                 *
   G_dmaCTRLPKT1.WRSIZE   = ACCESS_8_BIT;                    /*写入大小                *
   G_dmaCTRLPKT1.tType    = frame_transfer;                 /* transfer type             *
   G_dmaCTRLPKT1.ADDMODERD = ADDR_INC1;                       /*地址模式读取         *
   G_dmaCTRLPKT1.ADDMODEWR = ADDR_INC1;                       /*地址模式写入        *
   G_dmaCTRLPKT1.AUTOINIT = AUTOINIT_OFF;                    /*自动初始                  化*/

   //设置通道0的控制数据包
   dmaSetCtrlPacket (dma_test_CH、g_dmaCTRLPKT1);

   //准备用于 DMA 传输的数据
   DMA_Test_src_Data_Init (seqDMATest);

   //将 DMA 通道0设置为在软件请求时触发
   dmaSetChEnable (DMA_TEST_CH、DMA_SW);

   //启用 DMA
   dmaEnable();

   while (dmaGetInterruptStatus (dma_test_CH、BTC)!= true);

   sprintf (u8PotStringBuf、"[Passed]-[Seq#%d]-DMA 测试。 \r\n"、seqDMATest);
   sciDisplayText (UART_Msg、u8PotStringBuf);

   返回;

该函数在每15秒循环一次的同时在主函数中调用。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您的代码没有问题。  由于 地址模式为 ADDR_INC1、因此不使用 ELDOFFSET = 4;ELSOFFSET = 4

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="525219" URL"~μ C/support/microcontrollers/arm-based microcontrollers-group/arm -based microcontrollers/f/arm based 微控制器-forum/1111932/tms570lc4357-dma-ch触发 by-software-from-quote-to-ram"] while (dmaGetInterruptStatus (dma_test=true/true/ram_ch];true= true/true/ram_true/ram_ch]

    您是否启用了 BTC 中断?

    BTC 中断被启用、如下所示:

    dmaEnableInterrupt (DMA_CH0、BTC、DMA_INTA);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我不启用 BTC 中断。 此行已执行、无停转。 即使我将其删除、DMA 也无法正常工作。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的。 因此、ELDOFFSET = 4; ELSOFFSET = 4用于固定地址。 明白了。

    实际上,我对代码有着相同的感觉,但是,我看不到 UnifFlash 读取结果的 DMA 传输... 看起来很奇怪... 此问题的任何其他可能原因? 非常感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    DMA 传输的代码运行正常。 代码中唯一的问题是 DMA 中断未启用,因此 while ()循环将永远循环。

    若要启用 DMA 帧传输中断:

    /*传输完成后为接收启用块传输完成中断*/
    dmaEnableInterrupt (DMA_CH1、FTC、DMA_INTA);