部件号:LAUNCHXL-F2.8377万S
工具/软件:Code Composer Studio
大家好,
我在使用FPU FIR过滤器库时遇到了一些问题。
我遵循了"应用程序编程接口(FPU)"的示例(2015年6月2日PAG 78)。
在我的代码中,我有 float32 RFFTin1Buff[RFFT_size]输入缓冲区(包含以伏特计的ADC样本)和 float32 sigOut[RFFT_size](过滤信号),其中RFFT_size为2048。
问题是sigOut始终为0向量。 有人遇到过类似问题?
FPU库的版本是:V1_50_00_00
非常感谢,
Paolo
//........ FIR滤波器设置..........
#define FIR_ORDER 511
#pragma DATA_SECection(firfp,"firfilt")
FIR_FP FIRFP = FIR_FP_DEFAULTS;
FIR_FP_HANDLE HND_FIRFP =&FIRFP;
#pragma DATA_SECection(dbuffer,"firldb")
float32 dbuffer[FIR_ORD+1];
//#pragma DATA_SECection(pragma
#pragma data_section(sigout,"sigout");
//float sigin[signal_length];-->我选择RFFTin1Buff[RFFT_size]作为我的输入缓冲
区flat32 sigOut[RFFT_size];
#pragma data_section(coeff,"coefffilt");
{ pfr_void_fr/fr_fr_1;{ pfrfi=512_feefr/fr_fi_fr_1){ p_fi_fr_fr_fr/ fe1...............fir {{
初始化系统控制:
// PLL,看门狗,启用外设时钟
//此示例功能可在F2837xS_sysctrl.c文件中找到。
InitSysCtrl();//
步骤2. 初始化GPIO:
//此示例函数可在F2837xS_GPIO .c文件中找到,
//说明了如何将GPIO设置为其默认状态。
此示例跳过InitGpio();//
//步骤3. 清除所有中断并初始化PIE矢量表:
//禁用CPU中断
dint;
//将PIE控制寄存器初始化为其默认状态。
//默认状态是禁用所有PIE中断,
并清除标志//。
//此函数位于F2837xS_PIECTRL.c文件中。
InitPieCtrl();
SetPinLCD();//setta i pin per il显示器
initialize_lcd();
HOME_LCD();//
禁用CPU中断并清除所有CPU中断标志:
IER = 0x0000;
IFR = 0x0000;
//使用指向shell Interrupt
//服务例程(ISR)的指针初始化PIE矢量表。
//这将填充整个表,即使在此
示例中未使用中断//。 这对于调试非常有用。
// shell ISR例程位于F2837xS_DefaultIsr.C.中
//此函数位于F2837xS_PieVect.C.中
InitPieVectorTable();
//Map ISR函数
EALLOW;
PieVectorTable.ADCA1_INT =&adca1_ISR;// ADCA中断1的函数
PieVectorTable.XINT3_INT =&xint3_isr;
EDIS;
//配置ADC并开机
ConfigureADC();//
配置ePWM
ConfigureEPWM();
//在通道0上设置ePWM触发转换的ADC
SetupADCEpwm(0);
//启用全局中断和较高优先级的实时调试事件:
IER || M_INT1;//启用组1中断
EINT;//启用全局中断INTM
ERTM;//启用全局实时中断DBGM
结果索引=0;
缓冲器全轮= 0;
hnd_rfft->FFTSize = RFFT_SIZE;//FFT大小
hnd_rfft->FFTStages = RFFT_stages;//FFT stages
hnd_rfft->InBuf =&RFFTin1Buff[0];//输入缓冲区(12位ADC)输入
hnd_rfft->OutBuf =&RFFToutBuff[0];//输出缓冲区
HND_rfft->CosSinBuf =&RFFTF32Coef[0];//twiddle因子
hnd_rfft->MagBuf =&RFFTmagBuff[0];//幅值输出缓冲区
RFFT_F32_Sincostable (HND_rfft);//计算宽度因子
/* FIR通用过滤器初始化*/
hnd_firfp->order = FIR_ORDER;
hnd_firfp->dbuffer_ptr = dbuffer;
hnd_firfp->coeff_ptr =(float *) coeff;
hnd_firfp->init(Hnd_firfp);
//在PIE中启用Xint3:组12中断1
PieCtrlRegs.PIECTRL.bit.ENPIE =1;//启用PIE块
PieCtrlRegs.PIEIER12.bit.INTx1= 1;//启用PIE组12 INTx1
IER || M_INT12;//启用CPU INT12
EINT;//启用全局中断
XintRegs.XINT3CR.bit.POLARITY = 2;//下降边缘
XintRegs.XINT3CR.bit.enable = 1;//XINT3 interrpt enable
GPIO_SetupXINT3Gpio(60);//GPIO60 SU XINT3
//启用PIE中断
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;
//sync ePWM
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
//无限循环转换
做
{
AcquitreSignal();
FFT();
对于(i = 0;i < RFFT_SIZE;I++)
{
hnd_firfp->input = RFFTin1Buff[i];
hnd_firfp->calc (&firfp);
sigOut[i]= hnd_firfp->output;
}
ASM(" ESTOP0");
}While(1);
}
中断无效adca1_ISR(void)
{
RFFTin1Buff[resultsIndex++]=(AddaResultRegs.ADCRESULT0)*((FLOW)3/SLL);
IF(RFTB_size=){ resultsGroupCA=0;
ft1.CT1; f1 =清除
缓冲
区=1;缓冲区=1;缓冲区=1;缓冲区=1;缓冲区=1CA1= 1;缓冲区=1;缓冲区=1= 1= 1= 1= 1;缓冲区=1=缓冲区=1CA1= 1;缓冲区=1=缓冲区=1=缓冲区=1= 1= 1=缓冲区=1;缓冲区=1CAPEEPT1= 1= 1=缓冲区=1= 1= 1=缓冲区=1=缓冲区=1=缓冲区=1=缓冲区=1=缓冲区=1= 1=缓冲区=1=缓冲
//取消冻结,进入上计数模式
//等待,而ePWM导致ADC转换,然后导致中断,
//填充结果缓冲区,最终设置缓冲区全
//flag
while (!bufferFull);
bufferFull = 0;//清除缓冲区全标志
//停止ePWM
EPwm1Regs.ETSEL.bit.SOCAEN = 0;//disable SOCA
EPwm1Regs.TBCTL.bit.CTRMODE = 3;//freeze counter
}