原创 2407的定时器测试

2009-7-3 15:32 3179 3 3 分类: MCU/ 嵌入式
1 基于2407的定时器测试程序
/*  往WDKEY连续写0x5555和0xAAAA即可禁止2407内置的看门狗 */
void KickDog()                                    /*  踢除看门狗 */
{
        WDKEY = 0x5555;
        WDKEY = 0xAAAA;
}
void EVAInit()
{
        EVAIMRA = 0x0080;                        /*  定时器1周期中断使能 */
        EVAIFRA = 0xFFFF;                        /*  清除中断标志 */
        GPTCONA = 0x0000;
        T1PR = 0x1f40;                        /*  定时器1的初值,定时16us */
        T1CNT = 0x0000;             /*  定时器的计数初值 */
        T1CON = 0x164C;                            /*  连续增计数模式,128分频,16M/128=0.125M*/       
}

void DSPInit()
{   
        asm(" SETC        INTM ");        /* 关闭总中断 */
        asm(" CLRC  SXM  ");        /* 禁止符号位扩展 */
        asm(" CLRC  CNF  ");    /* B0块映射为 on-chip SDRAM*/
        asm(" CLRC  OVM  ");    /* 累加器结果正常溢出*/
        SCSR1 = 0x06D4;    /* 打开ADC,EVA,CAN和SCI的时钟,系统时钟CLKOUT=16M */
        WDCR = 0x006F;                        /* 禁止看门狗,看门狗时钟64分频 */
        KickDog();                            /* 剔除看门狗 */
    IFR = 0xFFFF;                        /* 清除中断标志 */             
    IMR = 0x0003;                    /* 打开中断级1,2 */
}

main()                 
{        
      DSPInit();
      EVAInit();                                /* 定时器初始化*/
      MCRC = MCRC&0x0000;                        
          asm(" NOP ");
      PFDATDIR = PFDATDIR|0x2000;
          asm(" NOP ");
          PFDATDIR = PFDATDIR&0xFFDF;   
           
      asm(" CLRC INTM ");
          while(1);
}

void c_int2()
{
        if(PIVR!=0x27)
        {       
                asm(" CLRC INTM ");
                return;
        }
               
        //T1CNT = 0;                /*删掉这一句可以使定时器准确*/
       
        PFDATDIR="PFDATDIR"^0x0020; /******* 发送指示灯极性反转 ***********/
        EVAIFRA = 0xFFFF;
    asm(" CLRC INTM ");
}   

2 测试结果
以上程序是使DSP每16us进入一次中断,然后使LED亮灭交替,故灯的闪烁周期为2*16us=32us。定时器不能采用太高的频率,否则会使示波器观察到的波形失真严重。
用示波器进行测量,可以发现,如果在DSP程序进入中断后对T1CNT清零,会使LED处的方波频率变为22.99kHz,即周期为43.497us;而取消对T1CNT清零,会使LED处的方波频率变为31.01kHz~31.25kHz,即31.25us~32us,很接近预计值。
对两次测量周期进行对比,可以看到相差为43.497us-31.25us=12.247us。折合成DSP的时钟数,为12.247us*16MHz=192。
3 误差分析
在汇编窗口中观察定进器中断程序,可以看到如下代码:
c_int2
CALL        I$$SAVE,*
SAR        AR1,*
LAR        AR0,#1h
LAR        AR0,*0+
LDP        #e0h
LACC        1eh
SUB        #27h
BCND        L18,EQ
CLRC        INTM
B                EPIO_8,*
L18:
LACL        #0h
LDP        #e8h
SACL        1h

……
……

I$$SAVE:
MAR        *,AR1
ADRK        #1h
SST                #1,*+
SST                #0,*+
SACH        *+,0
SACL        *+,0
CLRC        OVM
SPM
SPH        *+
SPL                *+
SAR        AR0, *+
SAR        AR2, *+
SAR        AR3, *+
SAR        AR4, *+
SAR        AR5, *+
SAR        AR6, *+
SAR        AR7, *+
POPD        *
LACC        *,0
RPT        #6h
POPD        *+
BACC
从以上的汇编代码,可以大致看到那多出的192个周期花在这些自动生成的代码里面去了。
3 结论
51单片机的定时器开启后,每次进入中断都要对计数值进行重载。而TMS320LF2407的定时器具有自动重载功能,不需要程序对它清零。
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
3
关闭 站长推荐上一条 /3 下一条