一种在单片机系统中实现高精度延时的方法与流程

文档序号:12824342阅读:401来源:国知局
一种在单片机系统中实现高精度延时的方法与流程

本发明涉及金融设备技术领域,尤其涉及一种在单片机系统中实现高精度延时的方法。



背景技术:

现有的单片机平台上的应用,驱动开发过程中会用到很多的延时函数。不同于linux系统,windows系统平台上的开发,在单片机系统上很多底层函数都需要自己去实现,包括前面所说的延时功能。灵活的实现这些功能,能够降低产品的维护成本,减少开发周期。单片机系统如cortex系列的m0/3/4等单片机系统。

目前大多数单片机平台上采用的延时方式有如下两种:

执行固定的循环次数来延时。这种方式不占用硬件资源,但是会受主频变化的影响,因为当处理器主频发生变化的时候,执行固定循环的所需时间也会跟着改变,这导致程序中的所有这类延时都不再准确。而且也受编译优化选项的影响。

使用硬件定时器计时来延时。此方法能够准确计时,但是需要占用一个硬件定时器,在资源比较紧张的系统上面,这会增加硬件成本。而且不同处理器的定时器控制方式上也存在差异,移植的时候会开发成本,另外还要考虑同步的问题。



技术实现要素:

本发明要解决的技术问题,在于提供一种在单片机系统中实现高精度延时的方法,具有成本低,灵活性高,可移植性高的特性。

本发明是这样实现的:一种在单片机系统中实现高精度延时的方法,所述方法为:所述单片机系统内设置有一定时器,所述定时器配置成超时时间为t,t用于记录时间的流逝;

基于这个周期性的定时器,获得单位时间t内,单片机所能执行的加减法次数cpu_cnt;所述次数cpu_cnt按位来确定,先确定cpu_cnt最高为1的位,然后依次从高到低的确定每位的值;

获得单位时间t内能执行多少次加法或减法运算之后,在单片机系统延时函数中把延时时间转换成对应的加法或减法次数便可实现精确延时。

进一步的,所述方法中所述次数cpu_cnt按位来确定,先确定cpu_cnt最高为1的位具体为:步骤10、在单片机系统的定时器中断处理函数中用变量timer_cnt表示对超过t时间次数的计数,每计数一次表示时间流逝t;

步骤11、给定一初始值cpu_count,该cpu_count表示初始时假设的的单位时间t内处理器能执行的加减法次数,

步骤12、将cpu_count左移一位,即cpu_count=cpu_count<<1

步骤13、定时器开始一个新的计时周期时,即timer_cnt发生变化时,保存timer_cnt当前的值,然后执行cpu_count次减法或加法运算;

步骤14、将步骤13中保存的timer_cnt的值,与经过减法或加法运算后timer_cnt的值进行比较,如果两个值相同,则cpu_count偏小,跳转到步骤12执行;如果当前值大于之前步骤13保存的值,则cpu_count偏大,把cpu_count右移一位,即cpu_count=cpu_count>>1;这时便确定了最高有效位。

进一步的,所述依次从高到低的确定每位的值具体为:步骤20、确定最高位之后开始从高到低的确认剩下的位数,用cnt_bit保存当前所要确定的位数,cnt_bit的初始值为cpu_count值;即cnt_bit=cpu_count,

步骤21、cnt_bit右移一位,即cnt_bit=cnt_bit>>1;

步骤22、把cpu_count和cnt_bit做或运算,相当于把cpu_count中对应的位进行置1;即cpu_count=cpu_count|cnt_bit;

步骤23、定时器开始一个新的计时周期时,即timer_cnt发生变化时,保存timer_cnt当前的值,然后执行cpu_count次减法或加法运算;

步骤24、用之前步骤23保存的timer_cnt值,与经过减法或加法运算后timer_cnt的值进行比较,如果两个值不同,则cpu_count偏大,把步骤22中所置的位清0,cpu_count=cpu_count&~cnt_bit;这时便确认了所要确认的位;

步骤25、如果两个值相同,且cnt_bit大于1,则跳转到步骤21继续执行;

步骤26、然后按相同的原理确定相邻的其它低位;完成后cpu_count便是最终的值,表示单位时间t内,处理器所能执行的加减法次数;最后更新cpu_cnt的值,即cpu_cnt=cpu_count。

进一步的,为提高系统启动速度,减少计算cpu_cnt的时间,其中,用cpu_cnt_prec表示cpu_count的高有效位位数,也就是cpu_count只从最高有效位开始的cpu_cnt_prec位有效,剩下的低位不用计算都被忽略置为0,这样进行确定cpu_cnt最高为1的位,然后依次从高到低的确定每位的值就提高了效率。

进一步的,所述单片机系统为至少包含有一个硬件定时器的单片机。

本发明具有如下优点:本发明通过单片机系统内设置有一定时器,所述定时器配置成超时时间为t,基于这个周期性的定时器,获得单位时间t内,单片机所能执行的加减法次数cpu_cnt;在单片机系统延时函数中把延时时间转换成对应的加法或减法次数便可实现精确延时。该方法灵活性高,实现成本低,可移植性高的特性。

附图说明

下面参照附图结合实施例对本发明作进一步的说明。

图1为本发明方法示意图。

图2为本发明具体实现的流程示意图。

具体实施方式

请参阅图1和图2所示,一种在单片机系统中实现高精度延时的方法,所述方法为:所述单片机系统内设置有一定时器,所述定时器配置成超时时间为t,t用于记录时间的流逝;超时时间t可以根据具体情况进行调整,比如1毫秒,10毫秒,100毫秒等;

基于这个周期性的定时器,获得单位时间t内,单片机所能执行的加减法次数cpu_cnt;所述次数cpu_cnt按位来确定,先确定cpu_cnt最高为1的位,然后依次从高到低的确定每位的值;

获得单位时间t内能执行多少次加法或减法运算之后,之后就可以关闭定时器,挪作它用。在单片机系统延时函数中把延时时间转换成对应的加法或减法次数便可实现精确延时。这种方式不受单片机主频变化的影响,因为每次开机的时候都会计算单位时间内执行加减法的次数。可以很方便的移植到其它硬件平台上;如果在运行过程中有需要处理器执行变频的动作,那么在变频完重新执行上面的流程便可。

所述方法中所述次数cpu_cnt按位来确定,先确定cpu_cnt最高为1的位具体为:步骤10、在单片机系统的中断处理函数中用变量timer_cnt表示对超过t时间次数的计数,每计数一次表示时间流逝t;

步骤11、给定一初始值cpu_count,该cpu_count表示初始时的单位时间t内处理器能执行的加减法次数,如:cpu_count为1<<10;即1进行左移10位;即二进制为0000010000000000;十进制就是1024,执行cpu_count次减法运算,就是进行1024次减法运算;该cpu_count初始值可根据实际情况调整,只要初始值小于实际值即可;

步骤12、将cpu_count左移一位,相当于放大一倍,即cpu_count=cpu_count<<1

步骤13、定时器开始一个新的计时周期时,即timer_cnt发生变化时,保存timer_cnt当前的值,然后执行步骤12中左移一位后的cpu_count次减法或加法运算;

步骤14、将步骤13中保存的timer_cnt的值,与经过减法或加法运算后timer_cnt的值进行比较,如果两个值相同,则cpu_count偏小,跳转到步骤12执行;如果当前值大于之前步骤13保存的值,则cpu_count偏大,则cpu_count右移一位,即cpu_count=cpu_count>>1,cpu_count右移后的那位便是最高有效位。,

所述依次从高到低的确定每位的值具体为:步骤20、确定cpu_cnt最高位之后开始从高到低的确认剩下的位数,用cnt_bit保存当前所要确定的位数,cnt_bit的初始值为所述步骤14结束时cpu_count的值;即cnt_bit=cpu_count。

步骤21、cnt_bit右移一位,即cnt_bit=cnt_bit>>1;

步骤22、把步骤14中确认最高有效位后的cpu_count和cnt_bit做或运算,相当于把步骤14中确认最高有效位后的cpu_count中对应的位进行置1;即cpu_count=cpu_count|cnt_bit;

步骤23、定时器开始一个新的计时周期时,即timer_cnt发生变化时,保存timer_cnt当前的值,然后执行cpu_count次减法或加法运算;

步骤24、用之前步骤23保存的timer_cnt值,与经过减法或加法运算后timer_cnt的值进行比较,如果两个值不同,则cpu_count偏大,把步骤22中所置的位清0;即获得当前要获得的低位;cpu_count=cpu_count&~cnt_bit;这时便确认了所要确认的位;

步骤25、如果两个值相同,且右移一位后的cnt_bit大于1,则跳转到步骤21继续执行;

步骤26、然后按相同的原理确定相邻的其它低位;完成后cpu_count便是最终的值,表示单位时间t内,处理器所能执行的加减法次数;最后更新cpu_cnt的值,即cpu_cnt=cpu_count。之后就可以关闭定时器,挪作它用。

下面结合一具体实例进行详细说明:

文中有描述把cpu_count左移或右移的时候就会改变cpu_count的值。也就是把cpu_count当前的值做移位运算之后再赋值给cpu_count。假设当前值是4,那左移一位之后cpu_count就为8,然后如果再右移一位,那cpu_count就从8变为4;也就是拿当前值做数学运算,然后当前值就更新为运算的结果。cnt_bit也是一样的。

同理在第22步骤中

假设cpu_count为1<<10,cnt_bit为1<<9

把两个做或运算并把结果更新为cpu_count的当前值。

步骤22之后cpu_count就变为了3<<9。也就是把cpu_count的第9位置1;到步骤24中。如果确定cpu_count偏大,那么就要把第9位清0,也就是cpu_count中第9位就是0;cpu_count就变为1<<10。否则保持3<<9不变。

然后跳转到步骤21执行,右移一位之后,cnt_bit变为了1<<8。重复上面的步骤执行便可。

为提高系统启动速度,减少计算cpu_cnt的时间,其中,用cpu_cnt_prec表示cpu_count的高有效位位数,也就是cpu_count只从最高有效位开始的cpu_cnt_prec位有效,剩下的低位不用计算都被忽略置为0,因为低位对运算结果影响比较小,选择性的忽略低位可以减少计算cpu_cnt的时间,从而提高启动速度。可根据具体需要调整cpu_cnt_prec的值。这样确定cpu_cnt最高为1的位,然后依次从高到低的确定每位的值就提高了效率。所述单片机系统为至少包含有一个硬件定时器的单片机。

总之,本发明通过单片机系统内设置有一定时器,所述定时器配置成超时时间为t,基于这个周期性的定时器,获得单位时间t内,单片机所能执行的加减法次数cpu_cnt;在单片机系统延时函数中把延时时间转换成对应的加法或减法次数便可实现精确延时。该方法灵活性高,实现成本低,可移植性高的特性。

虽然以上描述了本发明的具体实施方式,但是熟悉本技术领域的技术人员应当理解,我们所描述的具体的实施例只是说明性的,而不是用于对本发明的范围的限定,熟悉本领域的技术人员在依照本发明的精神所作的等效的修饰以及变化,都应当涵盖在本发明的权利要求所保护的范围内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1