《定时器及硬件中断(C55xDSP).ppt》由会员分享,可在线阅读,更多相关《定时器及硬件中断(C55xDSP).ppt(37页珍藏版)》请在三一办公上搜索。
1、第4章 定时器及硬件中断,4.1 定时器硬件结构原理4.2 定时器及硬件中断实验,TMS320VC5509 DSP有两个独立的20 bit软件可编程通用减数计数定时器,它们可用于向CPU提供周期性的中断信号,或给DMA控制器发送周期同步事件,也可以用于给外部设备提供周期信号,还可以用于外部事件计数。20 bit的通用定时器是减数计数器,它由两部分组成:4位预分频计数器(PSC)和16位主计数器(TIM)。定时器结构框图如图4-1所示。,4.1 定时器硬件结构原理,图4-1 TMS320 C5509 DSP通用定时器结构框图,预分频计数器PSC由时钟驱动,这个时钟可以是内部CPU时钟或外部时钟(
2、当FUNC=11b时使用外部时钟,从TIN/TOUT引脚输入,当FUNC为其他值时使用内部CPU时钟)。每输入一个时钟,PSC减1。,每当PSC减到0,主计数器TIM减1,每当TIM减到0,定时器给CPU发出一个中断请求TINT,同时又发送一个同步事件TEVT给DMA控制器,还可以产生一个输出到定时器引脚(如果FUNC=01b)。定时器输出速率为,式中4,预分频寄存器PRSC由预分频周期寄存器TDDR和预分频器PSC两部分组成,当定时器设定为自动装载模式时(ARB=1),预分频器PSC减到0,并再有一个输入时钟输入时,预分频器PSC从预分频周期寄存器TDDR重新装载数据。,周期寄存器PRD和计
3、数器TIM都为16位寄存器。若定时器设定为自动装载模式(ARB=1),当计数器TIM减到0时,就会从PRD重新装载数据。定时器控制寄存器TCR如图4-2所示,使用它的特定位可以实现对定时器进行配置、启动、停止、装载和重新装载等,表4-1是对定时器控制寄存器TCR的每位进行说明。,图4-2 定时器控制寄存器TCR,表4-1 定时器控制寄存器TCR说明,定时器引脚功能模式合法转换如图4-3所示,FUNC位的某些改变会产生一个错误并反映在ERRTIM位,例如:从FUNC=01b转换到FUNC=00b或11b;从FUNC=10b转换到FUNC=00b或11b,以及从FUNC=11b转换到任意值,这几种
4、情况都会产生一个错误,使ERRTIM位置1。当ERRTIM=1时,复位DSP并重新初始化定时器。更多信息请参阅参考文献45。,图4-3 引脚功能模式合法转换图,定时器初始化步骤如下:(1)停止定时器(TSS=1),定时器装载使能(TLB=1),定时器控制寄存器TCR的其他位设置成对应数值。(2)装载预分频计数周期寄存器PRSC。(3)装载主周期寄存器PRD。(4)关闭定时器装载(TLB=0),启动定时器(TSS=0)。,4.2.1 实验目的了解C55x DSP定时器结构。学习C5509定时器初始化。了解C55x DSP中断。学习中断处理。,4.2 定时器及硬件中断实验,4.2.2 实验设备PC
5、兼容机一台;操作系统为Windows 2000(或WindowsNT 4.0、Windows 98、Windows XP);计算机已经安装CCS v3.1集成环境软件。DSP仿真器ICETEK-5100USB V2.0A一个;DSP目标板ICETEK-VC5509-A一块。,4.2.3 实验要求使用CCS集成仿真环境,完成建立工程、源文件、命令文件,保存和添加文件到工程,进行编译、链接、运行和调试等操作。使用观察窗口观察寄存器和存储器空间的内容等。,4.2.4 实验步骤1.实验准备参照第2章(若使用的仿真器不同,请参照其他相关资料)对CCS硬件仿真进行设置;在断电情况下将仿真器和目标板相连,再
6、将仿真器和计算机相连,给目标板接通电源,启动CCS。,2.新建立工程新建工程文件、两个汇编源文件和一个命令文件(文件名请读者自己命名),在其中一个汇编源文件中输入本章小节程序清单参考中的定时器汇编源程序,在另一个汇编源文件中输入第2章中小节中的SDRAM初始化程序,在命令文件中输入本章小节命令文件的内容。保存之后把这些文件添加到工程。,3.编译工程在编译和链接工程文件过程中,如果有错误则先修改错误,直到无错误提示为止。编译成功后,装载可执行的输出文件。详细情况请参见第1章小节。4.观察定时器寄存器窗口(1)打开CPU寄存器视窗,再打开定时器寄存器视窗,如图4-4所示。,图4-4 定时器寄存器观
7、察窗口,(2)单步运行程序,观察CPU寄存器和定时器寄存器变化。(3)在定时器中断服务程序处设置断点,在主菜单中选择ProjectAnimate或按图标动画运行程序。,4.2.5 参考程序清单1.定时器汇编源程序.mmregs.def _c_int00.ref sdram_init;引用外部变量,SDRAM初始化子程序入口led.set 400001h;led数据地址 tim0.set 0 x1000;定时器寄存器TIM0,prd0.set 0 x1001;定时器周期寄存器PRD0tcr0.set 0 x1002;定时器控制寄存器TCR0prsc0.set 0 x1003;定时器预定标寄存器s
8、ysr.set 0 x07fdclkmd.set 0 x1c00;时钟模块寄存器地址pdp_timer0.set tim0/128STACK.usect.stack,200hSYSSTACK.usect.sysstack,200h.data,led_i.word 1,2,4,8,4,2.sect“.vectors”rsv:;reset vector b _c_int00;branch to C entry point NOP.align 8nmi:.loop 8nop.endloop,int0:.loop 8nop.endloopint2:.loop 8nop.endlooptint0:b_T
9、imer0nop.align 8.text,c_int00:amov#0,xdpamov#STACK+200h,xspamov#SYSSTACK+200h,xssp;init interupt(中断初始化)bset intm;禁止全局中断mov#1,ivpd;初始化DSP中断矢量指针ivpd=1mov#1,ivph;初始化DSP中断矢量指针ivph=1,mov#10h,ier0;初始化中断屏蔽寄存器ier0,tint0=1mov#10h,dbier0;调试中断使能寄存器dbier0=10hmov#0,ier1;清中断使能寄存器ier0mov#0ffffh,ifr0;清中断标志寄存器ifr0mo
10、v#0ffffh,ifr1;清中断标志寄存器ifr1call sdram_init;调用初始化SDRAM子程序,;定时器初始化 mov#pdp_timer0,pdp;置外围I/O数据页指针 mov#04f0h,port(tcr0);*tcr0=0 x04f0 mov#0h,port(tim0);*tim0=0 mov#0ffffh,port(prd0);*prd0=0 x0ffff mov#15h,port(prsc0);*prsc0=0 x15=21,mov#0e0h,port(tcr0);*tcr0=0 x00e0bclr intm;全局中断使能bset AR3LC;置位AR3LC,AR3
11、循环寻址amov#led,xar2;xar2指向ledmov#6,bk03;循环寻址长度为6amov#led_i,xar3;初始化xar3mov#led_i,bsa23;初始化bsa23,循环寻址首地址为led_i,mov#0,ar3;清ar3loop:NOPb loop;等待中断_Timer0:mov*ar3+,*ar2;定时器Timer0中 断服务程序 reti;中断返回.end,2.命令文件-stack 200h-sysstack 200hMEMORY PAGE 0:,MMR:origin=0000000h,length=00000c0h SPRAM:origin=00000c0h,le
12、ngth=0000040hVECS:origin=0000100h,length=0000100hDARAM0:origin=0000200h,length=0001E00hDARAM1:origin=0002000h,length=0002000hDARAM2:origin=0004000h,length=0002000hDARAM3:origin=0006000h,length=0002000h,SECTIONS.vectors:VECS PAGE 0.bss:DARAM0 PAGE 0.stack:DARAM1 PAGE 0.sysstack:DARAM1 PAGE 0.text:DARAM2 PAGE 0.data:DARAM3 PAGE 0,