实验四 定时器中断实验一:实验目的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 t c 为 CLKOUT 的周期)定时器由三个寄存器组成:TIM 、PRD 、TCR 。
TIM :定时器寄存器,用于装载周期寄存器值并自减1。
PRD :周期寄存器,用于装载定时器寄存器。
TCR :定时器控制寄存器,包含定时器的控制状态位。
定时器是一个片内减计数器,用于周期地产生发,后者每个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位●第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定时器所能计计时的长度可通过公式T x(TDDR+1)×(PRD+1)来计算,其中,TDDR 最大值为0FH,PDR最大值为0FFFFH,所以能计时的最长长度为T×1048576,由所采用的机器周期T决定,例如f=4MHz,T=250,则最长定时时间为:T max=250×1048576=262.144(ms) 例如若需要更长的计时时间,则可以在中断程序中设计一个计数器。
设计一个周期为40s的方波,可将定时器设置为100ms,程序计数器设为200,当计数200×100ms=20s时输出取值一次,可形成所要求的波形。
四:实验步骤本实验的步骤为:(1)连接好实验板,选择相应的CCS运行环境。
(2)新建工程,添加TIME文件及其配制文件,用编译链接工具条对文件进行编译链接,如果编译链接错误提示为“0Errors”,则把.out文件下载到目标板,然后再单击图6.3中的运行工具运行程序,这时可以看到目标板上和XF引脚的LED在周期性闪烁。
(3)选择菜单View→CPURegisters→CPU Registers命令,可以观察到累加器A在不断加1,如图5.3所示。
图5.3 CPU 寄存器(4)参考程序如下;.mmregs.global mainintktcr .set 0029hktcrstop .set 0010h;TCR 定时器控制寄存器各位含义如下:;RES SOFT FREE PSC TRB TSS TDDR;00000 0 0000 1 0 (TSS=1时停止定时)1001;**********************定时器参数定义*************************************** Tim0 .set 24h ;timer0 registerPrd0 .set 25h ; timer0 period counterTcr0 .set 26h ; timer0 control registerperiod .set 99 ;定时器周期;***************************************************************************** .sect "vectors";**********************中断向量表***************************************** vector: b mainintnopnopnmi: retenopnopnopsint17: retenopnopnopsint18: retenopnopnopsint19: retenopnopnopsint20: retenopnopnopsint21: retenopnopnopsint22: retenopnopnop sint23: retenopnopnop sint24: retenopnopnop sint25: retenopnopnop sint26: retenopnopnop sint27: retenopnopnop sint28: retenopnopnop sint29: retenopnopnop sint30: retenopnopnop int0: retenopnopnopint1: retenopnopnopint2: retenopnopnopb tint0nopnopbrint0: retenopnopnopbxint0: retenopnopnoptrint: retenopnopnoptxint: retenopnopnopint3: retenopnopnop hpint: retenopnopnopq26: .word 0ff80h.word 0,0,0q27: .word 0ff80h.word 0,0,0q28: .word 0ff80h.word 0,0,0q29: .word 0ff80h.word 0,0,0q30: .word 0ff80h.word 0,0,0q31: .word 0ff80h.word 0,0,0;************************************************************************* .textmainint: stm #203FH,PMST ;从定位中断向量表到2000H处ssbx intm ;关中断ssbx sxmssbx frct ;允许小数乘法ld #0,dpstm #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,*ar2stm #20,*ar1aa: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 mainintMEMORY{PAGE 0:EPROM :org=2000h,len=1000hPAGE 1:SPRAM :org=0060h,len=100h}SECTIONS{vectors :> EPROM PAGE 0.text :> EPROM PAGE 0}五:实验报告要求:1.运行源程序,观察实验结果,看到XF引脚的LED周期性地变化,修改定时器参数,改变LED闪烁周期。