
DSP实验报告作业.doc
20页五 邑 大 学 实 验 报 告实验课程名称: DSP原理及应用 院系名称: 信息工程学院 专业名称: 电子信息工程 实验项目名称:1、 TMS320VC5402定时器实验 2、基于DSPLib的FFT程序设计 3、基于DSPLib的滤波器程序设计班级: 学号: 报告人: 一、TMS320VC5402定时器实验一 实验目的1. 了解DSP汇编程序与C语言程序的构成;2. 了解DSP程序各段的含义;3. 熟悉如何编写中断服务程序;4. 掌握片内定时器的设置方法;5. 掌握长时间间隔的定时器的处理二 实验内容1. DSP的初始设置;2. DSP中断向量表的建立;3. 定时器的使用;设实验板时钟频率为20MHz,编程实现以下要求:1、TMS320C5402的时钟频率为100 MHz2、TMS320C5402XF端输出一个周期为500ms的方波,周期性地点亮LED3、采用定时中断方法实现4、用C语言编程,画出程序流程图并给出源代码。
5、上机调试三 实验背景知识1 通用TIMER 简介TMS320VC5402 的定时器的说明:VC5416 中有两个可编程的片上定时器,总共包含有三个可由用户设置的寄存器,并可以申请主机的中断这三个寄存器分别为TIM、PRD、TCR这些寄存器与对应的存贮空间地址如下表所示:时间寄存器(TIM)是一个16 位的存贮器映射寄存器,它的值由周期寄存器来进行装载,并且做减一操作周期寄存器(PRD)是一个16 位的存贮器映射寄存器,它是用来重装时间寄存器(TIM)寄存器的值的定时器控制寄存器(TCR)是一个16 位的存贮器映射寄存器,包含了定时器的控制与状态信息2、CMD 文件简介cmd 文件用于DSP 代码的定位由3 部分组成:1、 (1)输入/输出定义:.obj 文件:链接器要链接的目标文件lib 文件:链接器要链接的库文件map 文件:链接器生成的交叉索引文件out 文件:链接器生成的可执行代码;链接器选项2) MEMORY 命令:描述系统实际的硬件资源3.) SECTIONS 命令:描述"段"如何定位下面例子则可说明其基本格式:-o sample.out (可缺省)-m sample.map (可缺省)-stack 100 (可缺省)sample.obj meminit.obj (可缺省)-l rts.lib (可缺省)MEMORY { PAGE 0: RESEVE: org = 00h len = 0x80 PAGE 0: PROG1: org = 0x0100 len = 0x1200 PAGE 0: VECT: org = 0x0080, len = 0x80 PAGE 1: RESEVE1: org = 00h len = 0x1300 PAGE 1: DARAM2: org = 0x1300 len = 0x400 PAGE 1: DARAM1: org = 0x1700 len = 0x2900 } SECTIONS{ .text : > PROG1 PAGE 0 .cinit : > PROG1 PAGE 0 .switch: > PROG1 PAGE 0 .vectors:> VECT PAGE 0 .const: > DARAM1 PAGE 1 .bss : > DARAM1 PAGE 1 .stack : > DARAM2 PAGE 1 .system: > DARAM2 PAGE 1 .data : > DARAM2 PAGE 1 }下面介绍一下CMD 文件中常用的程序段名与含义 .cinit 存放C 程序中的已初始化的变量初值和常数表;.const 存放C 程序中的字符常量和用const 声明的常量; .text 存放C 程序的代码; .bss 为C 程序中的未初始化的全局和静态变量保留存储空间;.far 为C 程序中用far 声明的全局和静态变量保留空间; .stack 为C 程序系统堆栈保留存储空间,用于保存返回地址、函数间的参数传递、存储局部变量和保存中间结果; .sysmem 用于C 程序中malloc、calloc 和realloc 函数动态分配存储空间.vectors 用于自定义的“.vectors”段,这里是中断向量表.switch 用于C程序中的switch语句.data 已初始化的数据段3 中断向量表文件中断服务程序的地址(中断向量)要装载到存储器的合适区域。
一般用中断向量表文件编制中断向量表,中断向量表文件多采用汇编语言编写;在文件中一般用汇编指令.sect 来生成一个表,表中各中断占4个字这个表包含中断向量的地址和跳转指令因为中断跳转地址的标志符在汇编语言模块外部使用,所以标志符用.ref 或.global定义4、GEL文件 GEL文件有两大作用:(1)配置CCS工作环境2)直接访问目标处理器(包括软硬件访真器),在这是主要使用GEL文件的初始化DSP以下面的例子介绍一下GEL 文件的构成#define PRD0 0x0025u#define TCR0 0x0026u#define PRD1 0x0031u#define TCR1 0x0032uStartUp(){ GEL_MapOn(); /*存储空间打开*/GEL_MapReset(); /*存储空间复位*/GEL_MapAdd(0x80u,0,0x3F80u,1,1); /* 定义程序空间0x80-0x3FFF 可读写 */GEL_MapAdd(0x4000u,0,0xC000u,1,1);/* 定义程序空间0x4000-0xFFFF 可读写 */ /* 定义数据空间0-0xFFFF 可读写 */ GEL_MapAdd(0x0u,1,0x60u,1,1); /* MMRs */ GEL_MapAdd(0x60u,1,0x3FA0u,1,1); /* DARAM */ GEL_MapAdd(0x4000u,1,0xC000u,1,1); /* External */}实验流程图:四 、实验步骤 1、根据实验要求编写输出周期500ms方波的汇编语言源代码,和C语言源代码(c语言中加入外部中断,通过按键改变方波频率)。
2、编译无误后下载到C5402开发板中,运行程序,观察LED是否周期性亮灭 3、下载c程序到开发板上,通过按下连接在外部中断上的按键,观察能否改变LED灯的亮灭频率五、程序源代码1、主函数:#include "timer.h"int t0_count;void main(){ CLKMD=0x00; //清零 while(CLKMD&01); CLKMD=0x47ff; //开启PLL方式且采用5倍频 PMST=0x00a0; //将片内数据RAM映射到程序空间和数据空间并从0080地址开始 coeff=1; t0_count=250*coeff; asm(" SSBX INTM"); //关闭所有可屏蔽的中断 ST1=ST1|0x0800; //INTM=1 TCR=0x0010;//停止定时器,且当PSC减到0后,TIM减1;当调试程序断点时定时器立即 停止工作 PRD=9999; //定时周期寄存器存放定时时间常数,将值赋给TIM TIM=9999; //定时寄存器 TCR=0x669; //定时控制寄存器,启动定时器,将PRD中的数加载到TIM中 IFR=0x108; //中断标志寄存器,启动外部中断INT3和定时器中断0 (TINT0)的标志位 IMR=0x108; //中断屏蔽寄存器,开放外部中断INT3和定时器中断0 (INT0)的屏蔽位 asm(" RSBX INTM"); //开放全部可屏蔽中断 ST1=ST1&0xf7ff; while(1) { while(t0_count>0); t0_count=250*coeff; if(ST1&0x2000) ST1=ST1&0xdfff; //XF=0,即熄灭LED灯 else ST1=ST1|0x2000; //XF=1,即点亮LED灯 }}interrupt void timer(){ t0_count--;}interrupt void change_frequency(){ coeff++; //改变XF引脚输出的信号的频率 if (coeff>5) coeff=1; }2、中断函数: .sect ".vectors" .ref _c_int00 .ref timerrs: BD _c_int00 ;Rest nop nopnmi: .space 4*16 ;NMI, SINT16sint17:.space 4*16 ;SINT17sint18: .space 4*16 ;SINT18sint19: .space 4*16 ;SINT19sint20: .space 4*16 ;SINT20sint21: .space 4*16 ;SINT21sint22: .space 4*16 ;SINT22sint23: .space 4*16 ;SINT23sint24: .space 4*16 ;SINT24sint25: .space 4*16 ;SINT25sint26: .space 4*16 ;SINT26sint27: .space 4*16 ;SINT27sint28: .space 4*16 ;SINT28sint29: .space 4*16 ;SINT29sint30: .space 4*16 ;SINT30int0: .space 4*16 ;INT0, SI。