DSP定时器实验报告
姓 名 6666666
班 级 66666666
学 号 6666666666
专 业 通信工程
2013 年 5月
1. 通过实验熟悉VC5509A的定时器;
2. 掌握VC5509A定时器的控制方法;
3. 掌握 VC5509A 的中断结构和对中断的处理流程;
4. 学会 C 语言中断程序设计,以及运用中断程序控制程序流程。
计算机,ICETEK-VC5509-A 实验箱(或 ICETEK 仿真器+ICETEK–VC5509-A 系统板+
相关连线及电源)。
1. 通用定时器介绍及其控制方法
TMS320VC5509A 内部有两个 20 位通用定时器(GP):
*每个通用定时器包括:
- 一个 16 位的减计数的计数器 TIM;
- 一个 16 位的定时器周期寄存器 PRD;
- 一个 16 位的定时器控制寄存器 TCR;
- 一个 16 位的定时器预定标寄存器 PSCR;
*PSCR寄存器说明:
图1 PSCR寄存器
PSCR: 4 位的预定标值,与TIM 共同组成 20 位的定时计数器。
TDDR: 预定标周期寄存器(在需要时重装入 PSC 的值)。
TCR 寄存器说明。
2.中断响应过程
外设事件要引起 CPU 中断,必须保证:IER 中相应使能位被使能,IFR 相应中断也被使能。在软件中,当设置好相应中断标志后,开中断,进入等待中断发生的状态;外设(如定时器)中断发生时,首先跳转到相应中断高级的服务程序中(如:定时器 1 会引起 TINT中断),程序在进行服务操作之后,应将本外设的中断标志位清除以便能继续中断,然后返回。
3. 中断程序设计
- 程序中应包含中断向量表,VC5509A默认向量表从程序区 0 地址开始存放,根据 IPVD 和IPVH 的值确定向量表的实际地址。
- 注意观察程序中 INTR_init()函数的定义部分,其中 IPVD 和 IPVH 的值都为0x0d0;同时观察配置文件 ICETEK–VC5509-AE.cmd 中的 VECT 段描述中 o=0x0d000。
- 向量表中每项为 8 个字, 存放一个跳转指令, 跳转指令中的地址为相应服务程序入口地址。第一个向量表的首项为复位向量,即 CPU复位操作完成后自动进入执行的程序入口。
- 服务程序在服务操作完成后,清除相应中断标志,返回,完成一次中断服务。
4. 定时器中断实验程序流程图
图2 定时器中断流程图
图3 TMS320VC5509的内部结构
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时,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,则定时长度T可用下式计算:
T=clockin*(PRD+1)*(TDDR+1)
定时器主计数寄存器TIM
预定标寄存器PRSC
定时器周期寄存器PRD
定时控制寄存器TCR
定时器配置C程序流程:
6.实验程序代码及分析
#include "myapp.h"
// 定义指示灯寄存器地址和寄存器类型
#define LBDS (*((unsigned int *)0x400001))
void INTR_init( void );
void TIMER_init(void);
void Delay(unsigned int nDelay);
main()
{
PLL_Init(1);
SDRAM_init();
LBDS=0;
INTR_init();
TIMER_init();
while ( 1 )
{
}
}
void interrupt Timer()
{
LBDS=~LBDS;
}
void INTR_init( void )
{
IVPD=0xd0; //cpu将16bite的中断矢量指针与5bite的矢量序号级联一起
//然后左移3bite形成中断矢量地址
IVPH=0xd0;
IER0=0x10;
DBIER0 =0x10;
IFR0=0xffff;
asm(" BCLR INTM"); //开启使能所有可屏蔽中断:状态寄存器ST1-55
}
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 = (unsigned int *)0x1001;
tcr0 = (unsigned int *)0x1002;
prsc0 = (unsigned int *)0x1003;
*tcr0 = 0x04f0;
//*tim0 = 0;
*prd0 = 0x0ffff;
*prsc0 = 15;
*tcr0 = 0x00e0;
}
void Delay(unsigned int nDelay)
{
int i=0;
for(i;i<100;i++)
{}
}
本实验设计的程序是在上指示灯实验基础上修改得来,由于指示灯实验 控制指示灯闪烁的延时控制是用循环计算方法得到的,延时不精确也不均匀,采用中断方式可以实现指示灯的定时闪烁,时间更加准确。
实验程序的工程中包含了两种源代码,主程序采用 C 语言编制利于控制,中断向量表在vector.asm汇编语言文件中,利于直观地控制存储区分配。在工程中只需将它们添加进来即可,编译系统会自动识别分别处理完成整合工作。
实验程序的 C 语言主程序中包含了内嵌汇编语句,提供一种在需要更直接控制 DSP 状态时的方法,同样的方法也能提高 C 语言部分程序的计算效率。
1. 实验设备
连接实验设备;关闭实验箱上扩展模块和信号源电源开关。
2. 设置Code Composer Studio 3.3在硬件方式下运行
3. 启动Code Composer Studio 3.3
4. 建立工程文件,编译下载程序
5. 运行程序,观察结果
6. 退出CCS
- 指示灯在定时器的定时中断中按照设计定时闪烁。
- 使用定时器和中断服务程序可以完成许多需要定时完成的任务,比如 DSP 定时启动 A/D 转换,日常生活中的计时器计数、空调的定时启动和关闭等。
- 在调试程序时,有时需要指示程序工作的状态,可以利用指示灯的闪烁来达到,指示灯灵活的闪烁方式可表达多种状态信息。
六、实验心得
实验前需熟悉实验仪器,了解实验要求和内容,熟悉程序的逻辑关系。看似简单的实验,却包含很多复杂逻辑。通过这次实验,更加熟悉了CCS开发环境,认识到模块的各个工作原理以及之间的关系,学会对模块的初始化怎么定义和编写的流程。 使我对DSP产生了浓厚的兴趣,激发了学习DSP的积极性。从这次实验结果上来说,清晰的结果使我对书本上的知识应用到了实验中,很满足。
最后,感谢老师、师兄、师姐的耐心指导!
实验四 定时器中断实验
一:实验目的
1.熟悉定时器初始化的步骤;
2.熟悉定时器控制寄存器(TCR)的含义和使用;
3.熟悉定时器的原理和应用。
二:实验内容
本实验要求编写一个简单的定时器中断程序,设置一定的周期控制与XF引脚相连的LCD指示灯。当定时器中断产生时可以观察到LCD周期性闪烁。
三:实验原理
1.定时器
.C54xx系列的DSP都具有一个或两个预定标的片内定时器,这种定时器是一个倒数定时器,它可以被特定的状态位实现停止、重启动、重设置或禁止。定时器在复位后就处于运行状态,为了降低功耗可以禁止定时器工作。应用中可以用定时器来产生周期性的CPU中断或脉冲输出。定时器的功能方框图如图9.1所示,其中有一个主计数器(TIM)和一个预定标计数器(PSC)。TIM用于重装载周期寄存器PRD的值,PSC用于重装载周期寄存器TDDR的值。
图5.1中有一个 信号,是在器件复位时,DSP向外围电路(包括定时器)发送的一个信号,此信号将在定时器上产生以下效果:寄存器TIM和PRD装载最大值(0FFFFH);TCR的所有位清0;结果是分频值为0,定时器启动,TCR的FREE和SOFT为0。
定时器实际上是有20bit的周期寄存器。它对CLKOUT信号计数,先将PSC(TCR中的D6~D9位)减1,直至PSC为0,然后把TDDR(TCR中的低4位)重新装载入PSC,同时将TIM减1,直到TIM减为0。这时CPU发出TINT中断,同时在TOUT引脚输出一个脉冲信号,脉冲宽度与CLKOUT一致,然后将PRD重新装入TIM,重复
下去直到系统或定时器复位。定时器产生中断的计算公式如下:
TINT的频率= × × (其中tc为 CLKOUT的周期)
定时器由三个寄存器组成:TIM、PRD、TCR。
TIM:定时器寄存器,用于装载周期寄存器值并自减1。
PRD:周期寄存器,用于装载定时器寄存器。
TCR:定时器控制寄存器,包含定时器的控制状态位。
定时器是一个片内减计数器,用于周期地产生CPU中断。定时器被预定标计数器所触发,后者每个CPU时钟周期减1,当计数器减至0时,会产生一个定时器中断,同时在下一周期计数器被定时周期值重新装载。
在正常操作模式下,当TIM自减至0时,TIM将被PRD内的数值重装载。在硬件复位或定时器单独复位(TCR中TRB位置1)的情况下,主定时器模块输出的是定时器中断(TINT)信号。该中断被发送至CPU,同时由TOUT引脚输出。TOUT脉冲的宽度等于CLKOUT的时钟宽度。
预定标模块由两个类似TIM和PRD的单元构成。它们是预定标计数器(PSC)和定时器分频寄存器(TDDR)。PSC、TDDR是RCR寄存器的字段。在正常操作时PSC自减为0,TDDR值装入PSC,同样在硬件复位或定时器单独复位的情况下,TDDR也被装入PSC。PSC被CPU时钟定时,即每个CPU时钟使PSC自减1。PSC可被TCR读取,但不能直接写入。
当TSS置位时,定时器停止工作。若不需要定时器,终止定时操作,可使芯片工作在低功耗模式,并且可以使用与定时器相关的两个寄存器(TIM和PRD)作为通用的存储器单元,可以在任意周期对它们进行读或写操作。
TIM的当前值可被读取,PSC也可以通过TCR读取。因为读取这两个存储器需要两个指令,而在两次读取之间因为自减,数值可能改变,因此,PSC两次读的结果可能有差别,不够准确。若要准确测量时序,在读这两个寄存器值之前可先中止定时器,对TSS置1和清0后,可重新开始定时。
通过TOUT信号或中断,定时器可以用于产生周边设备的采样时钟,如模拟接口。对于有多个定时器的DSP,由寄存器GPIOCR中的第15位控制使用某一个定时器产生的TOUT信号。
2.定时器初始化
(1)定时器初始化步骤
●TCR的TSS位写1,定时器停止工作;
●装载TRD;
●初始化TCR中的TDDR,并对TCR中的TSS置0,对TRB置1来重装载定时器周期。
(2)初始化定时器中断方法(INTM=1)
●FIR中的TINT写1,以清除挂起的定时器中断;
●IMR中的TINT置1,启动定时器中断;
●启动全部中断,INTM置0;
●在重启(RESET)后,TIM和PRD被设置为最大值(FFFFH),TCR中的TDDR置0。
(3)定时控制寄存器(TCR)
TCR为一个映射到片内的16位寄存器,它可以控制:
●定时器的工作方式;
●设定预定标计数器中的当前数值;
●启动或停止定时器;
●重新装载定时器;
●设置定时器的分频值。
TCR的位描述如图5.2
●第15~12位Reserved:保留位,总为0 。
●第11~10位SOFT、FREE:特殊的仿真位。高级语言调试程序中出现一个断点时,该仿真位决定定时器的状态。如果FREE位设为1,则当遇到一个断点时,定时器继续运行(即自由运行),在这种情况下,SOFT被忽略。但是,如果FREE为0,则SOFT有效。在此情况下,如果SOFT=0,则定时器停止,下一次TIM的值递减;如果SOFT=1,则当TIM减到0,定时器停止工作。
●第9~6位PSC:定时器预定标计数器。这4位用来保存定时器的当前预定标计数器。每个CLKOUT周期内,若PSC值大于0,PSC减1,在PSC减到0后的下个CLKOUT周期内,装载TDDR的内容,并且TIM减1。每当软件设置了定时器重载位(TRB)时,PSC也被重新装载。可通过TCE检测PSC,但PSC不能直接设置,PSC值必须从TDDR中提取。复位时,PSC设为0。
●第5位TRB:定时器重载位。当TRB写入1时,TIM装载PRD中的值,并且PSC装载TDDR中的值。TRB位总被读为0。
●第4位TSS:定时器停止状态位。TSS停止或重新启动定时器。复位时,TSS清零,并且立即启动定时器。TSS=0,启动或重新启动定时器;TSS=1,停止定时。注意,此位为只读位,读出的值永远为0。
●第3~0位TDDR:定时器分频比寄存器。每经过(TDDR+1)个CLKOUT周期,TIM减1。复位时,TDDR位清0。如果想通过一个整数因子增加总的定时计数值,则将整数因子减1后写入这4位。当PCS值为0时,在随后的一个CLKOUT周期内,TDDR内容将被重新装入PSC,并且TIM减1。每当TRB重载入时,TDDR也将被PSC重新装载。
3:定时器应用:
C54x定时器所能计计时的长度可通过公式Tx(TDDR+1)×(PRD+1)来计算,其中,TDDR最大值为0FH,PDR最大值为0FFFFH,所以能计时的最长长度为T×1048576,由所采用的机器周期T决定,例如f=4MHz,T=250,则最长定时时间为:Tmax=250×1048576=262.144(ms)
例如若需要更长的计时时间,则可以在中断程序中设计一个计数器。设计一个周期为40s的方波,可将定时器设置为100ms,程序计数器设为200,当计数200×100ms=20s时输出取值一次,可形成所要求的波形。
四:实验步骤
本实验的步骤为:
(1)连接好实验板,选择相应的CCS运行环境。
(2)新建工程,添加TIME文件及其配制文件,用编译链接工具条对文件进行编译链接,如果编译链接错误提示为“0 Errors”,则把.out文件下载到目标板,然后再单击图6.3中的运行工具运行程序,这时可以看到目标板上和XF引脚的LED在周期性闪烁。
(3)选择菜单View→CPU Registers→CPU Registers命令,可以观察到累加器A在不断加1,如图5.3所示。
图5.3 CPU 寄存器
(4) 参考程序如下;
.mmregs
.global mainint
ktcr .set 0029h
ktcrstop .set 0010h
;TCR 定时器控制寄存器各位含义如下:
;RES SOFT FREE PSC TRB TSS TDDR
;00000 0 0000 1 0 (TSS=1时停止定时) 1001
;**********************定时器参数定义***************************************
Tim0 .set 24h ;timer0 register
Prd0 .set 25h ; timer0 period counter
Tcr0 .set 26h ; timer0 control register
period .set 99 ;定时器周期
;*****************************************************************************
.sect "vectors"
;**********************中断向量表*****************************************
vector: b mainint
nop
nop
nmi: rete
nop
nop
nop
sint17: rete
nop
nop
nop
sint18: rete
nop
nop
nop
sint19: rete
nop
nop
nop
sint20: rete
nop
nop
nop
sint21: rete
nop
nop
nop
sint22: rete
nop
nop
nop
sint23: rete
nop
nop
nop
sint24: rete
nop
nop
nop
sint25: rete
nop
nop
nop
sint26: rete
nop
nop
nop
sint27: rete
nop
nop
nop
sint28: rete
nop
nop
nop
sint29: rete
nop
nop
nop
sint30: rete
nop
nop
nop
int0: rete
nop
nop
nop
int1: rete
nop
nop
nop
int2: rete
nop
nop
nop
b tint0
nop
nop
brint0: rete
nop
nop
nop
bxint0: rete
nop
nop
nop
trint: rete
nop
nop
nop
txint: rete
nop
nop
nop
int3: rete
nop
nop
nop
hpint: rete
nop
nop
nop
q26: .word 0ff80h
.word 0,0,0
q27: .word 0ff80h
.word 0,0,0
q28: .word 0ff80h
.word 0,0,0
q29: .word 0ff80h
.word 0,0,0
q30: .word 0ff80h
.word 0,0,0
q31: .word 0ff80h
.word 0,0,0
;*************************************************************************
.text
mainint: stm #203FH,PMST ;从定位中断向量表到2000H处
ssbx intm ;关中断
ssbx sxm
ssbx frct ;允许小数乘法
ld #0,dp
stm #0008h,imr ;允许定时器0中断
;**************************************************************************
;允许定时器0中断,IMR 寄存器各位含义如下:
;RES DMAC5 DMAC4 BXINT1 BRINT1 HINT INT3 TINT DMAC0 BXINT0 BRINT0 TINT0 INT2 INT1 INT0
;00 0 0 0 0 0 0 0 0 0 0 1 0 0 0
;***************************************************************************
stm #ktcrstop,tcr ;停止定时
stm #period,tim ;设定定时器寄存器
stm #period,prd ;设定定时器周期寄存器
stm #ktcr,tcr ;启动定时器
stm #0008h,imr ;允许TIMER0中断
stm #0ffffh,ifr ;清中断
rsbx intm ;开中断
wait: nop ;循环,等中断
b wait
;**************************定时器中断程序*********************************
;*************************************************************************
tint0:
add #1,A ;A寄存器加1操作
stm #20,*ar2
stm #20,*ar1
aa:
ssbx xf ;XF引脚置高,LCD亮
rpt #8000 ;重复8001次
nop ;等待
rpt #8000 ;重复8001次
nop ;等待
rpt #8000 ;重复8001次
nop ;等待
rpt #8000 ;重复8001次
nop ;等待
rpt #8000 ;重复8001次
nop ;等待
rpt #8000 ;重复8001次
nop ;等待
rpt #8000 ;重复8001次
nop ;等待
rpt #8000 ;重复8001次
nop ;等待
rpt #8000 ;重复8001次
nop ;等待
banz aa,*ar1-
bb:
rsbx xf ;XF引脚置低,LCD灭
rpt #8000 ;重复8001次
nop ;等待
rpt #8000 ;重复8001次
nop ;等待
rpt #8000 ;重复8001次
nop ;等待
rpt #8000 ;重复8001次
nop ;等待
rpt #8000 ;重复8001次
nop ;等待
rpt #8000 ;重复8001次
nop ;等待
rpt #8000 ;重复8001次
nop ;等待
rpt #8000 ;重复8001次
nop ;等待
rpt #8000 ;重复8001次
nop ;等待
banz bb ,*ar2-
rete ;中断返回
.end
配置文件如下:
time.obj
-o time.out
-m time.map
-e mainint
MEMORY
{
PAGE 0:
EPROM :org=2000h,len=1000h
PAGE 1:
SPRAM :org=0060h,len=100h
}
SECTIONS
{
vectors :> EPROM PAGE 0
.text :> EPROM PAGE 0
}
五:实验报告要求:
1. 运行源程序,观察实验结果,看到XF引脚的LED周期性地变化,修改定时器参数,改变LED闪烁周期。
2. 自编汇编程序,要求,每一次进入定时器中断,XF引脚取反一次(提示:设置标志FLAG,当XF=1时,FLAG=1,当XF=0时,FLAG=0)。
3. 深入体会中断矢量空间的可移值性。
4. 汇编程序中:.space.4×16×6的含义是什么,若不用.space. 4×16×6,可用什么语句代替。
定时器实验报告实验目的1掌握单片机内部计数器的使用和编程方法2掌握中断处理程序的编程方法实验器材12345G6W仿真器一台MCS5…
电子信息工程学系实验报告课程名称单片机原理及接口应用实验项目名称51定时器实验实验时间20xx1216班级姓名学号一实验目的熟悉k…
实验四定时器实验自动化121班120xx00236张礼一实验目的掌握定时器的工作原理及四种工作方式掌握定时器计数初始值的计算掌握如…
实验六定时器计数器一实验目的学会8253芯片和微机接口的原理和方法掌握8253定时器计数器的工作方式和编程原理二实验内容用8253…
定时器实验报告学生何绍金学号20xx03870408专业班级指导老师杨东勇20xx年12月一实验目的1掌握定时器的工作原理2学习单…
实验报告课程名称:电工电子学实验指导老师:实验名称:集成定时器及其应用一、实验目的1.了解集成定时器的功能和外引线排列。2.掌握用…
单片机实验报告(二)实验名称:定时器及外部中断南京理工大学紫金学院电光系一、实验目的1、学习定时/计数器的应用;2、学习外部中断技…
电子信息工程学系实验报告课程名称单片机原理及接口应用实验项目名称51定时器实验实验时间20xx1216班级姓名学号一实验目的熟悉k…
实验报告班级学号姓名同组人实验日期室温大气压成绩PINSEL00x00000000P07管脚连接GPIOPINSEL11ltlt4…
学生实验练习使用电火花计时器或电磁打点计时器实验报告班级同组姓名时间一实验目的练习使用电火花计时器或电磁打点计时器利用打上点的纸带…