为了账号安全,请及时绑定邮箱和手机立即绑定

学嵌入式的时候 ,碰到以下延时函数,麻烦高手帮帮忙~

学嵌入式的时候 ,碰到以下延时函数,麻烦高手帮帮忙~

冉冉说 2022-10-02 14:10:53
void Delay(int time){U32 val = (PCLK>>3)/1000-1;rTCFG0 &= ~(0xff<<8);rTCFG0 |= 3<<8; //prescaler = 3+1rTCFG1 &= ~(0xf<<12);rTCFG1 |= 0<<12; //mux = 1/2rTCNTB3 = val;rTCMPB3 = val>>1; // 50%rTCON &= ~(0xf<<16);rTCON |= 0xb<<16; //interval, inv-off, update TCNTB3&TCMPB3, start timer 3rTCON &= ~(2<<16); //clear manual update bitwhile(time--) {while(rTCNTO3>=val>>1);while(rTCNTO3<val>>1);};}
查看完整描述

2 回答

?
ibeautiful

TA贡献1993条经验 获得超6个赞

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

查看完整回答
反对 回复 2022-10-06
?
HUH函数

TA贡献1836条经验 获得超4个赞

这是利用定时器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),这样的话,估计会永远都等等不到的。
};
}


查看完整回答
反对 回复 2022-10-06
  • 2 回答
  • 0 关注
  • 171 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号