《DSP原理与应用实验报告总结.doc》由会员分享,可在线阅读,更多相关《DSP原理与应用实验报告总结.doc(8页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、DSP原理与应用定时器姓 名 班 级 专 业 电子信息工程 2011 年 12 月DSP的定时器实验报告一、 实验目的1. 通过实验熟悉VC5509A的定时器; 2. 掌握VC5509A定时器的控制方法; 3. 掌握 VC5509A 的中断结构和对中断的处理流程; 4. 学会 C 语言中断程序设计,以及运用中断程序控制程序流程。二、 实验设备 计算机,ICETEK-VC5509-A 实验箱(或 ICETEK 仿真器+ICETEKVC5509-A 系统板+相关连线及电源)。三、实验原理1. 通用定时器介绍及其控制方法 TMS320VC5509A 内部有两个 20 位通用定时器(GP): *每个通
2、用定时器包括: - 一个 16 位的减计数的计数器 TIM; - 一个 16 位的定时器周期寄存器 PRD; - 一个 16 位的定时器控制寄存器 TCR; - 一个 16 位的定时器预定标寄存器 PSCR;2.中断响应过程 外设事件要引起 CPU 中断,必须保证:IER 中相应使能位被使能,IFR 相应中断也被使能。在软件中,当设置好相应中断标志后,开中断,进入等待中断发生的状态;外设(如定时器)中断发生时,首先跳转到相应中断高级的服务程序中(如:定时器 1 会引起 TINT中断) ,程序在进行服务操作之后,应将本外设的中断标志位清除以便能继续中断,然后返回。3. 中断程序设计 - 程序中应
3、包含中断向量表,VC5509A默认向量表从程序区 0 地址开始存放,根据 IPVD 和IPVH 的值确定向量表的实际地址。 - 注意观察程序中 INTR_init()函数的定义部分,其中 IPVD 和 IPVH 的值都为0x0d0;同时观察配置文件 ICETEKVC5509-AE.cmd 中的 VECT 段描述中 o=0x0d000。 - 向量表中每项为 8 个字, 存放一个跳转指令, 跳转指令中的地址为相应服务程序入口地址。第一个向量表的首项为复位向量,即 CPU复位操作完成后自动进入执行的程序入口。 - 服务程序在服务操作完成后,清除相应中断标志,返回,完成一次中断服务。4. 定时器中断实
4、验程序流程图5.1 定时器结构框图T=clockin*(PRD+1)*(TDDR+1)5.2 时钟部分 定时器的工作时钟可以来自DSP内部的CPU时钟,也可以来自从TIN/OUT管脚输入的外部时钟。具体时钟源的选择和TIN/TOUT脚的功能由控制寄存器TCR中的FUNC字段确定,如下图所示由表可见,C5509的定时器有4种工作模式: 当FUNC=00时,TIN/TOUT为高阻态,时钟源为CUP时钟。该模式为复位后的缺省模式。 当FUNC=01时,TIN/TOUT为定时器输出,时钟源为CPU时钟。此时,TIN/TOUT作为三个定时器事件中的一个,可以输出时钟信号或脉冲信号。 当FUNC=10时,
5、TIN/TOUT为通用输出,时钟源为CPU时钟。此时,TIN/TOUT作为通用输出(General Output),其电平有控制寄存器TCR中的DATOUT字段确定。 当FUNC=11时,TIN/TOUT为时钟源输入,定时计数器将在其上升沿递减。5.3 计数器部分 C5509定时器的计数器分为两类,一类用于定时器工作,一类用于CUP设置定时长度。它的定时长度为20bit:4bit的预定标器和16bit的主计数器。其中,4bit的预定标值由预定寄存器PRSC中的TDDR定义;16bit主计数器的值由定时周期寄存器PRD定义。相关寄存器的格式如下表所示。 假定定时器的工作时钟周期为clockin,
6、则定时长度T可用下式计算: T=clockin*(PRD+1)*(TDDR+1)定时器主计数寄存器TIM预定标寄存器PRSC定时器周期寄存器PRD定时控制寄存器TCR定时器配置C程序流程:四、实验流程1. 实验准备连接实验设备;关闭实验箱上扩展模块和信号电源开关。2. 设置Code Composer Studio v3.3在硬件仿真(emulator)方式下运行。3. 启动Code Composer Studio v3.3。选择菜单 DebugReset CPU。4. 编译、下载程序。5. 运行程序,观察结果。6. 退出CCS。五、实验代码及结果#include myapp.h/ 定义指示灯寄
7、存器地址和寄存器类型#define LBDS (*(unsigned int *)0x)void INTR_init( void );void TIMER_init(void);int nCount;int flag_time;main()nCount=0;PLL_Init(40);SDRAM_init();LBDS=0;INTR_init();TIMER_init();while ( 1 )void interrupt Timer()nCount+;nCount%=16;if ( nCount=0 )LBDS=1;void INTR_init( void )IVPD=0xd0; /cpu将1
8、6bite的中断矢量指针与5bite的矢量序号级联一起1011 0000 00000 000 /然后左移3bite形成中断适量地址IVPH=0xd0;IER0=0x10;DBIER0=0x10;IFR0=0xffff;asm( BCLR INTM);void TIMER_init(void) ioport unsigned int *tim0; ioport unsigned int *prd0; ioport unsigned int *tcr0; ioport unsigned int *prsc0; tim0 = (unsigned int *)0x1000;prd0 = (unsign
9、ed int *)0x1001;tcr0 = (unsigned int *)0x1002;prsc0 = (unsigned int *)0x1003; / *tcr0 = 0x04f0; /定时器0控制寄存器,关闭定时器,自动重载打开,定时器拷贝打开 *tcr0 = 0x0Cf0; /定时器0控制寄存器,关闭定时器,自动重载打开,定时器拷贝打开 *tim0 = 0; /定时器0主计数器 *prd0 = 0x0ffff; /定时器0周期寄存器 *prsc0 = 2; /定时器0周期及计数寄存器 *tcr0 = 0x00e0; /定时器0控制寄存器,定时器启动 / *tcr0 = 0x08e0; /定时器0控制寄存器,定时器启动六 实验心得 通过这次实验,我更加熟悉了CCS开发环境以及设计运行调试过程,认识到模块的各个工作原理以及三者之间的关系,学会对模块的初始化怎么定义和编写的流程。 使我对DSP产生了浓厚的兴趣,激发了我学习DSP的积极性,从这次实验结果上来说,清晰的结果使我对书本上的知识应用到了实验中,很满足。最后,感谢老师、师兄、师姐的耐心指导!
限制150内