工具/软件:TI C/C++编译器
大家好、
由于项目要求、需要改变每5us ePWM 输出的占空比。 考虑到 CPU 负载为5us 中断、我希望使用 DMA 通道周期性地将预设数据传输到比较寄存器。
假设我将预设数据作为数组、如下所示:
const uint16_t RsvExc_DutyCycle _ PreCfg_Table[];
如何配置 DMA 模块以实现上述自动化?
谢谢!
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.
工具/软件:TI C/C++编译器
大家好、
由于项目要求、需要改变每5us ePWM 输出的占空比。 考虑到 CPU 负载为5us 中断、我希望使用 DMA 通道周期性地将预设数据传输到比较寄存器。
假设我将预设数据作为数组、如下所示:
const uint16_t RsvExc_DutyCycle _ PreCfg_Table[];
如何配置 DMA 模块以实现上述自动化?
谢谢!
您好!
您可以配置 CPU 定时器0 / 1 / 2 (或) PWM 事件(SOC A / SOCB 事件)以每5us 触发一次 DMA 事件、并实现您尝试使用如下所示的 DMA 配置执行的操作。
SRC_BGE_ADDR_SHADDAD_SHADOW = RsvExc_DutyCycle 的地址 PreCfg_Table[]
SRC_ADDR_SHADOW =需要更改占空比的 PWM CMPA/CMPB 寄存器的地址
dst_beg_ADDR_shadow = RsvExc_DutyCycle 的地址 PreCfg_Table[]
DST_ADDR_SHADOW =需要更改占空比的 PWM CMPA/CMPB 寄存器的地址
突发配置详细信息:
BURST_SIZE = 1
SRC_BURST_STEP = 1
dst_burst_step = 0
换行配置详细信息:
src_wrap_size = RsvExc_DutyCycle 的缓冲区大小 PreCfg_Table[]
src_wrap_step =您需要减去以获得 RsvExc_DutyCycle 的起始地址 PreCfg_Table[]( RsvExc_DutyCycle 的缓冲区大小负值 PreCfg_Table [])
dst_wrap_size = RsvExc_DutyCycle 的缓冲区大小 PreCfg_Table[]
dst_burst_step = 0
传输配置详细信息:
transfer_size =应大于 SRC_wrap_size
SRC_TRANSFER_STEP = 1.
dst_transfer_step = 0
此致、
曼诺伊
您好、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 通道?
如有任何不明确的问题、请告诉我。 谢谢。
您好!
仅 当 TRANSFER_SIZE > WOP_SIZE 时、才会激活换行功能。 我在上述建议中也提到了这一点。 在代码中、您有 transfer_size = wrap_size。 这不奏效。
因此、请按如下方式更改配置、并查看它是否可以解决问题。
DMA_TransferSize = RESEXC_SAMPLE_DEPTH + 1 //或任何大于 RESEXC_SAMPLE_DEPTH 的值
//DMA_SrcWrapSize = RESEXC_SAMPLE_DEPTH
当您有2个 DMA 通道由同一 EPWM11SOCA 信号触发时。 DMA 通道优先级(循环/通道1高优先级)将决定 DMA 何时为哪个通道提供服务。 如果 DMA.CH1和 DMA.CH2由 EPWM11SOCA 触发、则 DMA 将首先为 DMA.CH1提供服务、然后进入 DMA.CH2。 有关更多详细信息、请参阅 DMA 一章中的通道优先级部分。
此致、
曼诺伊