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.

msp430f5529

Part Number: MSP430F5529

#include <msp430.h>
#include <stdint.h>
#include<stdio.h>
#include<math.h>
#define PI 3.1415926535897932384626433832795028841971               //定义圆周率值
#define FFT_N 128                                                   //定义福利叶变换的点数
struct compx {float real,imag;};                                    //定义一个复数结构
struct compx s[FFT_N];                                              //FFT输入和输出:从S[1]开始存放,根据大小自己定义
int i=0;
float        adcresult;
unsigned int     *point_1=NULL;
unsigned int DMA_DST[16];                       // ADC conversion result is stored in this variable
void adcdma()
{
    P1OUT &= ~BIT0;                           // P1.0 clear
    P1DIR |= BIT0;                            // P1.0 output
    P5SEL |= BIT7;                            // P5.7/TB1 option select
    P5DIR |= BIT7;                            // Output direction
    P6SEL |= BIT0;                            // Enable A/D channel A0

    //Setup Timer B0
    TBCCR0 = 0xFFFE;
    TBCCR1 = 0x8000;
    TBCCTL1 = OUTMOD_3;                       // CCR1 set/reset mode
    TBCTL = TBSSEL_2+MC_1+TBCLR;              // SMCLK, Up-Mode

    // Setup ADC12
    ADC12CTL0 = ADC12SHT0_0+ADC12MSC+ADC12ON;// Sampling time, MSC, ADC12 on
    ADC12CTL1 = ADC12SHS_3+ADC12CONSEQ_2;     // Use sampling timer; ADC12MEM0
                                              // Sample-and-hold source = CCI0B =
                                              // TBCCR1 output
                                              // Repeated-single-channel
    ADC12MCTL0 = ADC12SREF_0+ADC12INCH_0;     // V+=AVcc V-=AVss, A0 channel
    ADC12CTL0 |= ADC12ENC;

    // Setup DMA0
    DMACTL0 = DMA0TSEL_24;                    // ADC12IFGx triggered
    DMACTL4 = DMARMWDIS;                      // Read-modify-write disable
    DMA0CTL &= ~DMAIFG;
    DMA0CTL = DMADT_4+DMAEN+DMADSTINCR_3+DMAIE; // Rpt single tranfer, unchanged dst, Int
    DMA0SZ = 16;                               // DMA0 size = 16

    __data20_write_long((uintptr_t) &DMA0SA,(uintptr_t) &ADC12MEM0);
                                              // Source block address
    __data20_write_long((uintptr_t) &DMA0DA,(uintptr_t) &DMA_DST);
}


/*******************************************************************
函数原型:struct compx EE(struct compx b1,struct compx b2)
函数功能:对两个复数进行乘法运算
输入参数:两个以联合体定义的复数a,b
输出参数:a和b的乘积,以联合体的形式输出
*******************************************************************/
struct compx EE(struct compx a,struct compx b)
{
 struct compx c;
 c.real=a.real*b.real-a.imag*b.imag;
 c.imag=a.real*b.imag+a.imag*b.real;
 return(c);
}
/*****************************************************************
函数原型:void FFT(struct compx *xin,int N)
函数功能:对输入的复数组进行快速傅里叶变换(FFT)
输入参数:*xin复数结构体组的首地址指针,struct型
*****************************************************************/
void FFT(struct compx *xin)
{
  int f,m,nv2,nm1,i,k,l,j=0;
  struct compx u,w,t;

   nv2=FFT_N/2;                  //变址运算,即把自然顺序变成倒位序,采用雷德算法
   nm1=FFT_N-1;
   for(i=0;i<nm1;i++)
   {
    if(i<j)                    //如果i<j,即进行变址
     {
      t=xin[j];
      xin[j]=xin[i];
      xin[i]=t;
     }
    k=nv2;                    //求j的下一个倒位序
    while(k<=j)               //如果k<=j,表示j的最高位为1
     {
      j=j-k;                 //把最高位变成0
      k=k/2;                 //k/2,比较次高位,依次类推,逐个比较,直到某个位为0
     }
   j=j+k;                   //把0改为1
  }

  {
   int le,lei,ip;                            //FFT运算核,使用蝶形运算完成FFT运算
    f=FFT_N;
   for(l=1;(f=f/2)!=1;l++)                  //计算l的值,即计算蝶形级数
           ;
  for(m=1;m<=l;m++)                         // 控制蝶形结级数
   {                                        //m表示第m级蝶形,l为蝶形级总数l=log(2)N
    le=2<<(m-1);                            //le蝶形结距离,即第m级蝶形的蝶形结相距le点
    lei=le/2;                               //同一蝶形结中参加运算的两点的距离
    u.real=1.0;                             //u为蝶形结运算系数,初始值为1
    u.imag=0.0;
    w.real=cos(PI/lei);                     //w为系数商,即当前系数与前一个系数的商
    w.imag=-sin(PI/lei);
    for(j=0;j<=lei-1;j++)                   //控制计算不同种蝶形结,即计算系数不同的蝶形结
     {
      for(i=j;i<=FFT_N-1;i=i+le)            //控制同一蝶形结运算,即计算系数相同蝶形结
       {
        ip=i+lei;                           //i,ip分别表示参加蝶形运算的两个节点
        t=EE(xin[ip],u);                    //蝶形运算,详见公式
        xin[ip].real=xin[i].real-t.real;
        xin[ip].imag=xin[i].imag-t.imag;
        xin[i].real=xin[i].real+t.real;
        xin[i].imag=xin[i].imag+t.imag;
       }
      u=EE(u,w);                           //改变系数,进行下一个蝶形运算
     }
   }
  }

}
int main(void)
{
  WDTCTL = WDTPW+WDTHOLD;                   // Hold WDT
  adcdma();
  while(!ADC12BUSY==1);
  point_1=&DMA_DST;
  adcresult=*point_1/1638.4;
    for(i=0;i<FFT_N;i++)                           //给结构体赋值
    {
        //adcresult=DMA_DST/1638.4;
       //s[i].real=adcresult;
    s[i].imag=0;                                //虚部为0
    }

          FFT(s);                                        //进行快速福利叶变换

          for(i=0;i<FFT_N;i++)  {                         //求变换后结果的模值,存入复数的实部部分
          s[i].real=sqrt(s[i].real*s[i].real+s[i].imag*s[i].imag);
          }

                                            // Destination single address
  __bis_SR_register(LPM0_bits + GIE);       // LPM0 w/ interrupts
  __no_operation();                         // used for debugging
}

//------------------------------------------------------------------------------
// DMA Interrupt Service Routine
//------------------------------------------------------------------------------
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=DMA_VECTOR
__interrupt void DMA_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(DMA_VECTOR))) DMA_ISR (void)
#else
#error Compiler not supported!
#endif
{
  switch(__even_in_range(DMAIV,16))
  {
    case 0: break;
    case 2:                                 // DMA0IFG = DMA Channel 0
      P1OUT ^= BIT0;                        // Toggle P1.0 - PLACE BREAKPOINT HERE AND CHECK DMA_DST VARIABLE
      break;
    case 4: break;                          // DMA1IFG = DMA Channel 1
    case 6: break;                          // DMA2IFG = DMA Channel 2
    case 8: break;                          // DMA3IFG = DMA Channel 3
    case 10: break;                         // DMA4IFG = DMA Channel 4
    case 12: break;                         // DMA5IFG = DMA Channel 5
    case 14: break;                         // DMA6IFG = DMA Channel 6
    case 16: break;                         // DMA7IFG = DMA Channel 7
    default: break;
  }
}
现在DMA的值并取不出来不能赋给一个变量