TMS320VC5402定时器实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

TMS320VC5402定时器实验
一、实验目的
1. 了解DSP汇编程序与C语言程序的构成;
2. 了解DSP程序各段的含义;
3. 熟悉如何编写中断服务程序;
4. 掌握片内定时器的设置方法;
5. 掌握长时间间隔的定时器的处理
二、实验内容(要求)
1. DSP的初始设置;
2. DSP中断向量表的建立;
3. 定时器的使用;
三、实验原理(背景知识)
TMS320VC5402定时器中有一个可编程的片上定时器,总共包含有三个可由用户设置的寄存器,并可以申请主机的中断。

这三个寄存器分别为TIM、PRD、TCR。

时间寄存器(TIM)是一个16 位的存贮器映射寄存器,它的值由周期寄存器来进行装载,并且做减一操作。

周期寄存器(PRD)是一个16 位的存贮器映射寄存器,它是用来重装时间寄存器(TIM)寄存器的值的。

定时器控制寄存器(TCR)是一个16 位的存贮器映射寄存器,包含了定时器的控制与状态信息。

定时器的工作过程:
①定时分频系数和周期数分别装入TCD和PRC寄存器中;
②每来一个定时脉冲CLKOUT,计数器PSC减1;
③当PSC减至0时,PSC产生借位信号;
④在PSC的借位信号作用下,TIM减1计数,同时将分频系数装入PSC,重新计数;
⑤当TIM减到0时,定时时间到,由借位产生定时中断TINT和定时输出TOUT并将PRD中的时间常数重新装入TIM。

定时器的定时时间为:
定时周期= CLKOUT×(TDDR+1)×(PRD+1)
程序框图如下:
开开
开开开
CLKMD= 47FFh PMST=00A0h t0_count=250
开开开INTM=1
TCR=0010h PRD=270Fh TCR=0669h
开timer0开开
IFR=8IMR=8INTM=0
timer0开开
开开开开开开
Y
N
开开
t0_count=t0_count-1
to_count=0
t0_count=250
XF=0XF=1
XF=0
Y N
Y
N
开开
四 、实验步骤
1、打开CCS ,并设置好相对应的参数,显示硬件连接成功后,编写主函数。

2、主函数中先初始化,然后关中断,设置定时的相对应寄存器,打开中断,等待中断的到来,定时中断服务函数中对输出引脚取反,然后实现了LED 的亮灭变化。

为了改变定时的长度,还引入了按键中断服务,在按键中断服务函数中每按一下健,增加定时的长度。

3、接着编写中断向量表,中断向量表只要和主函数的中断一一对应就行。

4、添加支持c 语言的库函数的头文件,编译,看一下会产生哪些链接文件,然后编写链接文件。

5、编译通过后,下载到板子上,验证是否有逻辑错误,然后进行修改。

五、程序源代码
1、主函数:
#include "timer.h"
int t0_count,coeff;
void main()
{ *CLKMD=0x0000;
while(*CLKMD&0x0001);
*CLKMD=0x47ff;
*PMST=0x00a0;
coeff=1;
t0_count=250*coeff;
asm(" ssbx intm");
//*ST1=*ST1|0x0800; //INTM=1 *TCR=0x0010;
*PRD=9999;
*TIM=9999;
*TCR=0x669;
*IFR=0x0108;
*IMR=0x0108;
asm(" rsbx intm");
//*ST1=*ST1&0xf7ff; //INTM=0; //------------------------------------------- while(1)
{ while(t0_count>0);
t0_count=250*coeff;
if(*ST1&0x2000)
{
*ST1=*ST1&0xDFFF;
}
else
{
*ST1=*ST1|0x2000;
}
}
}
interrupt void timer()
{
t0_count--;
}
interrupt void key_press()
{
coeff++;
if(coeff>5){coeff=1;}
}
2、中断函数:
.ref _c_int00
.ref _timer
.ref _key_press
.sect ".vectors"
rs: BD _c_int00
nop
nop ;Rest
nmi: .space 4*16 ;NMI, SINT16
sint17:.space 4*16 ;SINT17
sint18: .space 4*16 ;SINT18
sint19: .space 4*16 ;SINT19
sint20: .space 4*16 ;SINT20
sint21: .space 4*16 ;SINT21
sint22: .space 4*16 ;SINT22
sint23: .space 4*16 ;SINT23
sint24: .space 4*16 ;SINT24
sint25: .space 4*16 ;SINT25
sint26: .space 4*16 ;SINT26
sint27: .space 4*16 ;SINT27
sint28: .space 4*16 ;SINT28
sint29: .space 4*16 ;SINT29
sint30: .space 4*16 ;SINT30
int0: .space 4*16
int1: .space 4*16 ;INT1, SINT1
int2: .space 4*16 ;INT2, SINT2
tint0: BD _timer
NOP
NOP ;TINT0, SINT3
brint0: .space 4*16 ;BRINT0, SINT4
bxint0: .space 4*16 ;BXINT0, SINT5
dmac0: .space 4*16 ;DMAC0, brint2, SINT6 dmac1: BD _timer ;DMAC1, bxint2, SINT7 nop
nop
int3: BD _key_press ;INT3, SINT8
NOP
NOP
hpint: .space 4*16 ;HPINT, SINT9
brint1: .space 4*16 ;BRINT1 or DMAC2, SINT10 bxint1: .space 4*16 ;BXINT1 or DMAC3, SINT11 dmac4: .space 4*16 ;DMAC4, SINT12
dmac5: .space 4*16 ;DMAC5, SINT13
rsvd1: .space 4*16 ;reserved
rsvd2: .space 4*16 ;reserved
.end
3、链接文件:
MEMORY
{ PAGE 0:RESERVE: origin=00h, length=80h
PAGE 0: VECTOR_RAM: origin=0080h,length=80h
PAGE 0: PROG_RAM: origin=100h,length=0f00h
PAGE 1: DATA_RAM1: origin=1000h,length=500h
PAGE 1: STACK_RAM: origin=1500h,length=100h
}
SECTIONS
{
.vectors:>VECTOR_RAM PAGE 0
.text:>PROG_RAM PAGE 0
.cinit:> PROG_RAM PAGE 0
.bss:> DATA_RAM1 PAGE 1
.stack:>STACK_RAM PAGE 1
}
六、实验结果及体会
实验结果是每次按下按键,亮灭的周期发生了变化,本来是按5次后周期回到最初一样,但有时不用5次,经过老师的解释,中断口通过按键直接连接低电平,有时按一次可能被误判成了几次。

通过这次实验,我更加熟悉了CCS开发环境以及设计运行调试过程,认识到模块的各个工作原理以及三者之间的关系,学会对模块的初始化怎么定义和编写的流程。

使我对DSP产生了浓厚的兴趣,激发了我学习DSP的积极性,从这次实验结果上来说,清晰的结果使我对书本上的知识应用到了实验中,很满足。

最后,感谢老师的耐心指导。

相关文档
最新文档