在学嵌入式的时候 ,碰到以下延时函数,不太理解,求高手解答,不胜感激!给我讲明白者追加分···

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<val>>1);
};
}

一种最原始,最没有效率的延时程序。在调用这个延时程序时,CPU将在while(time--){}这个循环处不停的等待,直到time减到零,标志着延时结束。程序也随之退出。
从函数第一句开始,直到while循环语句之前,都属于定时器配置。通过注释可以看出,使用了定时器3。由于不知道单片机的型号,只能做一个通用的解释。看懂这一解释的基础是你知道单片机定时器的配置方法和工作原理。
首先,表示时间的变量time不是时间单位,并不表示毫秒或者秒,他代表了延时多少个脉冲。而变量val也是脉冲,他定义了一个定时器工作周期所经过的脉冲数。单个脉冲表示的时间间隔则通过单片机工作频率计算出来。比如说,单片机的频率为10mHz,那么每个脉冲的时间就是1uS(假设分频电路为1:1)。如果需要定时器的一个工作周期为1ms,那么val就需要设为1000。如果延时10ms,则time=100。可见,延时时间只能是定时器工作周期的整数倍。
rTcon3是定时器3的计数器,每个脉冲过后,会根据定时器的设定而自动进行+1操作。完成一个工作周期后,恢复为0。
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-02-17
这是利用定时器3的计数功能来延时的程序
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 //这四句设置定时器输入的频率,PCLK/8

rTCNTB3 = val; //设置计数值,输入频率除以1000,即计数器到底时正好1ms
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 //这几行是启动定时器,开始进行计数,计数到0时自动重新装载计数值
while(time--) {
while(rTCNTO3>=val>>1);
while(rTCNTO3<val>>1); //这两行是读取计数器的值,每次到一半时,将time减一次,因为计数器一直在走的,所以要使用范围读取,不能像这样while(rTCNTO3 == 0),这样的话,估计会永远都等等不到的。
};
}

我是一名大四的学生,电子信息专业,想自学嵌入式,希望能找份嵌入式工程...
回家后,我就上网查了下嵌入式,确实是当今比较热门的行业,也是比较好找工作的,工资也是相对比较高。我就下决心想学嵌入式了。于是我去找嵌入式培训的相关信息,说真的,我也很迷茫,我不知道培训是否真的能像他们宣传的那样好,所以我就想了解一段时间再做打算。后来,我在百度知道看到一篇让我很鼓...

初学者想学ARM嵌入式,应该选ARM9还是ARM11开发板?
对于ARM嵌入式的初学者,建议用ARM9开发板。首先,从功能上来说,ARM11要比ARM9强一些,但是性能优异并不代表适合初学者。对于初学者来说ARM11的有些功能是冗余。其次,学习ARM9或者ARM11就在所难免学习其所支持的操作系统Linux(ARM11可以支持Android)。目前,市面上ARM9的开发版的价格要比ARM11低...

要学习嵌入式,现在需要学习哪些基本课程?
那么我的建议就是使用、移植一个不算很新的版本内核,这样到时学驱动 的编程就有足够的资料了。这部分的推荐书籍可以参考另一篇文章《推荐几本学习嵌入式linux的书籍》。 第六,研究应用程序的编写。 做作品做项目除了编写驱动程序,最后还要编写应用程序。现在的趋势是图形应用程序的开发,而图形应用 程序中用得最多...

嵌入式培训怎么样
1、硬件层,是整个嵌入式系统的根本,如果现在单片机及接口这块很熟悉,并且能用C和汇编语言来编程的话,从嵌入式系统的硬件层走起来相对容易,硬件层也是驱动层的基础,一个优秀的驱动工程师是要能够看懂硬件的电路图和自行完成CPLD的逻辑设计的,同时还要对操作系统内核及其调度性相当的熟悉的。但硬件平台...

有什么嵌入式视频教程适合自学的
所以,嵌入式Linux+Android系统包含以下6部分内容: ①bootloader ②Linux内核 ③驱动程序 ④使用C\/C++编写的应用程序 ⑤Android系统本身 ⑥Android应用程序 Android跟Linux的联系实在太大了,它的应用是如此广泛,学习了Linux之后没有理由停下来不学习Android。在大多数智能设备中,运行的是Linux操作系统;它上面要么安装有Andr...

求助:单片机及嵌入式行业所具备的知识技能
本人专业:嵌入式软件开发学过C,汇编,模电数电(这两门学的不好)、linux、61单片机,正在学51本人电路这一块学的不好,不能自己设计,编写程序这一块没问题从事单片机或者嵌入式开... 本人专业:嵌入式软件开发学过C,汇编,模电 数电(这两门学的不好)、linux、61单片机,正在学51本人电路这一块学的不好,不能自己...

我想学编程(初学者)应该从什么地方开始学起!
我的经验,哪个最简单就先学哪个、公司用哪个你就学哪个、哪个和你有缘(比如刚好你认识一个愿意帮助你的Delphi高手)你就学哪个,如果你都学,或者三天两头的换,我可以告诉你结果肯定是什么都不会,不要心浮气燥,他们都只是工具,学精一门其它的就相通了,重要的是掌握编程的思想。如果你问我面向...

c语言和C++有什么不同啊! 那个对以后的学习更有用呢?。我想一直考计算机...
就是要这样练习,在写程序的时候你肯定会遇到很多问题,而这时你再去翻书找,或是问别人,当得到解答后你会记住一辈子的,知识必须用于现实生活中,解决实际问题,这样才能发挥它的作用,你自己好好想想,上了这么多年大学,天天上课,你在课堂上学到了什么?是不是为了期末考试而忙碌呢?考完得了90分,哈哈哈好高兴啊,下...

新手如何学习编程?
学编程入门建议:1.学编程要从根本出发,从理论上来说,需要广泛的阅读。了解算法的博大精深和计算机的基本理论。2.从实践上来说,需要有广泛的练习,练习的广泛在于练习不同的内容。然后就是创新精神和数学思维能力,这些都是需要培养的。基础要打好学编程要具备一定的基础。3.逻辑思维能力的培养、学...

初学python,感受和C的不同
我的以后的研究方向是嵌入式,显然,C语言是我的主要语言。我不是一个语言爱好者,我以前觉得,对于做研究而不是应用的人来说,了解多门语言,不如 精通一门语言。之所以去看python,主要还是因为python更有利于快速开发一些程序,也是因为现在认识到,研究和应用是不能分离的。个人以为,要 想在计算机工程的竞争中立足,...

相似回答