This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Keil u vision and code composer studio with lm3s8962

Hi Community,

I have a set of FFT codes that is suppose to create an array of number after processing the incoming signal.

When I build my codes in code composer studio it was successfully built.

However, when I run it on debug mode it face problems.

The purpose of my project is to simply program a set of FFT algorithm in c, and allow my LM3s8962 micro-controller to process the incoming signal(Voice or sound).

I have another question, can I use the algorithm to run it in my keil uvision, since the keil uvision has the spectrum/logic analyser which I can see the frequency spectrum.

I will attach my algorithms here, if any kind hearted soul spot any mistakes in my algorithm please enlighten me.

/*
* main.c
*/
#include <stdio.h>
#include <math.h>
#include <stdbool.h>
#include <stdint.h>
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_ints.h"
#include "driverlib/sysctl.h"
#include "driverlib/adc.h"
#include "driverlib/interrupt.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "grlib/grLib.h"
#include "grlib/grLibDriver.h"

short sample[8];

#pragma vector=unused_interrupts
interrupt void user_trap_function(void)  //ISR to handle the end of sampling interrup, being the only enabled interrupt
{
int df = 15625;      //fs/N = 125000/8
int Re[8];
int Im[8];
int Ampl[8];
int fr[8];
int N = 8;        //number of samples
x[N] = (short)sample;    // convert sample values to short integers for computation
int out[2] = {0,0};      //init Re and Im results
int j=0;
for (j = 0; j < N; j++){
  dft(x,j,out);       //call DFT function
  Re[j] = out[0];
  Im[j] = out[1];      //collect real and imaginary parts
  Ampl[j] = ((Re[j]^2)+(Im[j]^2))^(1/2);
  fr[j] = df*j;

  long lX1 = (long)Ampl[j];
  long lX2 = (long)Ampl[j]+1;
  long lY = (long)fr[j];
  long ulValue = 128;

  void LineDrawH (pvDisplayData, lX1, , lX1, lY, ulValue);

}


}

int M = 0;
unsigned long sample[8]

void LineDrawH (void *pvDisplayData, long lX1, long lX2, long lY, unsigned long ulValue);

void ADC_init( void ) {
  SYSCTL_RCGC0_R |= SYSCTL_RCGC0_ADC;            // Enable the clock to the ADC module
  SYSCTL_RCGC0_R |= SYSCTL_RCGC0_ADCSPD125K;       // Configure the ADC to sample at 125KS/s
  ADCSequenceDisable(ADC_BASE, 0);             // Disable sample sequences 0
  ADCSequenceConfigure(ADC_BASE, 0, ADC_TRIGGER_PROCESSOR, 1);  // Configure sample sequence 0: processor trigger, priority = 1
  IntPrioritySet(INT_ADC0SS0,0);             // Set SS0 interrupt priority to 0
  ADCSequenceStepConfigure(ADC_BASE, 0, 0, ADC_CTL_CH0);  // Configure sample sequence 0 to sample external input
  ADCSequenceStepConfigure(ADC_BASE, 0, 1, ADC_CTL_CH0);
  ADCSequenceStepConfigure(ADC_BASE, 0, 2, ADC_CTL_CH0);
  ADCSequenceStepConfigure(ADC_BASE, 0, 3, ADC_CTL_CH0);
  ADCSequenceStepConfigure(ADC_BASE, 0, 4, ADC_CTL_CH0);
  ADCSequenceStepConfigure(ADC_BASE, 0, 5, ADC_CTL_CH0);
  ADCSequenceStepConfigure(ADC_BASE, 0, 6, ADC_CTL_CH0);
  ADCSequenceStepConfigure(ADC_BASE, 0, 7, ADC_CTL_CH0 | ADC_CTL_IE | ADC_CTL_END); //set interrupt flag after the seventh step
  ADCIntEnable(ADC_BASE, 0);         // Enable the interrupt for sample sequence 0
  IntEnable(INT_ADC0SS0);                   // Enable SS0 Interupt in NVIC
  M+=M;               // integer to detect if ADC is initialized
}

unsigned long getADC0(void)
{

ADCProcessorTrigger(ADC0_BASE, 0);     //initiate sampling
while(!ADCIntStatus(ADC0_BASE, 0, false));   //monitor interrupt flag for completion of sampling
ADCSequenceDataGet(ADC0_BASE, 0, sample);  //assign samples to global variable, sample

return sample;         //return sample to calling function
}

int dft(long *x, short k, int *out)   //DFT function
{
  int sumRe = 0;       //init real component
  int sumIm = 0;      //init imaginary component
  int i = 0;
  int N = 8;
  float pi = 3.1416 ;
  float cs = 0;       //init cosine component
  float sn = 0;       //init sine component
  for (i = 0; i < N; i++)    //for N-point DFT
   {
   cs = cos(2*pi*(k)*i/N);   //real component
   sn = sin(2*pi*(k)*i/N);   //imaginary component
   sumRe += x[i]*cs;     //sum of real components
   sumIm -= x[i]*sn;     //sum of imaginary components
   }
  out[0] = sumRe;      //sum of real components
  out[1] = sumIm;      //sum of imaginary components

  return(out);
}
int main(void) {
if (M>0){
  ADC_init();       //initialize ADC module if not already initialized
}
getADC0();        //start conversion. Interrupt flag will be set after sampling and this functioned called again after ISR executes

return 0;
}

Parents
  • Hi xingjunmarco,

    However, when I run it on debug mode it face problems.

    You can state the details of the problems so that fellow members will be able to help you.

    I have another question, can I use the algorithm to run it in my keil uvision, since the keil uvision has the spectrum/logic analyser which I can see the frequency spectrum.

    Yes, you can use it under µVision IDE and µVision Debugger.

    I will attach my algorithms here, if any kind hearted soul spot any mistakes in my algorithm please enlighten me.

    For some part(s) of your program I will just give recommendations and it's up to you if you will do the modification. Here are the minor problems

    • You are doing the DFT, not the FFT. Even though the DFT length is only 8, the algorithm will still take longer time to execute. Besides, with a length of only 8, this is usually a coarse DFT for the intended application that you mention (Voice or sound).
    • I recommend that you increase the accuracy of single-precision floating-point representation of π. Instead of

      float pi = 3.1416 ;

    you can use

      float pi = 3.14159265;

    or

      float pi = 3.1415927;

    For some other issues, I decided to post them separately. If other members will give their comments the subject matters are already segregated so if you will reply be sure to do it in the appropriate post.

    Ultimately, I recommend that you consider CMSIS, there is an elegant way of realizing your project.

    Regards,

    Goodwin

Reply
  • Hi xingjunmarco,

    However, when I run it on debug mode it face problems.

    You can state the details of the problems so that fellow members will be able to help you.

    I have another question, can I use the algorithm to run it in my keil uvision, since the keil uvision has the spectrum/logic analyser which I can see the frequency spectrum.

    Yes, you can use it under µVision IDE and µVision Debugger.

    I will attach my algorithms here, if any kind hearted soul spot any mistakes in my algorithm please enlighten me.

    For some part(s) of your program I will just give recommendations and it's up to you if you will do the modification. Here are the minor problems

    • You are doing the DFT, not the FFT. Even though the DFT length is only 8, the algorithm will still take longer time to execute. Besides, with a length of only 8, this is usually a coarse DFT for the intended application that you mention (Voice or sound).
    • I recommend that you increase the accuracy of single-precision floating-point representation of π. Instead of

      float pi = 3.1416 ;

    you can use

      float pi = 3.14159265;

    or

      float pi = 3.1415927;

    For some other issues, I decided to post them separately. If other members will give their comments the subject matters are already segregated so if you will reply be sure to do it in the appropriate post.

    Ultimately, I recommend that you consider CMSIS, there is an elegant way of realizing your project.

    Regards,

    Goodwin

Children