部件号: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 }