大家好、我在 CPU1中完成了 FFT 计算、其中有2048个样本与 DMA 配合使用、我从 ADC 中获取了样本并将其放入缓冲器中、我从中进行了计算。 现在我想将 FFT 移动到 CLA (以节省时间)、但它对我来说不能正常工作。 在 CLA 中、我使用1024个样本、我将填充的缓冲器从 DMA 复制到 IOBuffer、并在 CLA 中计算 FFT。 在计算完成后,我得到 ISR,在这里我计算幅度,然后再从中进行其他计算(rms、能量、相移等)。 我在这里看到了错误 对于50Hz (20ms)正弦信号、我使用 ePWM 作为 ADC 触发器来计算所需样本的确切数量(现在为1024)(ePWM TBCLK = 100MHz;CLKDIV = 0;TBPRD = 1953;CMPA = 977;)。
RFFTmag 还必须位于 LS RAM 中? 因为我没有足够的空间、所以我将其放置在 GSram 中。
我的链接器: e2e.ti.com/.../2837xD_5F00_FLASH_5F00_lnk_5F00_cpu1.rar
我的 CLA 代码:
/*----------------- *
//FFT CLA
/*----------------- *
RFFT_F32_struct rfft;// FFT 对象
#pragma DATA_SECTION (IOBuffer、"IOBuffer"); //输入数组的缓冲区对齐、
float32 IOBuffer[RFFT_SIZE]; //RFFT_f32u (可选)、RFFT_F32 (必需)
// FFT 的输出会覆盖输入 IF
//RFFT_STOPENAINAINESDON_STOPEN
#pragma DATA_SECTION (IOBuffer2、"IOBuffer");
float32 IOBuffer2[RFFT_SIZE]; //此处的 FFT 输出(如果 RFFT_STOPENAINAINSES偶 数)
#pragma DATA_SECTION (RFFTmagBuff、"RFFTmag");
float32 RFFTmagBuff[RFFT_SIZE/2+1]; //幅度计算中使用的附加缓冲器
#pragma DATA_SECTION (RFFTF32Coef、"RFFTTwides");
float32 RFFTF32Coef[512]; //Twiddle 缓冲器
空 init_cla (空)
{
extern uint32_t Cla1funcsRunStart、Cla1funcsLoadStart、Cla1funcsLoadSize;
extern uint32_t Cla1ConstRunStart、Cla1ConstLoadStart、Cla1ConstLoadSize;
EALLOW;
#ifdef _flash
//CLA 存储器初始化
memcpy (((uint32_t *)&Cla1funcsRunStart、(uint32_t *)&Cla1funcsLoadStart、(uint32_t)&Cla1funcsLoadSize);
memcpy (((uint32_t *)&Cla1ConstRunStart、(uint32_t *)&Cla1ConstLoadStart、(uint32_t)&Cla1ConstLoadSize);
#endif
//初始化并等待 CLA1ToCPUMsgRAM
MemCfgRegs.MSGxINIT.bit.init_CLA1TOCPU = 1;
while (MemCfgRegs.MSGxINITDONE.bit.INITDONE_CLA1TOCPU!= 1){};
//初始化并等待 CPUToCLA1MsgRAM
MemCfgRegs.MSGxINIT.bit.init_CPUTOCLA1 = 1;
while (MemCfgRegs.MSGxINITDONE.bit.INITDONE_CPUTOCLA1!= 1){};
//LS RAM 控制 PRE CLA
//程序空间
MemCfgRegs.LSxMSEL.bit.MSEL_LS2 = 1;
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS2 = 1;
MemCfgRegs.LSxMSEL.bit.MSEL_LS3 = 1;
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS3 = 1;
//数据空间
MemCfgRegs.LSxMSEL.bit.MSEL_LS0 = 1;
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS0 = 0;
MemCfgRegs.LSxMSEL.bit.MSEL_LS1 = 1;
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS1 = 0;
MemCfgRegs.LSxMSEL.bit.MSEL_LS4 = 1;
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS4 = 0;
MemCfgRegs.LSxMSEL.bit.MSEL_LS5 = 1;
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS5 = 0;
EDIS;
//任务
EALLOW;
Cla1Regs.MVECT1 =(uint16_t)(&Cla1Task1);
// Cla1Regs.MVECT2 =(uint16_t)(&Cla1Task2);
// Cla1Regs.MVECT3 =(uint16_t)(&Cla1Task3);
// Cla1Regs.MVECT4 =(uint16_t)(&Cla1Task4);
// Cla1Regs.MVECT5 =(uint16_t)(&Cla1Task5);
// Cla1Regs.MVECT6 =(uint16_t)(&Cla1Task6);
// Cla1Regs.MVECT7 =(uint16_t)(&Cla1Task7);
Cla1Regs.MVECT8 =(uint16_t)(&Cla1Task8);
//触发集
DmaClaSrcSelRegs.CLA1TASKSRCSEL1.bit.task1 = CLA_TRIG_NOPERPH;
DmaClaSrcSelRegs.CLA1TASSKSRCSEL2.bit.TASK8 = CLA_TRIG_NOPERPH;
Cla1Regs.MIER = (M_INT1 | M_INT8);
//SW 任务组启用
Cla1Regs.MCTL.bit.IACKE = 1;
//CLA ISR
PieVectTable.CLA1_1_INT =&cla1Isr1;
PieCtrlRegs.PIEIER11.bit.INTx1 = 0x01;
IER |=(M_INT11);
EDIS;
}
void init_ClaFFT (void)
{
memset (&IOBuffer、0、sizeof (IOBuffer));
memset (&IOBuffer2、0、sizeof (IOBuffer2));
memset (&RFFTmagBuff、0、sizeof (RFFTmagBuff));
rfft.FFTize = RFFT_SIZE;//(1 << RFFT_STACTS)
rfft.FFTStages = RFFT_STACages;//(10U)
rfft.InBuf =&IOBuffer[0]; //输入缓冲区
rfft.OutBuf =&IOBuffer2[0]; //输出缓冲区
rfft.CosSinBuf =&RFFTF32Coef[0]; //Twiddle 因子缓冲器
rfft.MagBuf =&RFFTmagBuff[0]; //Magnitude buffer
RFFT_F32_SINCOSTable (&rfft); //计算旋转因子
}
CLA:
_interrupt void Cla1Task1 (void)
{
//_mdebugstop();
CLA_CFFT_run512Pt ();
CLA_CFFT_unpack512Pt ();
}
_interrupt void cla1Isr1 ()
{
if (CLASignalType = 0)
{
///Volt 结构
FFT_COMPUTATION_CLA (&volt1、rfft.OutBuf);//Harmonic from rfft.OutBuf
}
其他
{
if (CLASignalType = 1)
{
//当前结构
FFT_COMPUTATION_CLA (&curr1、rfft.OutBuf);
}
}
ClaComputationDone = true;
PieCtrlRegs.PIEACK.ALL = M_INT11;
}
用于比较 CLA 和旧 CPU 计算(效果良好)的图形 rfft.MagBuf、相同的正弦信号50Hz、CLA 1024个样本 FFT、CPU 2048个样本 FFT。

感谢您的建议、Marek。