本文以TMS320DM6437定时器为例,TMS320DM6437有3个64位软件可编程定时器,分别是定时器0(Timer 0)、定时器1(Timer 1)和定时器2(Timer 2)。
由上表可知,定时器可由内部时钟或外部时钟驱动。
当定时器由外部时钟驱动时,可以选择Timer0输入的外部时钟源TIN是否÷6。
下图是定时器中断对应的中断号事件。
在这里要重要讲述一下TCR寄存器、TGCR寄存器,TCR(定时器控制寄存器)如下图
0位:定时器状态位。 只读位,显示计时器输出的值,TSTAT是驱动计时器输出引脚,可以通过设置INVOUTP=1来反相。
TSTAT=0;计时器输出低。
TSTAT=1;计时器输出高。
1位:定时器输出逆变控制
INVOUTP=0;定时器输出不反相,
INVOUTP=1;定时器输出反相。
2位:定时器输入逆变控制,只有当CLKSRC12(8位)=1时,此模式才会受到影响,
INVINP=0;非反相输入驱动定时器
INVINP=1;反相输入驱动定时器。
3位:脉冲/时钟模式选择(选择输出模式) 时钟/脉冲模式位用于计时器输出。在看门狗定时器模式(TGCR中TIMMODE=2h)中,脉冲模式是自动选择的,CP位是不关心的。
CP=0;脉冲模式。当计时器计数器到达定时器周期时,定时器输出以脉冲的形式出现,宽度由PWID位和INVOUTP位定义的极性决定。
CP=1;时钟模式。定时器输出信号具有50%的占空比信号。当定时器达到定时器周期时,定时器输出信号的电平被切换(从高到低或从低到高)。
4、5位:脉冲模式下的脉宽选择,脉宽位PWID只用于脉冲模式(CP=0),PWID控制定时器输出信号的宽度,脉冲的极性由INVOUTP位控制。定时器输出信号记录在TSTAT位中,并可在定时器输出引脚上显示。
PWID=0;脉冲宽度为1个定时器时钟周期。
PWID=1;脉冲宽度为2个定时器时钟周期。
PWID=2;脉冲宽度为3个定时器时钟周期。
PWID=3;脉冲宽度为4个定时器时钟周期。
8位:定时器时钟源,CLKSRC12=0,选择内部时钟; CLKSRC12=1,选择外部时钟,TIN0、TIN1分别为定时器0和定时器1的外部时钟输入。
6、7、22、23位:控制定时器是否被禁用、一次运行还是连续运行(输入脉冲使能)
ENAMODE=0:禁用模式,定时器停止运行并保持当前计数值
ENAMODE=1:一次运行模式,当定时器的计数器值等于周期寄存器的值时,计数停止
ENAMODE=2:连续操作模式,当定时器的计数器值等于周期寄存器的值时,计数器清0并重新开始计数
ENAMODE=3或4:只适用于双32位无链模式。
上图是TCGR寄存器(定时器全局控制寄存器)
0位:控制定时器1:2是否复位
TIM12RS=1;定时器1:2移除复位状态
1位:控制定时器3:4是否复位
2、3位:选择定时器工作模式,定时器有四种工作模式:
TIMMODE=0; 64位通用(GP)定时器模式----------Timer 0、Timer 1
TIMMODE=1; 双32位无链接模式(独立操作)----Timer 0、Timer 1
TIMMODE=2; 64位看门狗定时器(Watchdog Timer)-- Timer 2
TIMMODE=3; 双32位链接模式(相互配合操作)--Timer 0、Timer 1
GP计数器模式:可用于生成周期性中断事件或EDMA同步事件。 看门狗计数器模式:用于在发生故障情况下为设备提供恢复机制,其超时会导致设备全局重置。
8-11位:控制无链模式下定时器3:4预定标的计数周期。
12-15位:控制无链模式下定时器3:4预定标的计数。
定时器周期寄存器(PRD)
如定时0.15ms,使用内部时钟27Mhz,可计算出定时周期为4049,即PRD12=FD1h;
定时时间
其次,计数寄存器(TIM12和TIM34):构成64位定时计数器
TIMER0_TIM12 = 0x00000000; 定时器初值设为0
最后,定时器控制寄存器(TIMERCTL):为Timer0和Timer2提供额外的控制
定时器2控制:WDRST位确定看门狗计时器事件(定时器2)是否会导致设备最大复位
定时器0控制:TINP0SEL位选择连接到Timer0的TIN输入的时钟源。
TINP0SEL=1;Timer0输入的外部时钟源TIN÷6
介绍完寄存器,接下来看程序:
首先,定时器中断事件初始化
CSR=0x00; //禁止全局中断
IER=0x03;; //禁止所有中断
ICR=0xffff; //清除所有中断标志位
ISTP=0x10800400; //记录中断向量表的首地址
TIMER0_TIM12 = 0x00000000; //计数初值为0
TIMER0_PRD12 = 0x00000FD1; //计数周期为4049
TIMER0_TGCR &= 0x00000005;//双32位无链模式,输入不反相
TIMER0_TCR &= 0x00000080;//内部时钟,脉冲模式,连续模式,输出不反相
IER|=0x00004000; //使能第14个中断
CSR=0x01 ; //开启全局中断
INTC_INTMUX3=0x00040000; //定时0事件(EVT4)与中断14(INT14)相连接
然后,编写中断服务程序,