在使用某些设备时,对延时时间的精度有很高的要求,这时候,就可以使用高精度的延时函数来实现精准延时。
实现方法
实现高精度的延时函数的方法主要有以下两种。
使用for循环
在for循环中循环自减,为0跳出,以此来实现延时;这种方法实现难度较高,需要不断测试才能确定一个比较精确的值,且移植性能很差(同样程序,比如在Nor和SDRAM上运行,花费的时间将不同,不同款的SDRAM设备,花费的时间又会不同)。
使用定时器
使用芯片内部的定时器可以实现微秒级的精准计时。
假设有一个定时器,设置一个初始值,每来一个CLK计数值就减一,减到0则重新计数。
假设Tclk = 0.1us,也就是每0.1us来一个时钟脉冲,那么我们只要不断的读计数值,计数值减少10,就说明过去1us了。
这种方法,会有下面两种情况发生:
- 两次读取中,计数器的值没有减为0,也就是说计数器的值没有被重置;
- 两次读取中,计数器的值被重置了;
第一种情况下,相差的时间就是最初的计数值pre-当前的计数值cur;
第二种情况下,相差的时间则是pre-0+5000-cur。
假设重载值为50000,时钟脉冲间隔为0.1us,50000*0.1=5000us=5ms,即这种方法延时的最大时间是5ms,如果超出5ms,这种方法就会出错。
首先将时钟脉冲改为0.2us,这样5个脉冲就是1us。
然后根据计数值实现延时,注意尽量少调用函数,因为调用函数需要浪费较多的时钟周期,还有读取计数值时从TCNTO0寄存器读,这个寄存器专门用于获取timer0的计数值。
延时1min进行测试,测试结果符合预期。