打印

【求助】关于定时时间

[复制链接]
1242|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sunsundsp|  楼主 | 2013-7-22 09:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
关于CPU定时的问题:了解到定时有一个cpuconfigtimer 函数,但是我看2812自带的一个工程,在cputimers.c中没有看到这个函数。那我想知道此时该如何看定时时间呢。
附上cputimers.c程序。


//###########################################################################
//
// FILE:        DSP281x_CpuTimers.c
//
// TITLE:        DSP281x CPU 32-bit Timers Initialization & Support Functions.
//
// NOTES:   CpuTimer1 and CpuTimer2 are reserved for use with DSP BIOS and
//          other realtime operating systems.  
//
//          Do not use these two timers in your application if you ever plan
//          on integrating DSP-BIOS or another realtime OS.
//
//          For this reason, the code to manipulate these two timers is
//          commented out and not used in these examples.
//           
//###########################################################################
//
//  Ver | dd mmm yyyy | Who  | Description of changes
// =====|=============|======|===============================================
//  1.00| 11 Sep 2003 | L.H  | Changes since previous version (v.58 Alpha)
//      |             |      | Removed some incorrect parameters in the timer
//      |             |      | setup that are not available on this device
//###########################################################################

#include "DSP281x_Device.h"     // DSP281x Headerfile Include File
#define Timer0PRD 0xf930

//struct CPUTIMER_VARS CpuTimer0;

// CpuTimer 1 and CpuTimer2 are reserved for DSP BIOS & other RTOS
//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  = Timer0PRD;
        // Initialize pre-scale counter to divide by 1 (SYSCLKOUT):       
        CpuTimer0Regs.TPR.all  = 0;
        CpuTimer0Regs.TIM.all  = 0;
        CpuTimer0Regs.TPRH.all = 0;
        // Make sure timer is stopped:
        CpuTimer0Regs.TCR.bit.TSS = 1;//确定定时器停止
        CpuTimer0Regs.TCR.bit.SOFT = 1;//当soft=1且free=1时,定时器自由运行
        CpuTimer0Regs.TCR.bit.FREE = 1;
        // Reload all counter register with period value:
        CpuTimer0Regs.TCR.bit.TRB = 1;
        CpuTimer0Regs.TCR.bit.TIE = 1;//1=使能定时器中断
       
// CpuTimer 1 and CpuTimer2 are reserved for DSP BIOS & other RTOS
// Do not use these two timers if you ever plan on integrating
// DSP-BIOS or another realtime OS.
//
// For this reason, the code to manipulate these two timers is
// commented out and not used in these examples.

    // 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;

}       
//===========================================================================
// No more.
//===========================================================================

相关帖子

沙发
zhangmangui| | 2013-7-22 19:29 | 只看该作者
最关键的一个带参数确定时间的函数没看到啊

使用特权

评论回复
板凳
zhangmangui| | 2013-7-22 19:31 | 只看该作者
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.POL = 0;      // 0 = Pulse Low
        Timer->RegsAddr->TCR.bit.TOG =        0;     // 0 = No Toggle, POL bit defines action
        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.FRCEN = 0;    // Force output enable (not used)
        Timer->RegsAddr->TCR.bit.PWIDTH = 7;   // 7+1 = 8 SYSCLKOUT cycle pulse width
        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;
}

使用特权

评论回复
地板
sunsundsp|  楼主 | 2013-7-23 08:45 | 只看该作者
zhangmangui 发表于 2013-7-22 19:31
void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period)
{
        Uint32         temp;

是的,就是不知道为什么缺少了这个配置函数。但是他也正常定时了。我对比了一下这个程序和其他CPUtimer.c函数的区别。他有先对周期寄存器赋值 define Timer0PRD 0xf930

使用特权

评论回复
5
zhangmangui| | 2013-7-23 09:12 | 只看该作者
sunsundsp 发表于 2013-7-23 08:45
是的,就是不知道为什么缺少了这个配置函数。但是他也正常定时了。我对比了一下这个程序和其他CPUtimer.c ...

哦  那也可以  只要赋值了是正常的   你在根据周期计算一下时间

使用特权

评论回复
6
sunsundsp|  楼主 | 2013-7-23 10:33 | 只看该作者
zhangmangui 发表于 2013-7-23 09:12
哦  那也可以  只要赋值了是正常的   你在根据周期计算一下时间

不会,可以告诉一下怎么算吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

122

帖子

2

粉丝