DSP实验定时器中断实验Word文件下载.docx
《DSP实验定时器中断实验Word文件下载.docx》由会员分享,可在线阅读,更多相关《DSP实验定时器中断实验Word文件下载.docx(16页珍藏版)》请在冰点文库上搜索。
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
11
10
9~6
5
4
3~0
Reserved
SOFT
FREE
PSC
TRB
TDDR
图5.2 TCR位描述
●第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→CPURegisters→CPURegisters命令,可以观察到累加器A在不断加1,如图5。
3所示.
图5。
3CPU寄存器
(4)参考程序如下;
.mmregs
。
globalmainint
ktcr。
set0029h
ktcrstop。
set0010h
;
TCR定时器控制寄存器各位含义如下:
;
RESSOFTFREEPSCTRBTSSTDDR
000000000010(TSS=1时停止定时)1001
**********************定时器参数定义***************************************
Tim0.set24h;
timer0register
Prd0。
set25h;
timer0periodcounter
Tcr0。
set26h;
timer0controlregister
period。
set99;
定时器周期
*****************************************************************************
.sect”vectors”
**********************中断向量表*****************************************
vector:
bmainint
nop
nmi:
rete
sint17:
rete
sint18:
sint19:
sint20:
sint21:
sint22:
sint23:
sint24:
sint25:
sint26:
sint27:
sint28:
sint29:
sint30:
int0:
int1:
int2:
btint0
brint0:
bxint0:
trint:
txint:
int3:
hpint:
q26:
word0ff80h
word0,0,0
q27:
.word0ff80h
word0,0,0
q28:
word0,0,0
q29:
word0,0,0
q30:
q31:
*************************************************************************
.text
mainint:
stm#203FH,PMST;
从定位中断向量表到2000H处
ssbxintm;
关中断
ssbxsxm
ssbxfrct;
允许小数乘法
ld#0,dp
stm#0008h,imr;
允许定时器0中断
**************************************************************************
允许定时器0中断,IMR寄存器各位含义如下:
RESDMAC5DMAC4BXINT1BRINT1HINTINT3TINTDMAC0BXINT0BRINT0TINT0INT2INT1INT0
0000000000001000
***************************************************************************
stm#ktcrstop,tcr;
停止定时
stm#period,tim;
设定定时器寄存器
stm#period,prd;
设定定时器周期寄存器
stm#ktcr,tcr;
启动定时器
stm#0008h,imr;
允许TIMER0中断
stm#0ffffh,ifr;
清中断
rsbxintm;
开中断
wait:
nop;
循环,等中断
bwait
**************************定时器中断程序*********************************
*************************************************************************
tint0:
add#1,A;
A寄存器加1操作
stm#20,*ar2
stm#20,*ar1
aa:
ssbxxf;
XF引脚置高,LCD亮
rpt#8000;
重复8001次
等待
rpt#8000;
nop;
rpt#8000;
rpt#8000;
banzaa,*ar1-
bb:
rsbxxf;
XF引脚置低,LCD灭
banzbb,*ar2—
rete;
中断返回
。
end
配置文件如下:
time。
obj
-otime.out
-mtime。
map
—emainint
MEMORY
{
PAGE0:
EPROM:
org=2000h,len=1000h
PAGE1:
SPRAM:
org=0060h,len=100h
}
SECTIONS
{
vectors:
>
EPROMPAGE0
text:
〉EPROMPAGE0
五:
实验报告要求:
1.运行源程序,观察实验结果,看到XF引脚的LED周期性地变化,修改定时器参数,改变LED闪烁周期。
2.自编汇编程序,要求,每一次进入定时器中断,XF引脚取反一次(提示:
设置标志FLAG,当XF=1时,FLAG=1,当XF=0时,FLAG=0)。
3.深入体会中断矢量空间的可移值性。
4.汇编程序中:
.space。
4×
16×
6的含义是什么,若不用。
space.4×
6,可用什么语句代替。