1.13.2_高精度延时函数_P

在使用某些设备时,对延时时间的精度有很高的要求,这时候,就可以使用高精度的延时函数来实现精准延时。

实现方法

实现高精度的延时函数的方法主要有以下两种。

使用for循环

在for循环中循环自减,为0跳出,以此来实现延时;这种方法实现难度较高,需要不断测试才能确定一个比较精确的值,且移植性能很差(同样程序,比如在Nor和SDRAM上运行,花费的时间将不同,不同款的SDRAM设备,花费的时间又会不同)。
在这里插入图片描述

使用定时器

使用芯片内部的定时器可以实现微秒级的精准计时。

假设有一个定时器,设置一个初始值,每来一个CLK计数值就减一,减到0则重新计数。

假设Tclk = 0.1us,也就是每0.1us来一个时钟脉冲,那么我们只要不断的读计数值,计数值减少10,就说明过去1us了。
在这里插入图片描述

这种方法,会有下面两种情况发生:

  1. 两次读取中,计数器的值没有减为0,也就是说计数器的值没有被重置;
  2. 两次读取中,计数器的值被重置了;

第一种情况下,相差的时间就是最初的计数值pre-当前的计数值cur;
第二种情况下,相差的时间则是pre-0+5000-cur。

假设重载值为50000,时钟脉冲间隔为0.1us,50000*0.1=5000us=5ms,即这种方法延时的最大时间是5ms,如果超出5ms,这种方法就会出错。

在这里插入图片描述
首先将时钟脉冲改为0.2us,这样5个脉冲就是1us。
在这里插入图片描述
然后根据计数值实现延时,注意尽量少调用函数,因为调用函数需要浪费较多的时钟周期,还有读取计数值时从TCNTO0寄存器读,这个寄存器专门用于获取timer0的计数值。
在这里插入图片描述

延时1min进行测试,测试结果符合预期。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值