- /*
- 通过精心配置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中几乎没啥作用。
|