⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dspa.c

📁 TS201上的多通道DMA控制源代码
💻 C
字号:
// 功能描述:  生成旋转因子,通过总线送到SDRAM    


#include <sysreg.h>
#include <builtins.h>
#include <defTS201.h>
#include <signal.h>
#include <time.h>
#include <stdio.h>  

#define twiddle_r 0x40010000
#define twiddle_i 0x40020000


float  *w_r;
float *w_i;

void send(void);
//void int0(void);  
float sin(float x);
float cos(float x);
void init(void);
void setsdram();
main()
{
__builtin_sysreg_write(__SYSCON,0x1C9067);  //设置储存器访问64位总线
__builtin_sysreg_write(__SDRCON,0x7383);  
volatile clock_t clock_start; 
volatile clock_t clock_stop; 
double secs; 
clock_start = clock(); 
interrupt (SIGIRQ2, setsdram);//设置IRQ2中断向量
__builtin_sysreg_write(__INTCTL,0x000);
__builtin_sysreg_write(__IMASKH,0x00800);//开IRQ2中断


__builtin_sysreg_write(__SQCTLST,0x04);  //打开全局中断使能      

  
    
   




    
    
float w_real[256];
float w_im[256];

w_r=&w_real[0];
w_i=&w_im[0];

float pi=3.14159;
int i;


init();                      //初始化LINKPORT   DMA   

for (i=0;i<=255;i++)
  {
   w_real[i]=cos((2*pi*i)/256);
     w_im[i]=-sin((2*pi*i)/256);
  }

send();      //送SDRAM   twiddle_r twiddle_i 
//HALT  以后可根据情况添加功能
clock_stop = clock();
secs = ((double) (clock_stop - clock_start)*1000000)/CLOCKS_PER_SEC; 
printf("DSP0 Time taken is %e us\n",secs); 

}

float sin(float x)
{
float sin;
sin=x-(x*x*x)/(3*2)+(x*x*x*x*x)/(5*4*3*2)-(x*x*x*x*x*x*x)/(7*6*5*4*3*2);
return (sin);
}
float cos(float x)
{
float cos;
cos=1-(x*x)/2+(x*x*x*x)/(4*3*2)-(x*x*x*x*x*x)/(6*5*4*3*2);
return (cos);
}
void int0()
{}

void send()
{
__builtin_sysreg_write(__SDRCON,0x7383);  //设置SDRAM配置寄存器
struct TCB{                    
    int DI;                     //指针
    int DX;                      //x方向计数值及增量
    int DY;                      //y方向技术值及增量
    int DP;                      //DMA控制字
           };
struct TCB TCB_D;                //编程TCB的结构体
__builtin_quad q;       //对应于TCB的四字存放 128位
    
TCB_D.DI=twiddle_r;                   //目的指针   实部
TCB_D.DX=4|(256<<16);                 //修正值,移动到高半位
TCB_D.DY=0;                         //一维DMA
TCB_D.DP=0x86000000;                //控制字设置
q=__builtin_compose_128((long long)TCB_D.DI|(long long)TCB_D.DX<<32,(long long)
     (TCB_D.DY|(long long)TCB_D.DP<<32));     //固定格式
     
__builtin_sysreg_write4(__DCD0,q);

struct TCB TCB_S;                //编程TCB的结构体

    
TCB_S.DI=(int)w_r;                   //源指针
TCB_S.DX=4|(256<<16);                 //修正值,移动到高半位
TCB_S.DY=0;                         //一维DMA
TCB_S.DP=0x46000000;                //控制字设置
q=__builtin_compose_128((long long)TCB_S.DI|(long long)TCB_S.DX<<32,(long long)
     (TCB_S.DY|(long long)TCB_S.DP<<32));
     
__builtin_sysreg_write4(__DCS0,q);


TCB_D.DI=twiddle_i;                   //目的指针    虚部
TCB_D.DX=4|(256<<16);                 //修正值,移动到高半位
TCB_D.DY=0;                         //一维DMA
TCB_D.DP=0x86000000;                //控制字设置
q=__builtin_compose_128((long long)TCB_D.DI|(long long)TCB_D.DX<<32,(long long)
     (TCB_D.DY|(long long)TCB_D.DP<<32));
__builtin_sysreg_write4(__DCD1,q);
                //编程TCB的结构体

    
TCB_S.DI=(int)w_i;                   //源指针   
TCB_S.DX=4|(256<<16);                 //修正值,移动到高半位
TCB_S.DY=0;                         //一维DMA
TCB_S.DP=0x46000000;                //控制字设置
q=__builtin_compose_128((long long)TCB_S.DI|(long long)TCB_S.DX<<32,(long long)
     (TCB_S.DY|(long long)TCB_S.DP<<32));
__builtin_sysreg_write4(__DCS1,q);


}
///////////////////////////////////////////////
void init()
{
   asm(" XR0=0x00000000;;  ");         //DMA源/目的指针 
   asm(" XR1=0x00040004;;  ");          //计数值4,修正值0
   asm("XR2=0x00000000;;   ");         //Y计数/修正
   asm("XR3=0x00000000;;   ");          //TCB DP寄存器
   asm("DCS0=XR3:0;; ");           //关闭外部口xDMA通道          
   asm("DCS1=XR3:0;; "); 
   asm("DCS2=XR3:0;; "); 
   asm("DCS3=XR3:0;; "); 
   asm("DCD0=XR3:0;; ");                  
   asm("DCD1=XR3:0;; "); 
   asm("DCD2=XR3:0;; "); 
   asm("DCD3=XR3:0;; "); 
   asm("DC4=XR3:0;;  ");          //关闭link x发送DMA通道               
   asm("DC5=XR3:0;;  "); 
   asm("DC6=XR3:0;;  ");          //链路口3发送TCB
   asm("DC7=XR3:0;;  "); 
   asm("DC8=XR3:0;;  ");          //关闭link x接受DMA通道                
   asm("DC9=XR3:0;;  "); 
   asm("DC10=XR3:0;; ");           //链路口3接收TCB
   asm("DC11=XR3:0;; "); 
   asm("xr0=0x1f;;   ");           //初式化FLAG0
   asm("FLAGREG=xr0;; "); 
   asm("XR0=0x00000000;; "); 
   asm("XR1=0x00000000;; "); 
   asm("IMASKH=XR0;;     ");     //关闭外部中断
   asm("IMASKL=XR1;;     ");    //关闭所有DMA通道中断}
   asm("LTCTL0=xr0;;LTCTL1=xr0;;LTCTL2=xr0;;LTCTL3=xr0;;");
   asm("LRCTL0=xr0;;LRCTL1=xr0;;LRCTL2=xr0;;LRCTL3=xr0;;");
}
/////////////////////////////////////////
void setsdram()
{
__builtin_sysreg_write(__SDRCON,0x7383);  //设置SDRAM配置寄存器 
asm("nop;;");

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -