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的定时器具有自动重载功能,不需要程序对它清零。
文章评论(0条评论)
登录后参与讨论