Chinaunix首页 | 论坛 | 博客
  • 博客访问: 145404
  • 博文数量: 89
  • 博客积分: 71
  • 博客等级: 民兵
  • 技术积分: 490
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-19 19:39
文章分类
文章存档

2013年(3)

2012年(86)

分类:

2012-09-19 19:48:35

原文地址:s3c6410 test 的Delay 作者:fly123456789

1 延迟程序Delay 

void Delay(int time) 

      U32 val = (PCLK>>3)/1000-1; 
      rTCFG0 &= ~(0xff<<8); 
      rTCFG0 |= 3<<8;            //prescaler = 3+1 
      rTCFG1 &= ~(0xf<<12); 
      rTCFG1 |= 0<<12;           //mux = 1/2 

      rTCNTB3 = val; 
      rTCMPB3 = val>>1;        // 50% 
      rTCON &= ~(0xf<<16); 
      rTCON |= 0xb<<16;        //interval, inv-off, update TCNTB3&TCMPB3, start timer 3 
      rTCON &= ~(2<<16);           //clear manual update bit 
      while(time--) { 
           while(rTCNTO3>=val>>1); 
           while(rTCNTO3>1); 
      }; 

1)          计数器的输入时钟(CCLK)频率:PCLK/(预分频+1)/分割值 
预分频值和分割值分别由TCFG0,TCFG1来确定。 
rTCFG0 &= ~(0xff<<8); 
rTCFG0 |= 3<<8;            //prescaler = 3+1 
rTCFG1 &= ~(0xf<<12); 
rTCFG1 |= 0<<12;           //mux = 1/2 
预分频为3,分割值为2,又已知PCLK=50Mhz 
因此可以计算出计数器输入时钟频率6.25Mhz。 
2)初始值的设定了是由TCMPB3和TCNTB3来完成了 
TCMPB3一定要小于TCNTB3。 
TCMPB3在定时的过程中不变,然后TCNTB3开始减计数,直到与TCMPB3相等时触发中断,通过设定就可以重新转载TCNTB3。 

      U32 val = (PCLK>>3)/1000-1; 
      rTCNTB3 = val; 
      rTCMPB3 = val>>1;        // 50% 
我们可以比较一下rTCNTB3与计数器的输入时钟,可以发现rTCNTB3的频率是输入时钟的1000分之一,(因为包括0)。因此我们可以这样等价的认为rTCNTB3 = 1000CCLK,      rTCMPB3=500CCLK。 
然后我们看上面的定时的时序,rTCNTB3开始减计数,直到减到500与rTCMPB3相等,触发中断,然后rTCNTB3再减一以后继续装载。 
2)          rTCON定时控制寄存器 
rTCON[16,17,18,19]控制Timer3 
rTCON &= ~(0xf<<16); 
      rTCON |= 0xb<<16;        //interval, inv-off, update TCNTB3&TCMPB3, start timer 3 
      rTCON &= ~(2<<16);           //clear manual update bit 


3)          实现延迟 
由于Delay程序只是软件定时,因此设计了一个while循环来完成定时的功能。具体实现如下: 
while(time--) { 
while(rTCNTO3>=val>>1); 
while(rTCNTO3>1); 
}; 
最外层的WHILE只是DELAY的次数,然后看里面的两个WHILE,TCNTO3是个BUFFER,用来读TCNTB3,其实也就等同于TCNTB3,while(rTCNTO3>=val>>1);就是等到rTCNTO3
此外前面程序设定rTCNTB3 = val; 
并且rTCMPB3 = val>>1; 
while(rTCNTO3>=val>>1)也就等同于 
while(rTCNTO3>=rTCMPB3 ); 
所以,rTCNTB3开始减计数,当等于以后,再减1则进入下一个语句的while(rTCNTO3>1);显然此时要自动转载TCNTO3为VAL下一个WHILE 为假,退出while。 
然后开始下一个time-- 
4)实现的延迟时间的计算 
通过以上的分析,可以得到延迟时间的频率:CCLK/2 
时间是0.32ms
阅读(515) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~