您好,我对controsuite中的ti\controlSUITE\libs\dsp\FPU\v1_40_00_00\examples_ccsv5\2833x_rfft_adc_rt例程进行了一些修改,ad采样配置为单通道每次采样中断,在adc_isr中每次新采样的数据放在数组的最后一位,同时原来数组中的元素都向左移动一位,去掉第一个元素,当中断进行了128次后,FFTFLAG置1,进行fft,现在的问题是FFTFLAG始终保持1不变,无法清零,ADC可以正常运行,但fft无法运行,请各位高手帮我看看,代码如下:
//#include "DSP28x_Project.h" #include "DSP2833x_Device.h" //// DSP2833x Headers #include "DSP2833x_Examples.h" //// DSP2833x Examples #include "fpu_rfft.h" #include "AD9956.h" #define RFFT_STAGES 10 #define RFFT_SIZE (1 << RFFT_STAGES) #define ADC_BUF_LEN RFFT_SIZE // ADC buffer length RFFT_ADC_F32_STRUCT rfft_adc; RFFT_F32_STRUCT rfft; float RFFToutBuff[RFFT_SIZE]; //Calculated FFT result float RFFTF32Coef[RFFT_SIZE]; //Coefficient table buffer float RFFTmagBuff[RFFT_SIZE/2+1]; //Magnitude of frequency spectrum //--- Global Variables uint16_t AdcBuf[ADC_BUF_LEN]; // ADC buffer allocation volatile uint16_t FFTStartFlag = 0; // One frame data ready flag int counter = 0; // ADC interrupt counter /***************************************************************************/ // Prototype statements for functions found within this file. interrupt void adc_isr(void); /********************************************************************** * Function: main() * * Description: Main function for C2833x Real-time RFFT **********************************************************************/ void main(void) { uint16_t i,j; //--- CPU Initialization InitSysCtrl(); // Initialize the CPU (FILE: SysCtrl.c) // InitPieCtrl(); // Initialize and enable the PIE (FILE: PieCtrl.c) // InitCpuTimers(); // Initialize CPU Timers //--- 初始化FFT rfft_adc.Tail = &rfft.OutBuf; //Link the RFFT_ADC_F32_STRUCT to //RFFT_F32_STRUCT. Tail pointer of //RFFT_ADC_F32_STRUCT is passed to //the OutBuf pointer of RFFT_F32_STRUCT rfft.FFTSize = RFFT_SIZE; //Real FFT size rfft.FFTStages = RFFT_STAGES; //Real FFT stages rfft_adc.InBuf = &AdcBuf[0]; //Input buffer rfft.OutBuf = &RFFToutBuff[0]; //Output buffer rfft.CosSinBuf = &RFFTF32Coef[0]; //Twiddle factor rfft.MagBuf = &RFFTmagBuff[0]; //Magnitude output buffer RFFT_f32_sincostable(&rfft); //Calculate twiddle factor //Clean up output buffer for (i=0; i < RFFT_SIZE; i++) { RFFToutBuff[i] = 0; AdcBuf[i] = 0; } //Clean up magnitude buffer for (i=0; i < RFFT_SIZE/2; i++) { RFFTmagBuff[i] = 0; } //--- 初始化中断 InitPieCtrl(); //--- 初始化中断向量表 InitPieVectTable(); //// ISR Functions EALLOW; PieVectTable.ADCINT = &adc_isr; EDIS; //// Initialize the CPU Timers InitCpuTimers(); //--- 全局中断设定 PieCtrlRegs.PIEIER1.bit.INTx6 = 1; PieCtrlRegs.PIEIER1.bit.INTx7 = 1; //// Enable CPU INT1 IER = 1; //// Enable global Interrupts and higher priority real-time debug events EINT; // Enable Global interrupt INTM ERTM; // Enable Global RealTime interrupt DBGM //// Specific ADC setup InitAdc(); AdcRegs.ADCMAXCONV.all = 0x0000; // Setup 1 ADCMAXCONV on SEQ1 AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x02; // Choose ADCINA2 to sample AdcRegs.ADCTRL1.bit.ACQ_PS = 7; AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1; // Enable SOCA from ePWM to start SEQ1 AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // Enable SEQ1 interrupt AdcRegs.ADCTRL3.bit.ADCCLKPS = 3; //// Assumes ePWM1 clock is already enabled in InitSysCtrl() EPwm1Regs.ETSEL.bit.SOCAEN = 1; // Enable SOC on A group EPwm1Regs.ETSEL.bit.SOCASEL = 4; // Select SOC from CPMA on countup EPwm1Regs.ETPS.bit.SOCAPRD = 1; // 第一次触发ADC EPwm1Regs.CMPA.half.CMPA = 0x003E; // 比较直62 EPwm1Regs.TBPRD = 0x0176; // 周期374 200kHz EPwm1Regs.TBCTL.bit.CTRMODE = 0; // 向上计数 //--- Main Loop while(1) // endless loop - wait for an interrupt { if(FFTStartFlag) // If one frame data ready, then do FFT { RFFT_adc_f32u(&rfft_adc); // This version of FFT doesn't need buffer alignment RFFT_f32_mag(&rfft); // Calculate spectrum amplitude FFTStartFlag = 0; //Start collecting the next frame of data } } } //end of main() interrupt void adc_isr(void) { PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Must acknowledge the PIE group //--- Manage the ADC registers AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1 to CONV00 state AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; // Clear ADC SEQ1 interrupt flag int z; // 读取数据和数据更新 for(z=1;z<ADC_BUF_LEN;z++) { AdcBuf[z-1] = AdcBuf[z]; } AdcBuf[ADC_BUF_LEN-1] = AdcMirror.ADCRESULT0; // Read the result counter++; if(counter == 128) { counter = 0; FFTStartFlag = 1; // One frame data ready } } //end of main() //=========================================================================== // End of File //===========================================================================