实验3TMS320C55x定时器的汇编LED实现.docx
《实验3TMS320C55x定时器的汇编LED实现.docx》由会员分享,可在线阅读,更多相关《实验3TMS320C55x定时器的汇编LED实现.docx(15页珍藏版)》请在冰豆网上搜索。
实验3TMS320C55x定时器的汇编LED实现
实验3TMS320C55x定时器的汇编LED灯实现
一、实验目的
1.通过实验熟悉TMS320VC5509A的定时器;
2.掌握VC5509A定时器的使用方法;
3.掌握VC5509A的中断结构和对中断的处理流程;
4.学会在汇编条件下编写中断程序,以及运用中断控制程序 流程。
二、实验设备
计算机,ICETEK-VC5509-A实验箱(或ICETEK 仿真器+ICETEK–VC5509-A评估板+相关连线及电源)。
三、实验内容
1.VC5509A的初始设置,包括堆栈设置和时钟设置;
2.VC5509A中断向量表的建立;
3.定时器中断服务程序的编写。
四、实验原理
为了实现定时器的正确定时,首先需要设置VC5509A的时钟,以下分别说明“时钟”、“中断”和“定时器”3个部分的原理。
4.1时钟部分
VC5509A芯片内的时钟发生器从CLKIN引脚接受输入时钟信号,将其变换为CPU及其外设所需要的工作时钟;工作时钟经过分频通过引脚CLKOUT输出,可供其他器件使用。
时钟发生器内有一个数字锁相环DPLL和一个时钟模式寄存器CLKMD。
VC5509A的时钟发生器有3种工作模式,即旁路模式、锁定模式和Idle模式。
时钟模式寄存器(CLKMD)中的PLLENABLE为控制旁路模式和锁定模式。
可以通过关闭CLKGENIdle模块使时钟发生器工作在Idle模式。
在本实验中设置时钟工作在锁定模式。
设置PLLENABLE=1,PLL工作于锁定模式,则输出的时钟频率由下式确定,即
(1)
图 1 锁定模式用到的CLKMD位(参考TMS320C55xDSP PeripheralsReferenceGuide.pdf)
VC5509A系统的晶振时钟振荡频率为12MHz。
通过设置DPLL,使系统时钟的时钟频率为144MHz。
由图1知具体设置如下:
(1)PLL ENABLE=1b
(2)由公式
(1),得
ﻩ取PLLDIV=0,PLLMULT=12,即:
D6D5(PLLDIV)=00b,D11-D7(PLL MULT)=1100b
(3)CLKMD取值为:
001011000010011b。
汇编语言实现:
MOV#001011000010011b,port(#CLKMD)
注:
CLKMD .set 1C00H(CLKMD的地址为1C00H)
4.2中断部分
中断是由硬件或软件驱动的信号,使DSP将当前的程序挂起,执行另一个称为终端服务子程序(ISR)的任务。
VC5509A支持32个ISR。
图2为VC5509A的中断向量表。
图2 VC5509A的中断向量表
参考TMS320VC5509AFixed-PointDigital SignalProcessor(Rev.K).pdf
中断向量的初始化可由.ivec命令完成。
具体参考图3。
图3 .ivec命令ﻫ参考TMS320C55xAssemblyLanguageToolsUser's Guide(Rev.H).pdf
由图2和图3编写汇编文件vectors.asm:
.sect ".vectors"
ﻩﻩ.refﻩstart,tint0_isr
rsvﻩﻩ.ivecﻩstart,use_reta
nmi.ivecﻩno_isr
int0.ivecﻩno_isr
int2.ivecno_isr
tint0ﻩ.ivecﻩtint0_isr
rint0.ivecﻩno_isr
rint1.ivecﻩno_isr
xint1.ivecno_isr
usb.ivecﻩno_isr
dmac1ﻩ.ivecﻩno_isr
dspint.ivecno_isr
int3ﻩ.ivecno_isr
rint2ﻩ.ivecﻩno_isr
xint2.ivecﻩno_isr
dmac4ﻩ.ivecﻩno_isr
dmac5ﻩ.ivecno_isr
int1ﻩ.ivecﻩno_isr
xint0ﻩ.ivecﻩno_isr
dmac0.ivecﻩno_isr
int4ﻩ.ivecno_isr
dmac2.ivecﻩno_isr
dmac3ﻩ.ivecﻩno_isr
tint1.ivecﻩno_isr
iic.ivecno_isr
berr.ivecﻩno_isr
dlogﻩ.ivecno_isr
rtos.ivecﻩno_isr
sint27ﻩ.ivecﻩno_isr
sint28ﻩ.ivecﻩno_isr
sint29ﻩ.ivecno_isr
sint30ﻩ.ivecﻩno_isr
sint31.ivecno_isr
.text
.defno_isr
no_isr:
b#no_isrﻩ
本实验捡回用到定时器0,其中断服务程序(tint0_isr)如下:
tint0_isr:
ﻩnop
ﻩnop
ﻩ
ADD#1,AR2
ﻩBCC L2,AR2!
=#100
;ﻩMOV *(#LBDS),AR2
;ﻩ XOR#1,AR2
ﻩ AMAR*(#LBDS),XAR3
ﻩXOR#1,*AR3
ﻩﻩnop
ﻩnop
;ﻩMOVAR3,*(#LBDS)
ﻩMOV#0,AR2
L2:
ﻩﻩ
ﻩnop
ﻩﻩnop
ﻩnop
ﻩnop
ﻩnop
nop
ﻩﻩRETI
由以下语句设置中断向量的地址。
ﻩMOV#00d0h,mmap(IVPH)
ﻩMOV #00d0h,mmap(IVPD) ﻩ
ﻩﻩMOV #0010h,mmap(IER0)
MOV #0xffff,mmap(IFR0)
ﻩﻩMOV #0010h,mmap(DBIER0)
4.3定时器0部分
VC5509A芯片内提供了2个20位通用定时器,可向CPU产生周期性中断或向DSP芯片外的器件提供周期信号。
每个定时器由2部分组成:
一个4位的预定标计数寄存器(PSC)和一个16位主计数器(TIM),如图4。
图4定时器结构框图
TMS320VC5503/5507/5509/5510 DSPTimersReferenceGuide.pdf
ﻩ定时器发送中断信号或同步时间的频率信号的频率可用下式计算
(2)
汇编语言实现:
ﻩMOV#0x04f0,PORT(#TCR0)
MOV#0x0000,PORT(#TIM0)
MOV#0x1fff,PORT(#PRD0)
MOV#0x000f,PORT(#PRSC0)
MOV #0x00e0,PORT(#TCR0)
4.4 程序清单
程序主要由3个文件工程:
4.4.1vectors.asm中断向量表
ﻩﻩﻩ.sect".vectors"
ﻩﻩ.refstart,tint0_isr
rsvﻩ.ivecstart,use_reta
nmi .ivecﻩno_isr
int0ﻩ.ivecno_isr
int2ﻩ.ivecﻩno_isr
tint0.ivectint0_isr
rint0.ivecno_isr
rint1.ivecno_isr
xint1.ivecﻩno_isr
usbﻩﻩ.ivecﻩno_isr
dmac1.ivecno_isr
dspintﻩ.ivecﻩno_isr
int3ﻩ.ivecﻩno_isr
rint2.ivecno_isr
xint2.ivecno_isr
dmac4ﻩ.ivecno_isr
dmac5ﻩ.ivecﻩno_isr
int1.ivecno_isr
xint0.ivecﻩno_isr
dmac0.ivecﻩno_isr
int4ﻩ.ivecﻩno_isr
dmac2ﻩ.ivecno_isr
dmac3ﻩ.ivecno_isr
tint1.ivecno_isr
iic.ivecﻩno_isr
berr.ivecﻩno_isr
dlog.ivecﻩno_isr
rtos.ivecﻩno_isr
sint27.ivecno_isr
sint28ﻩ.ivecﻩno_isr
sint29ﻩ.ivecﻩno_isr
sint30ﻩ.ivecno_isr
sint31ﻩ.ivecno_isr
.text
.defno_isr
no_isr:
b#no_isr
4.4.2timer.asm主程序
ﻩﻩ.mmregs
ﻩ.data
stack_len.setﻩ 200
sysstack_len.setﻩ 200
stackﻩﻩﻩ.usectﻩ".stack",stack_len
sysstackﻩ.usect".sysstack",sysstack_len
TIM0ﻩ.setﻩ0x1000
PRD0.set0x1001
TCR0ﻩ.set0x1002
PRSC0.setﻩ0x1003
CLKMD .set0x1C00
LBDSﻩ.set0x400001
ﻩ.text
ﻩ.defstart,tint0_isr
start:
ﻩBSETARMS
ﻩﻩ.arms_on
ﻩBCLRC54CM
ﻩ.c54cm_off
ﻩBCLRAR0LC
BCLRAR1LC
BCLRAR2LC
ﻩBCLRAR3LC
ﻩﻩBSET INTM
ﻩAMOV #(stack+stack_len),xsp
AMOV#(sysstack+sysstack_len),xssp
ﻩMOV#001011000010011b,port(#CLKMD)
ﻩﻩ
;ﻩAMAR*(#400001h),XAR3
ﻩMOVﻩ#1,*(#LBDS)
ﻩﻩMOV #0,AR2
ﻩ
ﻩMOV#00d0h,mmap(IVPH)
MOV #00d0h,mmap(IVPD) ﻩ
ﻩMOV#0010h,mmap(IER0)
ﻩMOV#0xffff,mmap(IFR0)
ﻩMOV#0010h,mmap(DBIER0)
ﻩMOV #0x04f0,PORT(#TCR0)
MOV#0x0000,PORT(#TIM0)
MOV#0x1fff,PORT(#PRD0)
MOV#0x000f,PORT(#PRSC0)
MOV#0x00e0,PORT(#TCR0)
ﻩBCLRINTM
L1:
ﻩnop
nop
ﻩnop
nop
BL1
tint0_isr:
ﻩnop
ﻩnop
ADD#1,AR2
BCCL2,AR2!
=#100
;ﻩ MOV*(#LBDS),AR2
;XOR#1,AR2
ﻩAMAR *(#LBDS),XAR3
XOR#1,*AR3
ﻩnop
ﻩnop
;ﻩﻩMOVAR3,*(#LBDS)
ﻩMOV #0,AR2
L2:
ﻩ
ﻩﻩnop
ﻩnop
nop
ﻩnop
nop
ﻩnop
RETI
ﻩﻩ.end
4.4.3 .cmd链接命令文件
-stack200
-sysstack200
-lrts55x.lib
-estart
MEMORY
{
DARAM:
ﻩo=0x100,ﻩl=0x07f00
VECT:
o=0x0d000,ﻩl=0x100
DARAM2:
o=0x0d100,ﻩl=0x1f00
SARAM:
o=0x10000,ﻩl=0x30000
SDRAM:
o=0x40000,l=0x3e0000
}
SECTIONS
{
ﻩ.data:
{}>SARAM
.text:
{} >DARAM
.vectors:
{} >VECT
.sysstack:
{}>DARAM
.stack:
{}>DARAM
}
实验程序流程图如下:
五、实验步骤ﻩ
(1) 在CCS下建立工程“timer”,分别将上述三个文件加入工程
(2) 连接试验箱,运行程序,可见,试验箱的最下面一个LED灯1周期性的闪烁。
如图5
图 5 实验现象
六、实验心得
●在对程序编译时,总出现“Remarks”错误,这是CCS中最轻级别的提示,不影响程序的正常运行。
●在汇编语言中写入.mmregs语句后,就可以省去对存储器映射寄存器的定义,而且在TI的文档中也有寄存器名和对应地址的表,用的时候直接用即可。
●汇编指令不能直接顶头写,需要与行首有一定间隔。