北京邮电大学数字信号处理硬件实验学院:班级:学号:姓名:班内序号实验一:常用指令实验一、实验目的1.熟悉DSP开发系统的连接2.了解DSP开发系统的组成和结构和应用系统构成3.熟悉常用C54X系列指令的用法(程序寻址,寄存器,I/O口,定时器,中断控制)。
二、实验设备计算机,CCS 2.0版软件,DSP仿真器,实验箱。
三、实验操作方法1、系统连接进行DSP实验之前,先必须连接好仿真器、实验箱及计算机,连接方法如下所示:在硬件安装完成后,接通仿真器电源或启动计算机,此时,仿真盒上的“红色小灯”应点亮,否则DSP开发系统与计算机连接有问题。
2、运行CCS程序先实验箱上电,然后启动CCS,此时仿真器上的“绿色小灯”应点亮,并且CCS正常启动,表明系统连接正常;否则仿真器的连接、JTAG接口或CCS相关设置存在问题,掉电,检查仿真器的连接、JTAG接口连接,或检查CCS相关设置是否正确。
四、实验步骤与内容(一)简单指令程序运行实验1、实验使用资源实验通过实验箱上的XF指示灯观察程序运行结果2、实验过程启动CCS 2.0,并加载“exp01.out”;加载完毕后,单击“Run”运行程序;实验结果:可见XF灯以一定频率闪烁;单击“Halt”暂停程序运行,则XF灯停止闪烁,如再单击“Run”,则“XF”灯又开始闪烁;关闭所有窗口,本实验完毕。
源程序查看:用下拉菜单中Project/Open,打开“Exp01.pjt”双击“Source”,双击“exp01.asm”可查看源程序。
源程序注释如下:.mmregs.global _main_main:stm #3000h,spssbx xf ;将XF置1call delay ;调用延时子程序,延时rsbx xf ;将XF置0call delay ;调用延时子程序,b _main ;程序跳转到"_MAIN"nopnop;延时子程序delay:stm 270fh,ar3 ;设置辅助寄存器ar3loop1: ;循环开始stm 0f9h,ar4 ;设置辅助寄存器ar4loop2:banz loop2,*ar4- ;跳转指令ar4做自减,在减到零之前一直做loop2banz loop1,*ar3- ;跳转指令,ar3做自减,在ar3减到零之前,一直做loop1ret ;返回指令nopnop.end实验截图(二)资料存储实验1、实验使用资源本实验指导书是以TMS32OVC5410为例,介绍相关的内部和外部内存资源。
对于其它类型的CPU请参考查阅相关的资料手册。
下面给出TMS32OVC5410的内存分配表:对于存储空间而言,映像表相对固定。
值得注意的是内部寄存器与存储空间的映像关系。
因此在编程应用时这些特定的空间不能作其它用途。
对于程序存储空间而言,其映像表和CPU的工作模式有关。
当MP/MC引脚为高电平时,CPU工作在微处理器模式;当MP/MC引脚低电平时,CPU工作在为计算机模式。
具体的内存映像关系如上如所示。
内存实验主要了解内存的操作和DSP的内部双总线结构。
并熟悉相关的指令代码和执行过程等。
2、实验过程连接好DSP开发系统,运行CCS软件;a) 在CCS的Memory窗口中查找C5410各个区段的数据存储器地址,在可以改变的存储器内容的地方,选定地址随意改变其中内容并观察结果;b) 在CCS中装载实验示范程序,单步执行程序,程序中写入和读出的数据存储地址的变化;c) 改变其它寻址方式,进行观察数据存储器地址与写入和读出数据的的变化。
本实验说明:本实验程序将对0x1000开始的8个地址空间,填写入0xAAAA的数值,然后读出,并存储到0X1008开始的8个地址空间。
在CCS中可以观察DATA内存空间地址0X1000~0X100F值的变化。
样例程序实验操作说明:启动CCS 2.0,并加载“exp02.out”,用“View”下拉菜单中的“Memory”查看内存单元,输入要查看的内存单元地址,本实验要查看0x1000H~0x100FH单元的数值变化,输入地址0x1000H,查看0x1000H~0x100FH单元的初始值,单击“Run”运行程序,也可以“单步”运行程序,单击“Halt”暂停程序运行,查看0x1000H~0x100FH单元内数值的变化关闭各窗口,本实验完毕。
源程序注释:;get some knowledge of the cmd file;the program is compiled at no autoinitialization mode.mmregs.global _main_main:;store datastm 1000h,ar1 ;address of internal memoryrpt #07hst 0aaaah,*ar1+ ;将数据"0AAAAH"存放到以地址1000H~1007H的八个存储单元中.;read data then re-storestm 7h,ar3stm 1000h,ar1stm 1008h,ar2loop: ;循环的将1000H~1007H的八个单元中的数据COPY到1008H~100F的;八个存储单元中.ld *ar1+,t ;将辅助寄存器ar1的值赋给t,且ar1地址加1st t,*ar2+ ;存储T寄存器的值.将t的值存储在ar2所对应内存中,且ar2地址加1banz loop,*ar3-here: ;寄存器ar3地址减1,当其值不为0时跳转到loop无条件转移至hereb here.end实验截图(三)I/O实验1、实验使用资源数字量输入信号全部拓展出来,数字量输入接口主要由两个,D_Exp与扳东开关连接,PX4和PX5与电平转换芯片(74LVC245)连接,其功能分别为:D_Exp—数字量输入扩展接口123456789I 0 I1I2I3I4I5I6I7VCC电平转换扩展接口1234PX4—5V IN0 IN1 IN2 IN3PX5—3.3V OUT3 OUT2 OUT1 OUT0 通过PORTR,PORTW指令可以实现I/O口的输入输出功能,如数字量采集实验。
实验说明:实验中采用简单的一一映像关系来对I/O口进行验证,目的是使实验者能够对I/O 有一目了然的认识。
在本实验系统中,提供的IO空间分配如下:CPU1:0x0000 switch input (X) 80x0001 LED output(X) 8CPU2:0x0001 DAC0x0004 Read_Key0x0006 Write_Key0x000F Write_LCD0x8000 HPIC00x8001 HPIC10x8002 HPID0(AUTO)0x8003 HPID1(AUTO)0x8004 HPIA00x8005 HPIA10x8006 HPID0(NO AUTO)0x8007 HPID1(NO AUTO)实验程序框图注意:电平转换接口主要考虑应用3.3V的中央处理器时,系统的电平兼容问题,用来保护CPU不受损坏。
系统采用74LVC245电平兼容转换器件。
2、实验过程运行CCS程序,装载示范程序,调整K0~K7的开关,观察LP1~LP7 LED亮灭的变化,以及输入和输出状态是否一致。
(注意:输出为0时点亮灯)例程序实验操作说明启动CCS 2.0,并加载“exp03.out”,单击“Run”运行程序,任意调整K0~K7开关,可以观察到对应LP0~LP7灯“亮”或“灭”;单击“Halt”,暂停持续运行,开关将对灯失去控制。
关闭所有窗口,本实验完毕。
源程序查看:用下拉菜单中Project/Open,打开“Exp03.pjt”,双击“Source”,双击“exp03.asm”可查看源程序。
代码如下:.mmregs.global _main.text_main:stm 3100h,spstm 1000h,ar1portr 8000h,*ar1 ;读入I/O 8000H数据,将其存储到数据空间的1000Hnop ;NOP为空操作,起延时作用.nopportw *ar1,8001h ;将数据空间的1000H单元的数据,写出到I/O 8000Hnopnopb _main ;程序跳转到"_MAIN"执行.nopnop.end实验截图(四)定时器实验1、实验使用资源定时器实验时要用到C54芯片的定时器控制寄存器,定时器时间常数寄存器,定时器中断响应,寄存器定义详见C54芯片资料。
C54的定时器是一个20位的减法计数器,可以被特定的状态位实现停止、重新启动、重设置或禁止,可以使用该定时器产生周期性的CPU中断,控制定时器中断频率的两个寄存器是定时周期寄存器PRD 和定时减法寄存器TDDR定时器实验通过 LED(LP1~LP7)来显示。
在本系统中,时钟频率为20MHZ,令PRD = 0x4e1f,这样得到每1/1000秒中断一次,通过累计1000次,就能定时1秒钟。
2、实验过程调入样例程序,装载并运行;例程序实验操作说明启动CCS 2.0,并加载“exp04.out”,单击“Run”运行,可观察到LED灯(LP0~LP7)以一定的间隔时间不停摆动,单击“Halt”,暂停程序运行,LED 灯停止闪烁,单击“Run”,运行程序,LED灯又开始闪烁。
关闭所有窗口,本实验完毕。
exp04.c函数、子程序声明与定义void sys_ini() //系统初始化子程序{asm(" ssbx INTM"); //全局禁止所有可屏蔽中断PMST&=0x00FF; //(DRAM映射到程序空间和数据空间)向量表映射到0x0080空间SWWSR=0x7000; //io空间7个等待周期,程序与数据空间0个等待周期CLKMD=0x17FA; //CLKOUT=2*CLKIN=2*10M=20M,自动延时最长时间}void timer0_ini() //定时器0初始化子程序{TCR|=0x0010; //停止定时器0PRD=0x2710; //PRD=10000(D)TCR|=0x000A; //TDDR=10(D),所以定时器时钟=1/(20M/10/10000)=5msIMR=0x0008; //使能定时器0中断IFR=0xFFFF; //清除所有中断标志位asm(" rsbx INTM"); //全局使能可屏蔽中断TCR&=0xFFEF; //开始定时器0TCR|=0x0020; //复位定时起0}中断服务子程序声明与定义interrupt void timer0() //定时器0中断子程序{if(num==200) //记200次定时器中断,时间=200*5ms=1s{show=~show; //取反num=0;}elsenum++;return;}主程序void main(void){sys_ini();timer0_ini();for(;;){port8001=show;}}vectors.asm.global _c_int00,_timer0.sect ".vecs" ;自定义向量表reset: ;复位中断时跳转到c程序主函数(branch toC entry point延迟分支到c程序,默认入口地址c_int00)开辟堆栈空间b _c_int00 ;nopnopnmi: rete ;NMI 非屏蔽外部中断输入引脚,不可屏蔽中断时,返回并允许产生该中断nopnopnopsin17: .space 4*16 ;保留中断向量的地址空间sin18: .space 4*16sin19: .space 4*16sin20: .space 4*16sin21: .space 4*16sin22: .space 4*16sin23: .space 4*16sin24: .space 4*16sin25: .space 4*16sin26: .space 4*16sin27: .space 4*16sin28: .space 4*16sin29: .space 4*16sin30: .space 4*16int0: retenopnopnopint1: rete ;中断寄存器设置为rete 返回,允许中断外部产生中断,并且直接返回nopnopnopint2: retenopnopnoptint0: b _timer0 ;检测到定时器产生中断时,返回到c程序中的timer()nopnopbrint0: retenopnopnopbxint0: retenopnopnopdmac0: retenopnopnoptint1_dmac1: retenopnopnopint3: rete nopnopnophpint: rete nopnopnopbrint1_dmac2: rete nopnopnopbxint1_dmac3: rete nopnopnopdmac4: rete nopnopnopdmac5: rete nopnop nop }实验截图(五)INT2中断实验1、实验使用资源本实验是进行C54芯片的INT2中断练习, C54芯片中断INT2是低电平单脉冲触发;实验采用导线一端连接D_Exp—数字量输入扩展接口I0,经PX4的IN3,到PX5的OUT0电平转换,再与另一端连接INT2插孔;拨动开关K0一次,就产生一个低电平单脉冲;运行示范程序,观察LP1~LP7 LED灯的输出变化;可观察到每拨动开关K0一次LP1~LP7灯亮灭变化一次;2、实验过程样例程序实验操作说明启动CCS 2.0,并加载“exp05.out”,单击“Run”运行程序,反复拨动开关K0,观察LP1~LP7 LED灯亮灭变化,单击“Halt”暂停程序运行,反复拨动开关K0,LP1~LP7 LED灯亮灭不变化;关闭所有窗口,本实验完毕。