📄 dspa.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 + -