/*
通过精心配置tick,使低8位重载值刚好为0。
所有中断累计操作要小于256步。
定时器时钟和Fsys分频比越大,效果越好,例如为Fsys/12。
*/
void d_us_tick_8(u8 n)
{
u8 told,tnow;
u8 tsum;
told =TL0;//根据分频比进行补偿?
tsum=0;
while(1)
{
tnow =TL0;
if(tnow!=told)
{
// tsum+=(u8)(tnow-told);
told=tnow-told;
tsum+=told;
told=tnow;
if(tsum>=n)//n=0时 25步
break;
}
}
}
#define RELOAD_T2 0x8000
void d_us_tick(u16 n)
{
u16 told,tnow;
u16 tsum;
told=(TH2<<8)|TL2;//暂不考虑量子操作
tsum=0;
while(1)
{
tnow =(TH2<<8)|TL2;
if(tnow!=told)
{
if(tnow>told) tsum+=tnow-told;
else tsum+=tnow-told+RELOAD_T2;//((RCAP2H<<8)|RCAP2L)
told=tnow;
if(tsum>=n)
break;
}
}
}
适用限制条件多,见注释。
8bit开销有20多步,误差大。在12MHz12T情形下,误差达20多uS。51的Fsys一般都小于10MHz,最好情形误差也有2uS。
16bit开销有60多步.
总体感觉这种软延时在51下不适合。
arm的指令效率高,Fsys高,定时器多又能分频,虽然适合。但arm外设也多,软延时在arm中几乎没啥作用。
|