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.

TMS320F280039: 280039 ADC DMA采样相关问题

Part Number: TMS320F280039
Other Parts Discussed in Thread: C2000WARE

你好,在app配置ADC DMA采样用,跳到boot或在flash擦除期间CPU卡死导致看门狗复位,请问是什么原因? ADC DMA配置(功能对两通道ADC搬移到buf1[ ] buf2[ ])有什么问题?

DMA_configAddresses(DMA_CH1_BASE, (const void*)0x0000D978U, (const void*)0x00000B03U);
//DMA_configAddresses(DMA_CH1_BASE, uwAdc1DmaBuf, &AdcaResultRegs.ADCRESULT3); //(const void*)0x00000B03U
DMA_configBurst(DMA_CH1_BASE, ADC1_BURST_LENGTH=2, 1, ADC1_DMA_SIZE=4);
DMA_configTransfer(DMA_CH1_BASE, ADC1_DMA_SIZE=4, -1, -3);
DMA_configWrap(DMA_CH1_BASE, ADC1_DMA_SIZE=4, 0, ADC1_DMA_SIZE=4, 0);
DMA_configMode(DMA_CH1_BASE, DMA_TRIGGER_EPWM8SOCA, DMA_CFG_ONESHOT_DISABLE | DMA_CFG_CONTINUOUS_ENABLE | DMA_CFG_SIZE_16BIT);
DMA_enableTrigger(DMA_CH1_BASE);
DMA_startChannel(DMA_CH1_BASE);

ADC1_RAMGS1 : origin = 0x0000D978, length = 0x0000004
ADC2_RAMGS1 : origin = 0x0000D97C, length = 0x0000004

  • 你这个复位的问题和配置ADC DMA没什么关系。

  • 是否连接了调试器? 您能否尝试逐步查看代码并验证问题发生在哪里? 我看不到您的配置有任何直接问题,但您的链接程序cmd文件可能有问题。 为了在GSRAM中创建缓冲区,建议在链接程序cmd文件中使用用户定义的部分,并使用data_section pragma将数组分配给这些区域。 C2000ware示例中有一个很好的示例:[C2000ware install]/driverlib/f28003x/examples/dma/dma_ex1_gsram_transfer 

  • 1.没有连接调试器

    2.出现后用调试器读,停在非法中断函数,  分析下什么原因?

    3.指定定义如下,  看下什么原因?

    #pragma DATA_SECTION(uwAdc1DmaBuf, "ADCBUF1_DMA");
    Uint16 uwAdc1DmaBuf[ADC1_DMA_SIZE] = {0};

    #pragma DATA_SECTION(uwAdc2DmaBuf, "ADCBUF2_DMA");
    Uint16 uwAdc2DmaBuf[ADC2_DMA_SIZE] = {0};
    cmd:
    PAGE 1 :
       DMA_RAMGS1       : origin = 0x0000D780, length = 0x00001F8
       ADC1_RAMGS1      : origin = 0x0000D978, length = 0x0000004
       ADC2_RAMGS1      : origin = 0x0000D97C, length = 0x0000004
  • 只有flash擦除期间才会复位吗?正常时候不复位吗?

  • 是的,只有boot下flash擦除期间才会复位(非法中断),正常时候app不复位

    想要实现目的,如下:

  • 把DMA注释掉后flash擦除期间就不会复位了吗?

  • 是的,把DMA注释掉后flash擦除期间就不会复位

  • 1:你如何跳到boot的,用的软件复位吗?还是直接跳转到boot程序里?

    2:boot和app是分开的工程吗?你看下boot的cmd文件里,有没有用到RAMGS1这片内存。

  • 而不是使用内存范围来定义主文件中的data_section,您应该从内存范围中创建用户定义的节,并将其用于data_section pragma。 有关此示例,请参阅前面提到的示例的链接程序cmd文件中的"ramgs0"用户定义部分。 

  • 1.跳转指令,直接跳转到boot程序

    2.boot和app是分开的工程

    boot cmd中 对应区域没有特殊被指定使用: RAMGS_Prog           : origin = 0x0000D200, length = 0x00002DF8

  • 尽量用软件复位进BOOT,可以自动把所有外设复位;不用复位直接跳转的话在进BOOT前主动复位ePWM和DMA外设。

    RAMGS_Prog应该用到了吧,你再仔细看看,FLASH擦除要把代码搬到RAM中运行的,这个名字难道不是用来存放RAM运行代码的吗?如果RAMGS_Prog有被用到的话应该就是被DMA擦除了代码。

  • 你好,FLASH擦除要把代码搬到RAM中运行的,如下:

    #pragma CODE_SECTION(Upgrade_CmdOrder45H, ".TI.ramfunc");
    Uint16 Upgrade_CmdOrder45H(Uint16 *pDataRx, Uint16 *uiTxLen, Uint16 *pDataTx)

    {

          Flash_ClearFlashBack();

    }

    #pragma CODE_SECTION(Flash_ClearFlash, ramFuncSection);
    Uint16 Flash_ClearFlash()

    {

       oReturnCheck = Fapi_setActiveFlashBank(Fapi_FlashBank0);

    }

    .TI.ramfunc : LOAD = FLASH_APP,
    RUN = RAMGS_Prog
    LOAD_START(_RamfuncsLoadStart),
    LOAD_SIZE(_RamfuncsLoadSize),
    LOAD_END(_RamfuncsLoadEnd),
    RUN_START(_RamfuncsRunStart),
    RUN_SIZE(_RamfuncsRunSize),
    RUN_END(_RamfuncsRunEnd),
    ALIGN(4)