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.

[参考译文] CCS/TMS570LC4357:在 TMS570LC43x Hercules 开发套件(HDK)中 DMA 软件未触发

Guru**** 2487425 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/738856/ccs-tms570lc4357-dma-sw-not-triggering-in-tms570lc43x-hercules-development-kit-hdk

器件型号:TMS570LC4357

工具/软件:Code Composer Studio

您好:

 我的器件是 tms570LC43x、我测试以下软代码以使用 DMA_SW 触发 DMA,、但它不起作用、我发现语句"dmaSetChEnable (DMA_CH0、DMA_SW)"不会更改 SWCHENAS 寄存器的值、我不知道原因、是否有任何需要特别注意的地方?

顺便说一下、我测试了"example_sci_dma.c"示例、它运行良好、 我知道"如果启用了 SCI DMA、 当数据写入 SCITD 且 TXRDY 置位时、SCI TX DMA 请求被发送到 DMA "、但我在发送请求之前看不到任何数据被写入 SCITD、它如何发送请求?我找到"sciREG3->SETINT |= SCI_SET_TX_DMA | SCI_SET_RX_DMA| SCI_SET_SEND_DMA;这是所有类型的"DMA 奇怪的是,谁能解释这一点?

 

int main (空)

/*用户代码开始(3)*/
uint32 src0[transfer_size]={0x11111111、0x22222222、0x333333、0x444444、0x555555、 0x66666666、0x77777777、0x8888888888};
uint32 src1[transfer_size]={0x99999999、0xaaaaaaaaaa、0xbbbbbbbb、0xcccccc、0xdddddddd、 0xeeeeee、0xffffffff、0x12345678};
uint32 src2[transfer_size]={0x11223344、0x55667788、0x99aabbcc、0xddeeff00、0x12345678、 0x1、3579bdf、0x2468ace0、0x87654321};

uint32 dest0[transfer_size]={0};
uint32 dest1[transfer_size]={0};
uint32 dest2[transfer_size]={0};

/*启用 IRQ 中断*/
_enable_IRQ ();
dmaEnable();

/*-配置 DMA 控制数据包*/
G_dmaCTRLPKT.Sadd =(uint32_t) src0;/*源地址*
G_dmaCTRLPKT.DADD =(uint32_t) dest0;/*目标地址;TG0的起始地址*/
G_dmaCTRLPKT.CHCTRL = DMA_CH1 + 1;/*通道控制*
G_dmaCTRLPKT.FRCNT = F_COUNT;/*帧计数*/
G_dmaCTRLPKT.ELCNT = E_COUNT;/*元素计数*
G_dmaCTRLPKT.ELDOFFSET = 0;/*元素目标偏移量*
G_dmaCTRLPKT.ELSOFFSET = 0;/*元素目标偏移量*
G_dmaCTRLPKT.FRDOFFSET = 0;/*帧目标偏移量*
G_dmaCTRLPKT.FRSOFFSET = 0;/*帧目标偏移量*
G_dmaCTRLPKT.PORTASGN = PORTA_READ_PORTA_WRITE;
G_dmaCTRLPKT.RDSIZE = ACCESS_32_BIT;/*读取大小*
G_dmaCTRLPKT.WRSIZE = ACCESS_32_BIT;/*写入大小*
G_dmaCTRLPKT.tType = frame_transfer;/* transfer type *
G_dmaCTRLPKT.ADDMODERD = ADDR_INC1;/*地址模式读取*
G_dmaCTRLPKT.ADDMODEWR = ADDR_INC1;/*地址模式写入*
G_dmaCTRLPKT.AUTOINIT = AUTOINIT_OFF;/*自动初始化*/

//为接收设置 DMA 控制数据包
dmaSetCtrlPacket (DMA_CH0、g_dmaCTRLPKT);

/*-配置 DMA 控制数据包*/
G_dmaCTRLPKT.Sadd =(uint32_t) src1;//源地址*
G_dmaCTRLPKT.DADD =(uint32_t) dest1;/*目标地址;TG0的起始地址*/
G_dmaCTRLPKT.CHCTRL = DMA_CH2 + 1;/*通道控制*
G_dmaCTRLPKT.FRCNT = F_COUNT;/*帧计数*/
G_dmaCTRLPKT.ELCNT = E_COUNT;/*元素计数*
G_dmaCTRLPKT.ELDOFFSET = 0;/*元素目标偏移量*
G_dmaCTRLPKT.ELSOFFSET = 0;/*元素目标偏移量*
G_dmaCTRLPKT.FRDOFFSET = 0;/*帧目标偏移量*
G_dmaCTRLPKT.FRSOFFSET = 0;/*帧目标偏移量*
G_dmaCTRLPKT.PORTASGN = PORTA_READ_PORTA_WRITE;
G_dmaCTRLPKT.RDSIZE = ACCESS_32_BIT;/*读取大小*
G_dmaCTRLPKT.WRSIZE = ACCESS_32_BIT;/*写入大小*
G_dmaCTRLPKT.tType = frame_transfer;/* transfer type *
G_dmaCTRLPKT.ADDMODERD = ADDR_INC1;/*地址模式读取*
G_dmaCTRLPKT.ADDMODEWR = ADDR_INC1;/*地址模式写入*
G_dmaCTRLPKT.AUTOINIT = AUTOINIT_OFF;/*自动初始化*/

//为接收设置 DMA 控制数据包
dmaSetCtrlPacket (DMA_CH1、g_dmaCTRLPKT);

/*-配置 DMA 控制数据包*/
G_dmaCTRLPKT.Sadd =(uint32_t) src2;/*源地址*
G_dmaCTRLPKT.DADD =(uint32_t) dest2;/*目标地址;TG0的起始地址*/
G_dmaCTRLPKT.CHCTRL = 0;/*通道控制*/
G_dmaCTRLPKT.FRCNT = F_COUNT;/*帧计数*/
G_dmaCTRLPKT.ELCNT = E_COUNT;/*元素计数*
G_dmaCTRLPKT.ELDOFFSET = 0;/*元素目标偏移量*
G_dmaCTRLPKT.ELSOFFSET = 0;/*元素目标偏移量*
G_dmaCTRLPKT.FRDOFFSET = 0;/*帧目标偏移量*
G_dmaCTRLPKT.FRSOFFSET = 0;/*帧目标偏移量*
G_dmaCTRLPKT.PORTASGN = PORTA_READ_PORTA_WRITE;
G_dmaCTRLPKT.RDSIZE = ACCESS_32_BIT;/*读取大小*
G_dmaCTRLPKT.WRSIZE = ACCESS_32_BIT;/*写入大小*
G_dmaCTRLPKT.tType = frame_transfer;/* transfer type *
G_dmaCTRLPKT.ADDMODERD = ADDR_INC1;/*地址模式读取*
G_dmaCTRLPKT.ADDMODEWR = ADDR_INC1;/*地址模式写入*
G_dmaCTRLPKT.AUTOINIT = AUTOINIT_OFF;/*自动初始化*/

//为接收设置 DMA 控制数据包
dmaSetCtrlPacket (dma_ch2、g_dmaCTRLPKT);

dmaSetChEnable (DMA_CH0、DMA_SW);//启用 DMA 通道*
dmaSetChEnable (DMA_CH1、DMA_HW);

dmaSetChEnable (DMA_CH2、DMA_HW);

while ((dmaREG->HWCHENAS & 0x07)!= 0x0);

while (1);/*循环永远*/

/*用户代码结束*/

返回0;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已解决此问题,以下是我的代码:

    /*包含文件*/

    #include "hL_sys_common.h"

    /*用户代码开始(1)*/
    #include "HL_SYS_DMA.h"
    #include "hL_sci.h"
    //#include "stdio.h"
    /*用户代码结束*/

    /**@fn void main (void)
    *@应用程序主函数简介
    *@请注意、默认情况下、此函数为空。
    *
    *此函数在启动后调用。
    *用户可以使用此函数来实现应用程序。
    *

    /*用户代码开始(2)*/
    #define size 9
    /*如果 LOOPBACKMODE 定义为0、则需要外部连接(SCI3 TX -> SCI4 RX)*/
    #define LOOPBACKMODE 1.

    /* Tx 和 Rx 数据缓冲器*/
    /*编辑 JC 20160102:将这些变量放入写入槽内存中,以便 DMA 操作从高速缓存写入内存*/
    #pragma SET_DATA_SECTION (".sharedRAM")
    uint16_t TX_Data1[size]={0、1、2、3、4、5、6、7、8};
    uint16_t RX_Data1[size]={9};
    uint16_t TX_DATA2[大小]={0、1、2、3、4、5、6、7、8};
    uint16_t RX_DATA2[size]={9};

    #pragma SET_DATA_SECTION ()


    /*用户代码结束*/

    void main (void)

    /*用户代码开始(3)*/
    uint32 sciTxData、sciRxData;
    int i;
    g_dmaCTRL g_dmaCTRLPPKT1、g_dmaCTRLPPKT2;



    /*为通道0*/配置控制包
    G_dmaCTRLPKT1.Sadd =(uint32_t) TX_Data1;//源地址 *
    G_dmaCTRLPKT1.DADD =(uint32_t) RX_Data1;//sciTxData;/*目标地址 *
    G_dmaCTRLPKT1.CHCTRL = DMA_CH1 + 1;/*通道控制 *
    G_dmaCTRLPKT1.FRCNT=大小; /*帧计数 *
    G_dmaCTRLPKT1.ELCNT = 1;/*元素计数 *
    G_dmaCTRLPKT1.ELDOFFSET = 0;/*元素目标偏移量*/
    G_dmaCTRLPKT1.ELSOFFSET = 0;/*元素目标偏移量*/
    G_dmaCTRLPKT1.FRDOFFSET = 0;/*帧目的偏移量*/
    G_dmaCTRLPKT1.FRSOFFSET = 0;/*帧目的偏移量*/
    G_dmaCTRLPKT1.PORTASGN = PORTA_READ_PORTA_WRITE;
    G_dmaCTRLPKT1.RDSIZE = ACCESS_16_BIT;/*读取大小 *
    G_dmaCTRLPKT1.WRSIZE = ACCESS_16_BIT;/*写入大小 *
    G_dmaCTRLPKT1.tType = block_transfer;/*传输类型 *
    G_dmaCTRLPKT1.ADDMODERD = ADDR_INC1;读取/*地址模式 *
    G_dmaCTRLPKT1.ADDMODEWR = ADDR_INC1;/*地址模式写入 *
    G_dmaCTRLPKT1.AUTOINIT = AUTOINIT_OFF;/*自动初始化 *

    /*为通道1*/配置控制包
    G_dmaCTRLPKT2.Sadd =(uint32_t) TX_DATA2;/*源地址 *
    G_dmaCTRLPKT2.DADD =(uint32_t) RX_DATA2;/*目的地址 ss *
    G_dmaCTRLPKT2.CHCTTRL = 0;/*通道控制 *
    G_dmaCTRLPKT2.FRCNT=大小; /*帧计数 *
    G_dmaCTRLPKT2.ELCNT = 1;/*元素计数 *
    G_dmaCTRLPKT2.ELDOFFSET = 0;/*元素目标偏移量*/
    G_dmaCTRLPKT2.ELSOFFSET = 0;/*元素目标偏移量*/
    G_dmaCTRLPKT2.FRDOFFSET = 0;/*帧目的偏移量*/
    G_dmaCTRLPKT2.FRSOFFSET = 0;/*帧目的偏移量*/
    G_dmaCTRLPKT2.PORTASGN = PORTA_READ_PORTA_WRITE;
    G_dmaCTRLPKT2.RDSIZE = ACCESS_16_BIT;/*读取大小 *
    G_dmaCTRLPKT2.WRSIZE = ACCESS_16_BIT;/*写入大小 *
    G_dmaCTRLPKT2.tType = block_transfer;/*传输类型 *
    G_dmaCTRLPKT2.ADDMODERD = ADDR_INC1;读取/*地址模式 *
    G_dmaCTRLPKT2.ADDMODEWR = ADDR_INC1;/*地址模式写入 *
    G_dmaCTRLPKT2.AUTOINIT = AUTOINIT_OFF;/*自动初始化 *

    /*为通道0和1设置控制数据包*/
    dmaSetCtrlPacket (DMA_CH0、g_dmaCTRLPKT1);
    dmaSetCtrlPacket (dma_ch1、g_dmaCTRLPKT2);

    /*将 DMA 通道0和1设置为在硬件请求时触发*/
    dmaSetChEnable (DMA_CH0、DMA_SW);
    dmaSetChEnable (DMA_CH1、DMA_HW);

    /*启用 DMA*/
    dmaEnable();



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

    for (i=0;<size; i++)

    printf ("rx1:%d、tx1:%d\n"、RX_Data1[i]、TX_Data1[i]);
    printf ("rx2:%d、tx2:%d\n"、RX_DATA2[i]、TX_DATA2[i]);
    if ((RX_Data1[i]!= TX_Data1[i])&&(RX_DATA2[i]!= TX_DATA2[i]))

    中断;



    if (<size)

    printf ("fial \n");
    while (1);//失败:如果程序在此处循环,则数组不相同

    其他

    printf ("SUCCERS\n");
    while (1);//成功:如果程序在此处循环,则数组是相同的



    /*用户代码结束*/


    /*用户代码开始(4)*/
    /*用户代码结束*/
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    感谢您的反馈!

    此致、
    米罗