DSP

TMS320X281x的CPU定时器

2019-07-13 12:53发布

插入的图好像失效了,可以点击原文查看

什么是定时器


定时器是什么其实从字面意思就能理解,它是一种专用类型的时钟,用于测量特定的时间间隔,从而达到准确控制时间的目的,如古时所用的沙漏、水漏,到现在的闹钟等都属于定时器

CPU定时器


TMS320X281x系列DSP最多有三个32位的CPU定时器(TIMER0/1/2),其中CPU-TIMER2是保留给实时操作系统(如DSP-BIOS)使用的,如果应用程序不使用DSP-BIOS,则用户可以使用CPU-TIMER2,CPU-TIMER0/1可用于用户应用程序
CPU定时器的配置和使用是非常简单的,CPU定时器的一般操作如下:32位计数器寄存器TIMH:TIM装入周期寄存器PRDH:PRD中的值。计数器寄存器以28x的SYSCLKOUT速率递减。 当计数器达到0时,定时器中断输出信号产生中断脉冲 Ti官方配置例子如下: #include "DSP281x_Device.h" // Headerfile Include File #include "DSP281x_Examples.h" // Examples Include File struct CPUTIMER_VARS CpuTimer0; // When using DSP BIOS & other RTOS, comment out CPU Timer 2 code. struct CPUTIMER_VARS CpuTimer1; struct CPUTIMER_VARS CpuTimer2; //--------------------------------------------------------------------------- // InitCpuTimers: //--------------------------------------------------------------------------- // This function initializes all three CPU timers to a known state. // void InitCpuTimers(void) { // CPU Timer 0 // Initialize address pointers to respective timer registers: CpuTimer0.RegsAddr = &CpuTimer0Regs; // Initialize timer period to maximum: CpuTimer0Regs.PRD.all = 0xFFFFFFFF; // Initialize pre-scale counter to divide by 1 (SYSCLKOUT): CpuTimer0Regs.TPR.all = 0; CpuTimer0Regs.TPRH.all = 0; // Make sure timer is stopped: CpuTimer0Regs.TCR.bit.TSS = 1; // Reload all counter register with period value: CpuTimer0Regs.TCR.bit.TRB = 1; // Reset interrupt counters: CpuTimer0.InterruptCount = 0; // CpuTimer2 is reserved for DSP BIOS & other RTOS // Do not use this timer if you ever plan on integrating // DSP-BIOS or another realtime OS. // Initialize address pointers to respective timer registers: CpuTimer1.RegsAddr = &CpuTimer1Regs; CpuTimer2.RegsAddr = &CpuTimer2Regs; // Initialize timer period to maximum: CpuTimer1Regs.PRD.all = 0xFFFFFFFF; CpuTimer2Regs.PRD.all = 0xFFFFFFFF; // Make sure timers are stopped: CpuTimer1Regs.TCR.bit.TSS = 1; CpuTimer2Regs.TCR.bit.TSS = 1; // Reload all counter register with period value: CpuTimer1Regs.TCR.bit.TRB = 1; CpuTimer2Regs.TCR.bit.TRB = 1; // Reset interrupt counters: CpuTimer1.InterruptCount = 0; CpuTimer2.InterruptCount = 0; } //--------------------------------------------------------------------------- // ConfigCpuTimer: //--------------------------------------------------------------------------- // This function initializes the selected timer to the period specified // by the "Freq" and "Period" parameters. The "Freq" is entered as "MHz" // and the period in "uSeconds". The timer is held in the stopped state // after configuration. // void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period) { Uint32 temp; // Initialize timer period: Timer->CPUFreqInMHz = Freq; Timer->PeriodInUSec = Period; temp = (long) (Freq * Period); Timer->RegsAddr->PRD.all = temp; // Set pre-scale counter to divide by 1 (SYSCLKOUT): Timer->RegsAddr->TPR.all = 0; Timer->RegsAddr->TPRH.all = 0; // Initialize timer control register: Timer->RegsAddr->TCR.bit.TSS = 1; // 1 = Stop timer, 0 = Start/Restart Timer Timer->RegsAddr->TCR.bit.TRB = 1; // 1 = reload timer Timer->RegsAddr->TCR.bit.SOFT = 1; Timer->RegsAddr->TCR.bit.FREE = 1; // Timer Free Run Timer->RegsAddr->TCR.bit.TIE = 1; // 0 = Disable/ 1 = Enable Timer Interrupt // Reset interrupt counter: Timer->InterruptCount = 0; }

ConfigCpuTimer(&Cputimer0,SYSCLKOUT,Y * 106)配置函数详解


参数的话上述程序中都有详细的介绍不多说,主要是定时时间计算问题;根据配置函数的定义,CPU定时器周期寄存器PRD的值为(Freq * Period = SYSCLKOUT * Y * 106),CPU定时器的分频器TDDRH:TDDR的值为0,故定时器定时计算公式如下
SYSCLKOUT(MHz)                    定时器周期T(s)                 想要定时Y(s)