DSPC语言实验课案.docx
- 文档编号:25518533
- 上传时间:2023-06-09
- 格式:DOCX
- 页数:28
- 大小:244.70KB
DSPC语言实验课案.docx
《DSPC语言实验课案.docx》由会员分享,可在线阅读,更多相关《DSPC语言实验课案.docx(28页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DSPC 语言 实验
![提示](https://static.bdocx.com/images/bang_tan.gif)