基本上每一种器件都有定时器,C6000也不例外,因为TI拥有自带的库文件,因此在操作这个器件的时候更多的是调用库文件来实现。虽说的调用库文件,但是在寄存器的设置方面还是需要做一定的了解,主要目的是让他能听话的为我们服务。
C6000的定时器可以做一下五件事情:事件计时,事件计数,产生脉冲,中断CPU和发送同步指令给DMA。
定时器有两种信号模式,时钟模式和脉冲模式。可以使用内部的时钟,也可以使用外部的。使用内部的是计时,我使用的器件,定时器的时钟源频率是1/4CPU频率。使用外部时钟是计数,数来了几个脉冲。也可行通过时钟输出管脚,向外面输出脉冲信号。无论是事件计时,还是事件计数,亦或是产生脉冲,最主要的目的是告诉CPU到什么时候要干一件什么事情,所以会产生CPU中断。如果只是做数据的搬移,那只用发指令给DMA部分,不去打断CPU的流水线工作。
定时器模块如图所示:
我在项目中需要使用到的功能是,定时1s的时间长度,然后向CPU发去中断,通知CPU该干什么事情了。
定时器控制寄存器:CTL
TSTAT:定时器的状态 INVINP:TINP的转换控制位
CLKSRC:定时器输入时钟源 CP:时钟/脉冲模式
HLD:保持,计数器可以读或者写不用考虑HLD的值
GO:GO位,重置计数器并且启动计数器 PWID:脉冲宽度
DATIN:数据进入 DATOUT:数据输出
INVOUT:TOUT翻转控制 FUNC:TOUT管脚控制
定时器周期寄存器:PRD
记录定时器输入时钟的技术周期值,控制着TSTAT的频率。32b位计数器。
定时器计数寄存器:CNT
在能够计数的时候开始,在达到定时器周期寄存器中的值之后,在下一个CPU时钟将其重置为0。32位计数器。
定时器的复位是GO位,是否工作的使能位依靠HLD来控制。设置一个定时器有4个步骤:
1、如果定时器当前没有在锁存状态,则设置定时器为锁存状态HLD=0。重置系统后,定时器已经为锁存状态。
2、在定时器周期寄存器PRD中写入期望值。
3、在定时器控制寄存器CTL中写入期望值,在一步不改变GO和HLD的值。
4、将CTL中的GO和HLD置位为1,以启动定时器。
我使用的DSP主频为200MHz,使用内部时钟源,为主频的1/4,因此为50MHz,如果我要定时1s,则定时周期PRD=5*10^7=0x2FAF080。
寄存器中的边界情况
边界情况会影响到定时器的运行,因此在程序控制中应该注意,了解这些情况出现的原因,看是需要规避还是更好的利用。
定时器的周期寄存器和计数寄存器的值为0:在设备复位后、定时器开始计数前,TSTAT保持为0。在定时器开始运行之后,定时器的运行依赖CP模式选择:脉冲模式下,TSTAT=1;时钟模式下,当定时器被锁住(HLD=0),TSTAT保持当前值,HLD=1时,TSTAT被1/2的CPU频率控制。
计数溢出:当定时计数寄存器CNT被设置的值,大于定时器周期寄存器PRD的FFFF FFFF时,就会溢出,并转换为0,继续计数。但是这里有一个疑问,CNT是32位的寄存器,怎么会设置的比FFFF FFFF还大呢?
向一个正在运行的定时器的寄存器写数据:如果是对CNT写数据,CNT寄存器的值会被跟新。如果是写CTL,CTL的状态也会被跟新。
脉冲模式下的小定时周期:当PERIOD小于等于PWID+1时,会导致TSTAT保持高电平。
TSTAT信号直接控制着CPU的中断,中断频率和TSTAT一样。
|