Other Parts Discussed in Thread: CONTROLSUITE
//Clean up magnitude buffer
for (i=0; i < RFFT_SIZE/2; i++)
{
RFFTmagBuff[i] = 0;
}
在线调试时,执行到这个FOR 循环时,出现问题,报错为:No source available for "0x3ff626" ,请问这是什么原因导致的呢?
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.
Other Parts Discussed in Thread: CONTROLSUITE
//Clean up magnitude buffer
for (i=0; i < RFFT_SIZE/2; i++)
{
RFFTmagBuff[i] = 0;
}
在线调试时,执行到这个FOR 循环时,出现问题,报错为:No source available for "0x3ff626" ,请问这是什么原因导致的呢?
这个是给数组赋值为0,数组定义的是全局变量,应该不是库的原因吧?
//Clean up output buffer
for (i=0; i < RFFT_SIZE; i++)
{
RFFToutBuff[i] = 0;
}
这个FOR循环就能执行啊,它们功能应该是一样的啊?下面是我的代码
//###########################################################################
//
// Original source by: M.P.
//
// $TI Release: DSP2833x Header Files V1.01 $
// $Release Date: September 26, 2007 $
//###########################################################################
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
#include "math.h"
#include "float.h"
#include "FPU.h"
// ADC start parameters
#if (CPU_FRQ_150MHZ) // Default - 150 MHz SYSCLKOUT
#define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3) = 25.0 MHz
#endif
#if (CPU_FRQ_100MHZ)
#define ADC_MODCLK 0x2 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2) = 25.0 MHz
#endif
//#define AVG 1000 // Average sample limit
//#define ZOFFSET 0x00 // Average Zero offset
//#pragma DATA_SECTION(AdcBuf,"DMARAML4");
#define RFFT_STAGES 9
#define RFFT_SIZE (1 << RFFT_STAGES)
#define ADC_BUF_LEN RFFT_SIZE // ADC buffer length
#define ADC_SAMPLE_PERIOD 3124 // 3124 = (3125-1) = 48 KHz sampling w/ 150 MHz SYSCLKOUT
#define F_PER_SAMPLE 48000.0L/(float)RFFT_SIZE //Internal sampling rate is 48kHz
RFFT_ADC_F32_STRUCT rfft_adc;
RFFT_F32_STRUCT rfft;
float32 RFFToutBuff[RFFT_SIZE]; //Calculated FFT result
float32 RFFTF32Coef[RFFT_SIZE]; //Coefficient table buffer
float32 RFFTmagBuff[RFFT_SIZE/2+1]; //Magnitude of frequency spectrum
Uint16 AdcBuf[ADC_BUF_LEN]; // ADC buffer allocation
Uint16 temp;
//void scib_xmit(int a);
//void scib_msg(char *msg);
/*
* main.c
*/
int main(void)
{
Uint16 i,j;
float32 freq;
// float32 F_PER_SAMPLE= 48000.0L/512;
// Step 1. Initialize System Control:
InitSysCtrl();
// Specific clock setting for this example:
EALLOW;
SysCtrlRegs.HISPCP.all = ADC_MODCLK; // HSPCLK = SYSCLKOUT/2*ADC_MODCLK
EDIS;
// Step 2. Initialize GPIO:
InitGpio(); // Skipped for this example
// InitScibGpio();
// Step 3. Clear all interrupts and initialize PIE vector table:
// Disable CPU interrupts
DINT;
// Initialize the PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags are cleared.
InitPieCtrl();
// Disable CPU interrupts and clear all CPU interrupt flags:
IER = 0x0000;
IFR = 0x0000;
// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
// This will populate the entire table, even if the interrupt
// is not used in this example. This is useful for debug purposes.
// The shell ISR routines are found in DSP2833x_DefaultIsr.c.
// This function is found in DSP2833x_PieVect.c.
// InitPieVectTable();
// MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
// InitFlash();
// InitSci(); // Initialize the SCI FIFO
EPwmSetup();
// for(; ;)
// {
// temp = EPwm1Regs.TBCTR;
// }
// Step 4. Initialize the ADC:
InitAdc();
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;
}
//Clean up magnitude buffer
for (i=0; i < RFFT_SIZE/2; i++)
{
RFFTmagBuff[i] = 0;
}
while(1)
{
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 0x1; //开始转换
while(AdcRegs.ADCASEQSR.bit.SEQ_CNTR!=0); //等待转换完成
for(i=0 ;i<32;i++)
{
AdcBuf[0+16*i] = AdcMirror.ADCRESULT0;
AdcBuf[1+16*i] = AdcMirror.ADCRESULT1;
AdcBuf[2+16*i] = AdcMirror.ADCRESULT2;
AdcBuf[3+16*i] = AdcMirror.ADCRESULT3;
AdcBuf[4+16*i] = AdcMirror.ADCRESULT4;
AdcBuf[5+16*i] = AdcMirror.ADCRESULT5;
AdcBuf[6+16*i] = AdcMirror.ADCRESULT6;
AdcBuf[7+16*i] = AdcMirror.ADCRESULT7;
AdcBuf[8+16*i] = AdcMirror.ADCRESULT8;
AdcBuf[9+16*i] = AdcMirror.ADCRESULT9;
AdcBuf[10+16*i] = AdcMirror.ADCRESULT10;
AdcBuf[11+16*i] = AdcMirror.ADCRESULT11;
AdcBuf[12+16*i] = AdcMirror.ADCRESULT12;
AdcBuf[13+16*i] = AdcMirror.ADCRESULT13;
AdcBuf[14+16*i] = AdcMirror.ADCRESULT14;
AdcBuf[15+16*i] = AdcMirror.ADCRESULT15;
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 0x1; //开始转换
while(AdcRegs.ADCASEQSR.bit.SEQ_CNTR!=0); //等待转换完成
}
RFFT_adc_f32u(&rfft_adc); // This version of FFT doesn't need buffer alignment
RFFT_f32_mag(&rfft); // Calculate spectrum amplitude
j = 1;
freq = RFFTmagBuff[1];
for(i=2;i<RFFT_SIZE/2+1;i++)
{
//Looking for the maximum valude of spectrum magnitude
if(RFFTmagBuff[i] > freq)
{
j = i;
freq = RFFTmagBuff[i];
}
}
freq = F_PER_SAMPLE * (float)j; //Convert normalized digital frequency to analog frequency
// for(i=0;i<2;i++)
// {
// temp = ADC[i]>>8;
// scib_xmit(temp);
// DELAY_US(50L);
/// temp = ADC[i]&0xff;
// scib_xmit(temp);
// DELAY_US(50L);
// }
}
// return 0;
}
RFFTmagBuff是不是在库里定义的?还是你能在.h文件中找到?
是以下语句就发生问题吗?
//Clean up output buffer
for (i=0; i < RFFT_SIZE; i++)
{
RFFToutBuff[i] = 0;
}
这个FOR循环就能执行啊,它们功能应该是一样的啊?下面是我的代码
//###########################################################################
//
// Original source by: M.P.
//
// $TI Release: DSP2833x Header Files V1.01 $
// $Release Date: September 26, 2007 $
//###########################################################################
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
#include "math.h"
#include "float.h"
#include "FPU.h"
// ADC start parameters
#if (CPU_FRQ_150MHZ) // Default - 150 MHz SYSCLKOUT
#define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3) = 25.0 MHz
#endif
#if (CPU_FRQ_100MHZ)
#define ADC_MODCLK 0x2 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2) = 25.0 MHz
#endif
//#define AVG 1000 // Average sample limit
//#define ZOFFSET 0x00 // Average Zero offset
//#pragma DATA_SECTION(AdcBuf,"DMARAML4");
#define RFFT_STAGES 9
#define RFFT_SIZE (1 << RFFT_STAGES)
#define ADC_BUF_LEN RFFT_SIZE // ADC buffer length
#define ADC_SAMPLE_PERIOD 3124 // 3124 = (3125-1) = 48 KHz sampling w/ 150 MHz SYSCLKOUT
#define F_PER_SAMPLE 48000.0L/(float)RFFT_SIZE //Internal sampling rate is 48kHz
RFFT_ADC_F32_STRUCT rfft_adc;
RFFT_F32_STRUCT rfft;
float32 RFFToutBuff[RFFT_SIZE]; //Calculated FFT result
float32 RFFTF32Coef[RFFT_SIZE]; //Coefficient table buffer
float32 RFFTmagBuff[RFFT_SIZE/2+1]; //Magnitude of frequency spectrum
Uint16 AdcBuf[ADC_BUF_LEN]; // ADC buffer allocation
Uint16 temp;
//void scib_xmit(int a);
//void scib_msg(char *msg);
/*
* main.c
*/
int main(void)
{
Uint16 i,j;
float32 freq;
// float32 F_PER_SAMPLE= 48000.0L/512;
// Step 1. Initialize System Control:
InitSysCtrl();
// Specific clock setting for this example:
EALLOW;
SysCtrlRegs.HISPCP.all = ADC_MODCLK; // HSPCLK = SYSCLKOUT/2*ADC_MODCLK
EDIS;
// Step 2. Initialize GPIO:
InitGpio(); // Skipped for this example
// InitScibGpio();
// Step 3. Clear all interrupts and initialize PIE vector table:
// Disable CPU interrupts
DINT;
// Initialize the PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags are cleared.
InitPieCtrl();
// Disable CPU interrupts and clear all CPU interrupt flags:
IER = 0x0000;
IFR = 0x0000;
// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
// This will populate the entire table, even if the interrupt
// is not used in this example. This is useful for debug purposes.
// The shell ISR routines are found in DSP2833x_DefaultIsr.c.
// This function is found in DSP2833x_PieVect.c.
// InitPieVectTable();
// MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
// InitFlash();
// InitSci(); // Initialize the SCI FIFO
EPwmSetup();
// for(; ;)
// {
// temp = EPwm1Regs.TBCTR;
// }
// Step 4. Initialize the ADC:
InitAdc();
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;
}
//Clean up magnitude buffer
for (i=0; i < RFFT_SIZE/2; i++)
{
RFFTmagBuff[i] = 0;
}
while(1)
{
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 0x1; //开始转换
while(AdcRegs.ADCASEQSR.bit.SEQ_CNTR!=0); //等待转换完成
for(i=0 ;i<32;i++)
{
AdcBuf[0+16*i] = AdcMirror.ADCRESULT0;
AdcBuf[1+16*i] = AdcMirror.ADCRESULT1;
AdcBuf[2+16*i] = AdcMirror.ADCRESULT2;
AdcBuf[3+16*i] = AdcMirror.ADCRESULT3;
AdcBuf[4+16*i] = AdcMirror.ADCRESULT4;
AdcBuf[5+16*i] = AdcMirror.ADCRESULT5;
AdcBuf[6+16*i] = AdcMirror.ADCRESULT6;
AdcBuf[7+16*i] = AdcMirror.ADCRESULT7;
AdcBuf[8+16*i] = AdcMirror.ADCRESULT8;
AdcBuf[9+16*i] = AdcMirror.ADCRESULT9;
AdcBuf[10+16*i] = AdcMirror.ADCRESULT10;
AdcBuf[11+16*i] = AdcMirror.ADCRESULT11;
AdcBuf[12+16*i] = AdcMirror.ADCRESULT12;
AdcBuf[13+16*i] = AdcMirror.ADCRESULT13;
AdcBuf[14+16*i] = AdcMirror.ADCRESULT14;
AdcBuf[15+16*i] = AdcMirror.ADCRESULT15;
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 0x1; //开始转换
while(AdcRegs.ADCASEQSR.bit.SEQ_CNTR!=0); //等待转换完成
}
RFFT_adc_f32u(&rfft_adc); // This version of FFT doesn't need buffer alignment
RFFT_f32_mag(&rfft); // Calculate spectrum amplitude
j = 1;
freq = RFFTmagBuff[1];
for(i=2;i<RFFT_SIZE/2+1;i++)
{
//Looking for the maximum valude of spectrum magnitude
if(RFFTmagBuff[i] > freq)
{
j = i;
freq = RFFTmagBuff[i];
}
}
freq = F_PER_SAMPLE * (float)j; //Convert normalized digital frequency to analog frequency
// for(i=0;i<2;i++)
// {
// temp = ADC[i]>>8;
// scib_xmit(temp);
// DELAY_US(50L);
/// temp = ADC[i]&0xff;
// scib_xmit(temp);
// DELAY_US(50L);
// }
}
// return 0;
}
float32 RFFTmagBuff[RFFT_SIZE/2+1]; //Magnitude of frequency spectrum
1、这个宏定义就在主程序MAIN.C 中定义的,我能看到,我用TI官方库调试就可以通过,我自己新建的工程就无法执行。
2、另外一个问题,就是TI的库函数是不是好多汇编定义的,我只能看到程序的声明,但无法打开程序定义部分啊,比如我最近在做FFT开发,库中有一个函数是RFFT_adc_f32u(&rfft_adc); 我只能看到声明,看不到函数本身的定义;
3、还有一个宏定义 #define ADC_SAMPLE_PERIOD 3124 // 3124 = (3125-1) = 48 KHz sampling w/ 150 MHz SYSCLKOUT
这个宏定义也是FFT里面定义的,我屏蔽后,编译也不报错啊,但这个宏定义确实应该有作用啊?不知道是什么情况?
第2和第3个问题我是下载TI的CONTROLSUIT 后,导入工程遇到的,C:\ti\controlSUITE\libs\dsp\FPU\v1_40_00_00\examples_ccsv5\2833x_rfft_adc_rt,这就是我导入的工程文件路径,希望对您解决我的疑惑有帮助。