工具/软件: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 通道?
如有任何不明确的问题、请告诉我。 谢谢。