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.

[参考译文] 编译器/TMS320F28388D:DMA 换行功能

Guru**** 2529560 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/870315/compiler-tms320f28388d-dma-wrap-feature

器件型号:TMS320F28388D

工具/软件:TI C/C++编译器

您好、Manoj、

我执行了如下 DMA 通道配置:

#pragma DATA_SECTION (RsvExc_DutyCycle _ PreCfg_Table、"ramgs2");
uint16_t RsvExc_DutyCycle _ PreCfg_Table[RESEXC_SAMPLE_DEPTY]={
0x0050、
0x0064、
0x0078、
0x008C、
0x00A0、
0x00B4、
0x00C8、
0x00DC、
0x00F0、
0x0104、
0x0118、
0x012C、
0x0140、
0x0154、
0x0168、
0x017C、
0x0190、
0x01A4、
0x01B8、
0x01CC
、};

const DMA_ChannelConfigType DmaChn_RsvExcelDutyCycle _t={
DMA_CH1_BASE、 //DMA_Base;
(const void*)(EPWM11_BASE + EPWM_O_CMPB+1)、 //dma_destAddr;
&RsvExc_DutyCycle _ PreCfg_Table[0]、 //dma_SrcAddr;
1、 //DMA_BurstSize;
1、 //DMA_BurstSrcStep;
0、 //DMA_BurstDestStep;
RESEXC_SAMPLE_DEPTH、 //DMA_TransferSize;
1、 //DMA_TransferSrcStep;
0、 //DMA_TransferDestStep;
RESEXC_SAMPLE_DEPTH、 //DMA_SrcWrapSize;
0、 //DMA_WrapSrcStep;
RESEXC_SAMPLE_DEPTH、 //DMA_DestWrapSize;
0、 //DMA_WrapDestStep;
DMA_TRIGGER_EPWM11SOCA、 //dma_TrigSrc;
DMA_CFG_OneShot_disable |
DMA_CFG_Continuous_enable |
DMA_CFG_Size_16BIT、 //dma_Mode;
};

void dma_Init (dma_ChannelConfigType dmaChn)
{
dma_initController();

dma_configAddresses (dmaChn.dma_Base、dmaChn.dma_DestAddr、dmaChn.dma_SrcAddr);
dma_configBurst (dmaChn.dma_Base、dmaChn.dma_BurstSize、dmaChn.dma_BurstSrcStep、dmaChn.dma_BurstDestStep);
DMA_configTransfer (dmaChn.DMA_Base、dmaChn.DMA_TransferSize、dmaChn.DMA_TransferSrcStep、dmaChn.DMA_TransferDestStep);
DMA_configWrap (dmaChn.DMA_Base、dmaChn.DMA_SrcWrapSize、dmaChn.DMA_WrapSrcStep、dmaChn.DMA_DestWrapSize、dmaChn.DMA_DestWrapStep);
DMA_configMode (dmaChn.DMA_Base、dmaChn.DMA_TrigSrc、dmaChn.DMA_Mode);
DMA_enableTrigger (dmaChn.DMA_Base);
dma_startChannel (dmaChn.dma_Base);

}

根据上述代码,我发现了 DMA 模块的几种异常行为。 

首先、值得一提的是、我从占空比表(即 RsvExc_DutyCycle _PreCfg_Table)获得了看似正确的传输结果、以比较 EPWM11的寄存器 B
(即(EPWM11_BASE + EPWM_O_CMPB+1))。 但换行配置与您的建议不同。 此外、我还得到了
在我注释如下代码语句时、结果似乎相同:
//dma_configWrap (dmaChn.dma_Base、dmaChn.dma_SrcWrapSize、dmaChn.dma_SrcStep、dmaChn.dma_DestSize、dmaChn.dma_DestWrapStep); 

 包装特征剂量似乎根本不起作用。 但是、DMA 传输可以在表到达其末尾时继续进行、并 从表的开头重新启动、正如换行功能所做的那样。 那么、我有什么问题吗? 我很困惑。

  其次、按照您的建议进行编码、我使用       RsvExc_DutyCycle _PreCfg_Table[]的 BufferSize 负值的回绕源步骤配置了 DMA 通道:

 const DMA_ChannelConfigType DmaChn_RsvDutyCycle _t={

DMA_CH1_BASE、 //DMA_Base;
(const void*)(EPWM11_BASE + EPWM_O_CMPB+1)、 //dma_destAddr;
&RsvExc_DutyCycle _ PreCfg_Table[0]、 //dma_SrcAddr;
1、 //DMA_BurstSize;
1、 //DMA_BurstSrcStep;
0、 //DMA_BurstDestStep;
RESEXC_SAMPLE_DEPTH、 //DMA_TransferSize;
1、 //DMA_TransferSrcStep;
0、 //DMA_TransferDestStep;
RESEXC_SAMPLE_DEPTH、 //DMA_SrcWrapSize;
-RESEXC_SAMPLE_DEPTH、 //DMA_WrapSrcStep;
RESEXC_SAMPLE_DEPTH、 //DMA_DestWrapSize;
0、 //DMA_WrapDestStep;
DMA_TRIGGER_EPWM11SOCA、 //dma_TrigSrc;
DMA_CFG_OneShot_disable |
DMA_CFG_Continuous_enable |
DMA_CFG_Size_16BIT、 //dma_Mode;
}; 

  但是、当前地址指针剂量不会绕回表的开头;相反、它会到达&RsvExc_DutyCycle _PreCfg_Table[0]减去 RESEXC_SAMPLE_DEPTH 的地址。 因此、我认为我不能正确理解换行。

  第三、我使用 另一个也由 DMA_TRIGGER_EPWM11SOCA 触发的 DMA 通道来读取另一个 ePWM 模块的 TBCTR 的时间戳。

  但时间间隔会奇怪地扩大。 当我使用与前一个触发源不同的另一个触发源、例如 DMA_TRIGGER_EPWM13SOCA 时、结果(时间间隔)是正确的。 是否不允许配置具有相同触发源的两个 DMA 通道?


如有任何不明确的问题、请告诉我。 谢谢。