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.

TMS320F28335 在线调试

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,这就是我导入的工程文件路径,希望对您解决我的疑惑有帮助。