2440lib.c之Delay

//***************************[ SYSTEM ]***************************************************
void Delay(int time)
{
 U32 val = (PCLK>>3)/1000-1;  //由前面知,PCLK频率为50MHz。此时val的值为6249,减1是因为,计数时包括0。所以相当于计数了6250次。
 
 rTCFG0 &= ~(0xff<<8);
 rTCFG0 |= 3<<8;    //prescaler = 3+1
 rTCFG1 &= ~(0xf<<12);
 rTCFG1 |= 0<<12;   //mux = 1/2
 
 rTCNTB3 = val;   //由此算出频率为,1000Hz。计算为freq=50M/4/2/6249
 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);  //等待TCNTO3从6249到3124
  while(rTCNTO3>1);   //等待TCNTO3从3124到6249(自动重载后的值)
 };
}
/*************************分析************************************************/
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 = CCLK/1000,      rTCMPB3=CCLK/500。 
然后我们看上面的定时的时序,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<val时,执行下一个while,
此外前面程序设定rTCNTB3 = val; 
并且rTCMPB3 = val>>1; 
while(rTCNTO3>=val>>1)也就等同于 
while(rTCNTO3>=rTCMPB3 ); 
所以,rTCNTB3开始减计数,当等于以后,再减1则进入下一个语句的while(rTCNTO3>1);显然此时要自动转载TCNTO3,此时while 为假,退出while。 
然后开始下一个time-- 
4)实现的延迟时间的计算 
通过以上的分析,可以得到延迟时间的频率:CCLK/2 
时间是0.32ms
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值