lindabell 发表于 2011-1-2 08:57:18

dsp2812 定时器的使用问题

小弟刚学DSP,弄定时器时有些问题希望各位给解释一下;谢谢啦
注释有很多问号的是我不明白的。
代码:
#include "DSP281x_Device.h"   // DSP281x Headerfile Include File
#include "DSP281x_Examples.h"   // DSP281x Examples Include File

// Prototype statements for functions found within this file.
interrupt void cpu_timer0_isr(void);

#define LEDS *(int *)0xc0000//定义LED接口


int i=0,nCount;
unsigned int uLBD;

void main(void)
{   
       

   InitSysCtrl();//初始化cpu

   DINT;//关中断

   InitPieCtrl();//初始化pie寄存器
   

   IER = 0x0000;//禁止所有的中断
   IFR = 0x0000;//中断标志清零


   InitPieVectTable();//初始化pie中断向量表


   EALLOW;// This is needed to write to EALLOW protected registers
   PieVectTable.TINT0 = &cpu_timer0_isr;//指定中断服务子程序
   EDIS;    // This is needed to disable write to EALLOW protected registers

           CpuTimer0.RegsAddr = &CpuTimer0Regs;//?????????????????????
        // Initialize timer period to maximum:       
        CpuTimer0Regs.PRD.all= 0xffff;
        CpuTimer0Regs.TPRH.all = 0;
        // Initialize pre-scale counter to divide by 1 (SYSCLKOUT):       
        CpuTimer0Regs.TPR.all= 0;

        CpuTimer0Regs.TIM.all= 0;
       
        // Make sure timer is stopped:
        CpuTimer0Regs.TCR.bit.TSS = 1;//停止定时器
        CpuTimer0Regs.TCR.bit.FREE = 1;//FREE : SOFT=1 : 1 定时器自由运行
        CpuTimer0Regs.TCR.bit.SOFT = 1;
       
        // Reload all counter register with period value:
        CpuTimer0Regs.TCR.bit.TRB = 1;//TIMH:TIM寄存器重新装载PRDH:PRD中的周期值
        CpuTimer0Regs.TCR.bit.TIE = 1;//定时器中断使能
        // Reset interrupt counters:
        CpuTimer0.InterruptCount = 0;//????????????????????????????                


   StartCpuTimer0();//启动定时器0

// Enable CPU INT1 which is connected to CPU-Timer 0:
   IER |= M_INT1;//使能中断组1

// Enable TINT0 in the PIE: Group 1 interrupt 7
   PieCtrlRegs.PIEIER1.bit.INTx7 = 1; //在PIE中使能Timer0中断

// Enable global Interrupts and higher priority real-time debug events:
   EINT;   // Enable Global interrupt INTM 使能全局中断
   ERTM;   // Enable Global realtime interrupt DBGM
   while ( 1 )
        {
               
        }

}


interrupt void cpu_timer0_isr(void)
{

   // Acknowledge this interrupt to receive more interrupts from group 1
   PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //?????????????????????????????????
   CpuTimer0Regs.TCR.bit.TIF = 1;//写1清除该标志位
   CpuTimer0Regs.TCR.bit.TRB = 1;//TIMH:TIM寄存器重新装载PRDH:PRD中的周期值
   if ( nCount==0 )
   {
                LEDS=uLBD;
                uLBD++;
                uLBD%=16;
   }
   nCount++;
    nCount%=194;

}


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

补充:是怎样计算出定时时间的??

tiancaigao7 发表于 2011-1-2 10:07:07

TIMH:TIM寄存器重新装载PRDH:PRD中的周期值。这句话定义了DSC中定时器的周期,你又知道了你的定时器的时钟频率,应该是系统时钟的1分频,你用周期寄存器的数值除以时钟频率就是你的定时器的定时周期。

lindabell 发表于 2011-1-2 11:20:56

回复【1楼】tiancaigao7天才杨威利
-----------------------------------------------------------------------

周期寄存器的值=SYSCLKOUT*要定时的时间(us);
页: [1]
查看完整版本: dsp2812 定时器的使用问题