刚对WinAVR自带的延时函数进行一下研讨,有些收成,与咱们共享,不对之处请指正,谢谢。
先看_delay_loop_1(uint8_t__count)函数,从其函数注释里边能够了解到,该函数用来推迟3个晶振时钟周 期,不包括程序调用和退出该函数所花费的时刻。该函数的形参__count是一个8位的变量,由此,咱们就能够依据体系选用的晶振频率算出该函数最大的延 迟时刻了:
1MHz时:MAX_DELAY_TIME=(1/1000000)*3*256=0.000768S=768uS
8MHz时:MAX_DELAY_TIME=(1/8000000)*3*256=0.000096S=96uS
…………
F_CPUMAX_DELAY_TIME=(1/F_CPU)*3*256
依此类推。
相同再看_delay_loop_2(uint16_t__count)函数,该函数延时4个晶振周期,形参是一个16位的变量,相同 咱们也能够算出该函数最大的推迟时刻:
1MHz时:MAX_DELAY_TIME=(1/1000000)*4*65535=0.26214S=262.1mS
8MHz时:MAX_DELAY_TIME=(1/8000000)*4*65535=0.03277S=32.8mS
…………
F_CPUMAX_DELAY_TIME=(1/F_CPU)*4*65535
依此类推。
重要提示:_delay_loop_1(0)、_delay_loop_1(256)延时是相同的!!
同理,_delay_loop_2(0)、_delay_loop_2(65536)延时也是相同的!!这些函数的延时都是最长的延时。
重量级函数出 场>>>>>>>>>>>>>_delay_us()and_delay_ms()!!!<<<<<<<<<<<<<<<<<
先说_delay_us(double__us),不要认为该函数的形参是double形就随心所欲,随意付值都不会溢出了,其实这个 函数的调用是有约束的,否则就会呈现延时不对的状况。函数的注释里阐明如下:
Themaximalpossibledelayis768us/F_CPUinMHz.
在1MHz时最大延时768us!!!!
也就是说double__us这个值在1M体系时钟时最大只能是768。假如大于768,比方这样调用延时函数 _delay_us(780)会怎么样呢??那就会和调用_delay_loop_1(0)相同的作用了!能推迟多少各位能够算出来。详细在各种体系时钟 之下这个值是多少能够经过一个公式算出来:
MAX_VALUE=256*3000000/F_CPU
同理,剖析程序,能够知道_delay_ms(double__ms)函数,在1MHz体系时钟下其最大延时是262.14ms!在这 里也给出该函数的形参的最大值,调用此函数时的实参都不要大于这个值,大于这个约束值的话就和调用_delay_loop_2(0)相同的延时作用!
MAX_VALUE=65536*4000/F_CPU
总结结束!不正确之处还望各位不吝指正!谢谢