工具/软件:
您好!
我正在尝试设置由 ePWM 触发的 DMA。
在 ePWM 触发之后、DMA 将获取 2 个字节 (ACnt)、4 次 (BCnt)、2 次 (CCnt)。
我希望重新配置 DMA、以便在接下来的 ePWM 触发条件下再次执行完整传输(包括 CCnt)。
我看到的问题是、在开始时传输只进行一次(或两次)、然后不会在每次 ePWM 触发时继续 DMA 传输。 当我知道源正在更改时、我在目的地看不到新数据。
如果我将其更改为仅进行 2D 传输(即 set cCnt = 1、 p.srcCIdx = 0;p.destCIdx = 0;)、它会执行连续的 DMA 传输、我会在目标位置看到新数据
我目前正在使用 AB 转接、但如果有更好的方法、我愿意进行更改。
下面是我使用的参数:
EDMACCPaRAMEntry p;
EDMA_ccPaRAMEntry_init(&p);
p.srcAddr = src_addr;
p.destAddr = dest_addr;
p.aCnt = 2;
p.bCnt = 4;
p.cCnt = 2;
p.bCntReload = p.bCnt;
p.srcBIdx = 0x100;
p.destBIdx = 0x2;
p.srcCIdx = 0x1000;
p.destCIdx = 0x2 * 0x4;
p.srcBIdxExt = 0;
p.destBIdxExt = 0;
p.linkAddr = 0xFFFFU; // Disable linking here, will be set explicitly later.
p.opt = 0U;
if (!is_empty_buffer) {
p.opt |= EDMA_OPT_TCINTEN_MASK;
}
// AB-sync transfer
p.opt |= ((EDMA_SYNC_AB << EDMA_OPT_SYNCDIM_SHIFT) & EDMA_OPT_SYNCDIM_MASK);
uint32_t baseAddr = EDMA_getBaseAddr(gEdmaHandle[0]);
uint32_t regionId = EDMA_getRegionId(gEdmaHandle[0]);
uint32_t channel_id = EDMA_RESOURCE_ALLOC_ANY;
uint32_t tcc = EDMA_RESOURCE_ALLOC_ANY;
uint32_t param = EDMA_RESOURCE_ALLOC_ANY;
EDMA_configureChannelRegion(
baseAddr, regionId, EDMA_CHANNEL_TYPE_DMA, channel_id, tcc, param, 0);
// Clear and set TCC in opt
p.opt &= ~EDMA_OPT_TCC_MASK;
p.opt |= ((static_cast<std::uint32_t>(tcc) << EDMA_OPT_TCC_SHIFT) & EDMA_OPT_TCC_MASK);
EDMA_setPaRAM(baseAddr, param, &p);
// Link the DMA Param to itself to enable continuous operation
EDMA_linkChannel(baseAddr, param, param);
EDMA_enableTransferRegion(baseAddr, regionId, channel_id, EDMA_TRIG_MODE_EVENT);
如果有人指出如何配置 3D 以将此传输链接到在每个 ePWM 触发时持续运行、我将不胜感激。
谢谢!