基于DSP的定时中断

本文以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)相连接

然后,编写中断服务程序,

interrupt void extint14_isr(void)
{
/*
         进入中断后要执行的操作
*/
}

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值