DSPC语言实验课案.docx

上传人:b****9 文档编号:25518533 上传时间:2023-06-09 格式:DOCX 页数:28 大小:244.70KB
下载 相关 举报
DSPC语言实验课案.docx_第1页
第1页 / 共28页
DSPC语言实验课案.docx_第2页
第2页 / 共28页
DSPC语言实验课案.docx_第3页
第3页 / 共28页
DSPC语言实验课案.docx_第4页
第4页 / 共28页
DSPC语言实验课案.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

DSPC语言实验课案.docx

《DSPC语言实验课案.docx》由会员分享,可在线阅读,更多相关《DSPC语言实验课案.docx(28页珍藏版)》请在冰豆网上搜索。

DSPC语言实验课案.docx

DSPC语言实验课案

实验一CCS使用

1.如何建立和测试一个工程。

建立和测试一个工程的步骤如下:

(1)打开CCSSetup软件,选择目标芯片型号、仿真类型、存储模式等,并将其添加到系统,保存退出后软件将自动打开CCS软件。

(2)打开CCS软件后,选择project→New选项卡。

(3)在弹出的对话框中选择工程合适的位置。

注意:

路径中不要有中文。

然后输入工程的名字。

(4)点击finish,然后点击工程名前面的加号,打开CCS选择File,点击New下的SourceFile命令。

(5)将工程中的源程序文件(firstdsp.c文件)和链接命令文件(firstdsp.cmd文件)复制到上一步CCS自动创建的以工程名为名字的文件夹中,将库文件(rts.lib文件)添加到该文件夹中,最后将上述各文件在中分别添加到工程下各类型的文件夹中。

(6)在CCS界面中右击工程名选择“BuildOptions”进行编译选项设置,在Linker标签的Libraries选项中输入所要包含的库文件,在Basic选项中输入合适的堆栈值(实验中为400)。

(7)建立工程后,选择“Project”菜单下的“Rebuildall”命令,在CCS下方的Build窗口会显示编译链接信息,若没错误将产生一个.out的输出文件。

(8)选择“File”菜单下的“LoadProgram”命令进行加载上一步产生的程序输出文件(.out文件)。

(9)加载程序后,点击CCS左侧的“RUN”快捷按钮进行程序的软件仿真,并全速运行所加载的程序,通过观察窗口(memory、watchwindows[观察变量]、registers、graph)验证实验结果。

2.建立工程需要的文件清单及每个文件的作用。

建立工程总共需要3个文件:

(1)rts.lib:

c语言标准支持库,用于程序调用。

(2)firstdsp.c:

c语言主程序。

(3)firstdsp.cmd:

链接命令文件,用于定位内存,将块映射到存储器中。

3.思考题

rts.lib有何作用?

其加载方法有几种?

答:

(1)运行支持库(runtimesupportlibrary):

它包括C编译器所支持的ANSI标准运行支持函数、编译器公用程序函数、浮点运算函数和C编译器支持的I/O函数。

CCS中提供有rts库文件,并提供了对应的源程序文件rts.src。

库文件包括标准的C/C++运行支持库函数,浮点运算程序,系统启动程序_c_int00等。

这些库中也包括由汇编实现的子程序,可以在汇编中调用,比如除法子程序FD$$DIV等。

(2)rts.lib文件加载方法有两种:

①在CCS中右击将要加载库文件的工程名,选择“BuildOptions”进行编译选项设置,在Linker标签的Libraries选项中输入所要包含的库文件,即rts.lib。

②先将rts.lib复制到计算机硬盘的工程文件夹中,在CCS中右击将要加载库文件的工程下的Libraries文件夹进行添加库文件,即rts.lib。

firstdsp.c:

#include

#include

main()

{

inta,b,sum;

a=123;

b=456;

sum=a+b;

printf("sumis%d\n",sum);

while

(1);

}

乘加实验:

#include

structadd{floatx1,x2,x3,x4,x5,y;}add1;//定义结构变量(可不同类型数据)

doublea[5];//定义数组变量(同类型数据)

doubley,x;

voidmain()

{

add1.x1=3;//结构变量赋值

add1.x2=3;

add1.x3=2;

add1.x4=2;

add1.x5=2;

a[0]=1;//数组变量赋值

a[1]=2;

a[2]=3;

a[3]=4;

a[4]=5;

add1.y=add1.x1*a[0]+add1.x2*a[1]+add1.x3*a[2]+add1.x4*a[3]+add1.x5*a[4];

y=add1.y;

x=exp

(2);

while

(1);

}

链接文件firstdsp.cmd:

-w

-stack400h

-heap100

-lrts.lib

MEMORY

{

PAGE0:

VECT:

o=80h,l=80h

PRAM:

o=100h,l=2f00h

PAGE1:

DRAM:

o=3000h,l=1000h

}

SECTIONS

{

.text:

{}>PRAMPAGE0

.data:

{}>PRAMPAGE0

.cinit:

{}>PRAMPAGE0

.cio:

>PRAMPAGE0

.switch:

{}>PRAMPAGE0

.const:

{}>DRAMPAGE1

.bss:

{}>DRAMPAGE1

.stack:

{}>DRAMPAGE1

.vectors:

{}>VECTPAGE0

}

MEMORY和SECTIONS必须大写,origin和length小写

MEMORY是用来指明存储器的分配,PAGE0是程序存储器,PAGE1是数据存储器,origin是用来说明各种起始位置,length是用来指出长度。

在上面的例子中VECT占用0080H--0100H空间PRAM占用100H--2000H空间,DRAM占用2000H--3000空间。

SECTIONS是用来指明各段在存储器中那一块。

在上面的例子中,.vectors段在VECT所在的空间。

.text在PRAM的空间,.data段在PRAM空间,.stack段在STACKDRAM空间。

实验2基础实验

一、实验目的

1.掌握CCS3.3实验环境的使用;

2.掌握用C语言编写DSP程序的方法。

二、实验设备

1.一台装有CCS3.3软件的计算机;

2.DSP实验箱;

3.DSP硬件仿真器。

三、实验原理

浮点数的表达和计算是进行数字信号处理的基本知识;产生正弦信号是数字信号处理中经常用到的运算;C语言是现代数字信号处理表达的基础语言和通用语言。

写实现程序时需要注意两点:

(1)浮点数的范围及存储格式;

(2)DSP的C语言与ANSIC语言的区别。

四、实验步骤

1. 打开CCS3.3并熟悉其界面;

2. 在CCS3.3环境中建立本实验的工程,编译并重建.out输出文件,然后通过仿真器把执行代码下载到DSP芯片中;

3.把X0,Y0和Z0添加到Watch窗口中作为观察对象(选中变量名,单击鼠标右键,在弹出菜单中选择“AddWatchWindow”命令);

4.选择view->graph->time/frequency… 。

设置对话框中的参数:

其中“StartAddress”设为“sin_value”,“Acquisitionbuffersize”和“DisplayDatasize”都设为“100”,并且把“DSPDataType”设为“32-bitfloatingpoint”,

设置好后观察信号序列的波形(sin函数,如图);

5.单击运行;

6.观察三个变量从初始化到运算结束整个过程中的变化;观察正弦波形从初始化到运算结束整个过程中的变化;

7.修改输入序列的长度或初始值,重复上述过程。

五.实验注意事项

1.把代码载入硬件时注意操作顺序,要操作规范,以免烧坏硬件

2.只有添加了可视窗口才可以看到图形

3.读懂程序以后再按要求修改,才能完成要求

4.注意观察修改程序的图形变化与之前的比较

六.实验程序

主程序.c

#include

#include

floatsin_value[100];

floatx0,y0,z0;

voidmain()

{

inti;

for(i=0;i<100;i++)

{x0=0.0628*i;

y0=sin(x0);

sin_value[i]=y0;}

}

连接文件.cmd

-w

-stack400h

-heap100

-lrts.lib

MEMORY

{

PAGE0:

VECT:

o=80h,l=80h

PRAM:

o=100h,l=2f00h

PAGE1:

DRAM:

o=3000h,l=1000h

}

SECTIONS

{

.text:

{}>PRAMPAGE0

.data:

{}>PRAMPAGE0

.cinit:

{}>PRAMPAGE0

.cio:

>PRAMPAGE0

.switch:

{}>PRAMPAGE0

.const:

{}>DRAMPAGE1

.bss:

{}>DRAMPAGE1

.stack:

{}>DRAMPAGE1

.vectors:

{}>VECTPAGE0

}

七.实验小结

通过本实验熟悉和使用CCS3.3实验环境,虽然还不是充分解读CCS3.3技巧,但有了这次自己动手,掌握其基本技巧。

以前不知道用C语言编写DSP程序,如今通过解读程序,修改程序,完成实验。

通过本次实践与理论相结合,更加透彻理解实验目的。

实验3:

DSP数据存取实验

 

程序文件(memory.c):

main()

{

inti;

unsignedint*px;//定义指针变量px,px代表地址值(unsignedint)

unsignedint*py;

unsignedint*pz;

px=(unsignedint*)0x4080;//地址值(unsignedint*)0x4080赋给指针变量px。

py=(unsignedint*)0x4100;

for(i=0,pz=px;i<16;i++,pz++)//地址赋值,指针变量pz地址值增1,

(*pz)=i;//i值赋给pz地址中

for(i=0,pz=py;i<16;i++,pz++)

(*pz)=0x1234;//把数值0x1234赋给pz地址中

for(i=0;i<16;i++,px++,py++)

(*py)=(*px);//把地址px中数值赋给py地址中

while

(1)

{

}//在此加软件断点

}

memory.cmd文件,可适用后面的各个实验

-w

-stack400h

-heap100

-lrts.lib

MEMORY

{

PAGE0:

VECT:

o=80h,l=80h

PRAM:

o=100h,l=2f00h

PAGE1:

DRAM:

o=3000h,l=1000h

}

SECTIONS

{

.text:

{}>PRAMPAGE0

.data:

{}>PRAMPAGE0

.cinit:

{}>PRAMPAGE0

.cio:

>PRAMPAGE0

.switch:

{}>PRAMPAGE0

.const:

{}>DRAMPAGE1

.bss:

{}>DRAMPAGE1

.stack:

{}>DRAMPAGE1

.vectors:

{}>VECTPAGE0

}

实验3LED显示实验(I/O实验)

原理:

4个LED灯接在I/O地址3002H,4个LED灯分别接低4位的数据位上。

程序:

ioportunsignedintport3002;//LED宏定义

#defineLBDSport3002

voidDelay(intnDelay);//延时和移位子函数声明

main()

{

unsignedintuLED[4]={1,2,4,8};//控制字,逐位置1:

0001B0010B0100B1000B

inti;

for(;;)

{

for(i=0;i<4;i++)

{

LBDS=~uLED[i];//正向顺序送控制字

Delay(64);//延时

}

for(i=3;i>=0;i--)

{

LBDS=~uLED[i];//反向顺序送控制字

Delay(64);//延时

}

}

}

voidDelay(intnDelay)

{

inti,j,k;

k=0;

for(i=0;i

for(j=0;j<1024;j++)

k++;

}

实验4拨码开关实验(I/O输入实验)

原理:

4个LED灯接在I/O地址3002H,4个LED灯分别接低4位的数据位上。

4个拨码开关接在I/O地址3003H,4个拨码开关分别接低4位的数据位上。

程序:

//为拨码开关和指示灯声明IO端口

ioportunsignedintport3002,port3003;

//DIP&LED宏定义

#defineDIPport3003

#defineLEDport3002

main()

{

inti;

for(;;)

{

i=DIP;//取拨码开关状态

i=i&0x0f;//末4位有效

LED=i;//输出到LED

}

}

实验5外中断实验

原理:

每按下小键盘(不分那个键)均会向int2发生2次中断,按键次数显示在4个LED灯。

port3002:

连接LED

port8007:

port3004:

DSP管脚int2连接到port3004地址最低位。

程序:

#defineIMR*(int*)0x0//*(int*)0x0:

表示数据空间地址(int*)0x0中的数据

#defineIFR*(int*)0x1

#definePMST*(int*)0x1d

#defineREGISTERCLKMD(*(unsignedint*)0x58)

ioportunsignedintport3002;

ioportunsignedintport3004;外中断管脚int2连接到port3004,置0中断使能。

ioportunsignedintport8007;

#defineLEDport3002

voidinterruptxint2(void);

unsignedintuWork,nCount;

unsignedintnCountKey,nLS;

main()

{

nCount=0;计数次数

nCountKey=0;按键次数

nLS=0x40;

REGISTERCLKMD=0x1007;//设DSP主频改为两倍PLL时钟=32MHz

asm("ssbxINTM");//关中断,进行关键设置时不许打扰

port3004=0;//使能XINT2

port8007=0xc8;液晶显示辅助控制

uWork=PMST;//设置PMST寄存器

PMST=uWork&0xff;//设置中断向量表起始地址=0080H

IMR=4;//使能XINT2

IFR=4;//清中断标志位

asm("rsbxINTM");//开中断

while

(1);

}

voidinterruptxint2(void)//XINT2中断服务程序

{

nCount++;nCount%=256;//中断计数

if(nCount%2==1)

{

nCountKey++;nCountKey%=8;

nLS^=0x40;

uWork=nCountKey|nLS;

LED=~uWork;//显示计数值

}

}

;中断向量表=======vectors.asm=======

.sect".vectors"

.ref_c_int00;Centrypoint

.ref_xint2

.align0x80;mustbealignedonpageboundary

RESET:

;resetvector

BD_c_int00;branchtoCentrypoint

STM#200,SP;stacksizeof200

nmi:

RETE;enableinterruptsandreturnfromone

NOP

NOP

NOP;NMI~

;softwareinterrupts

sint17.space4*16

sint18.space4*16

sint19.space4*16

sint20.space4*16

sint21.space4*16

sint22.space4*16

sint23.space4*16

sint24.space4*16

sint25.space4*16

sint26.space4*16

sint27.space4*16

sint28.space4*16

sint29.space4*16

sint30.space4*16

int0:

RETE

NOP

NOP

NOP

int1:

RETE

NOP

NOP

NOP

int2:

B_xint2

NOP

NOP

tint:

RETE

NOP

NOP

NOP

rint0:

RETE

NOP

NOP

NOP

xint0:

RETE

NOP

NOP

NOP

rint1:

RETE

NOP

NOP

NOP

xint1:

RETE

NOP

NOP

NOP

int3:

RETE

NOP

NOP

NOP

.end

实验3卷积与相关算法的程序设计与调试

一、实验目的:

1、学习如何用DSPC语言程序实现卷积与相关的计算。

2、学习用CCS调试程序的详细过程

3、学习如何设置断点

二、实验步骤:

1.设置SetupCCS为TMS320C5416软仿真方式

2.建立一个新工程

3.编辑源程序

4.将文件添加到过程中

5.设置工程选项

6.编译与连接

7.程序的运行与基本调试

/**Programforconvolve**/

#include

intN1,N2;/*输入数组长度*/

intn;/*输出数组长度*/

intm,i,k;

floatx[20];

floath[20];

floaty[20];/*定义输出数组*/

main()

{

N1=10;/*x长度*/

N2=10;/*h长度*/

n=N1+N2-1;/*输出y的长度*/

for(i=0;i<20;i++)/*初始化数组*/

{

x[i]=0;/*数组赋值*/

h[i]=0;

y[i]=0;

}

for(i=0;i

{

if(i

{

x[i]=i;

}

else

{

x[i]=0;

}

}

for(i=0;i<=n;i++)/*给h数组赋值[11111111110000000000]*/

{

if(i

{

h[i]=1;

}

else

{

h[i]=0;

}

}

for(i=0;i

{

for(k=0;k<=i;k++)

y[i]=y[i]+h[k]*x[i-k];

}

while

(1);

}

 

实验4快速傅里叶变换(FFT)实现

一、实验目的

1.掌握FFT算法的基本原理;

2.掌握用C语言编写DSP程序的方法。

二、实验设备

1.一台装有CCS3.3软件的计算机;

2.DSP实验箱的TMS320F2812主控板;

3.DSP硬件仿真器。

三、实验原理

  傅里叶变换是一种将信号从时域变换到频域的变换形式,是信号处理的重要分析工具。

离散傅里叶变换(DFT)是傅里叶变换在离散系统中的表示形式。

但是DFT的计算量非常大,FFT就是DFT的一种快速算法,FFT将DFT的N2步运算减少至(N/2)log2N步。

离散信号x(n)的傅里叶变换可以表示为 

, 

式中的WN称为蝶形因子,利用它的对称性和周期性可以减少运算量。

一般而言,FFT算法分为时间抽取(DIT)和频率抽取(DIF)两大类。

两者的区别是蝶形因子出现的位置不同,前者中蝶形因子出现在输入端,后者中出现在输出端。

本实验以时间抽取方法为例。

时间抽取FFT是将N点输入序列x(n)按照偶数项和奇数项分解为偶序列和奇序列。

偶序列为:

x(0),x

(2),x(4),…,x(N-2);奇序列为:

x

(1),x(3),x(5),…,x(N-1)。

这样x(n)的N点DFT可写成:

考虑到WN的性质,即

因此有:

或者写成:

由于Y(k)与Z(k)的周期为N/2,并且利用WN的对称性和周期性,即:

可得:

对Y(k)与Z(k)继续以同样的方式分解下去,就可以使一个N点的DFT最终用一组2点的DFT来计算。

在基数为2的FFT中,总共有log2(N)级运算,每级中有N/2个2点FFT蝶形运算。

单个蝶形运算示意图如下:

以N=8为例,时间抽取FFT的信号流图如下:

从上图可以看出,输出序列是按自然顺序排列的,而输入序列的顺序则是“比特反转”方式排列的。

也就是说,将序号用二进制表示,然后将二进制数以相反方向排列,再以这个数作为序号。

如011变成110,那么第3个输入值和第六个输入值就要交换位置了。

本实验中采用了一种比较常用有效的方法完成这一步工作__雷德算法。

四、实验步骤

1. 以64点FFT的信号流图为例,理解FFT算法的过程;

2. 在CCS3.3环境中打开本实验的工程(Example_fft.pjt),编译并重建.out输出文件,然后通过仿真器把执行代码下载到DSP芯片中;

3. 运行程序;

4. 选择v

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1