avr-gcc提供了两个延迟函数,可以在用户的程序中使用,前提–加入avrdelayh这个头文件:_delay_us(double__us)_delay_ms(double_
avr-gcc供给了两个推迟函数,能够在用户的程序中运用,条件–参加avr/delay.h这个头文件:
_delay_us(double __us)
_delay_ms(double __ms)
而这两个推迟函数在实践工作的时分,调用了另两个函数,坐落delay_basic.h中:
a, _delay_loop_1(uint8_t __count)
b,_delay_loop_2(uint16_t __count)
a 函数能够看出,_count的最大值是256,b 函数中_count的最大值是65536。在delay_basic.h中有阐明,也能够结合a,b两个函数的详细界说看,a 函数履行一次的时刻是3个指令周期,b 履行一次的时刻是4个指令周期,一个指令周期 T = 1 / F_CPU。
(测验:能够试着计算下当F_CPU取值1M时,_count取1,_delay_loop_1和_delay_loop_2别离推迟时刻
是多 少,假如F_CPU取2M呢,推迟又是多少?)
*********************************************
F_CPU在avr-gcc中有界说,这个值是在编译的时分传递给编译器的,阐明用户程序的晶振频率,编译器为了确保编译过程中避免因用户为界说这个 F_CPU的值,设定一个初值F_CPU=100 0000UL,即默许用户运用的是1M的晶振。当然,在实践程序设计时必定要依据实践用到的晶振设定这个值,不然,推迟必定禁绝。能够在界说加载头文件前这样:如
#include
#define F_CPU 1000000UL
#include
#include
***********************************************
_delay_us(double __us), _delay_ms(double __ms)中又有这样的界说:
double __tmp = ((F_CPU) / 4e3) * __ms
__ticks = (uint16_t)__tmp;
_delay_loop_2(__ticks);
——————————————–
double __tmp = ((F_CPU) / 3e6) * __us;
__ticks = (uint8_t)__tmp;
_delay_loop_1(__ticks);
———————————————
所以依据a,b两个函数中_count(实践参数)的最大值描绘就应该是:
((F_CPU) / 3e6) * __us最大值是256
((F_CPU) / 4e3) * __ms的最大值是65536
即咱们在自己程序中调用 _delay_us(double __us),_delay_ms(double __ms)这两个函数时参数的挑选与所取的F_CPU(也便是实践用到的晶振频率)是有联系的。
当F_CPU取值为1M时,__us的最大取值是768,__ms的最大取值是65536*4
当F_CPU取值为2M时,__us的最大取值是768/2,__ms的最大取值是65536*4/2
……
当F_CPU取值为8M时,__us的最大取值是768/8,__ms的最大取值是65536*4/8
所以,推迟函数的参数取值是不能混为一谈的。
//*************************************************************************************************************************
现在再来看终究推迟了多久?
_delay_us(double __us)的推迟时刻由于调用了_delay_loop_1(),而_delay_loop_1()是履行3个指令周期,所以推迟时刻便是:
((F_CPU) / 3e6) * __us*3*T (T = 1 / F_CPU 单位MHz)
_delay_ms(double __ms)的推迟时刻由于调用了_delay_loop_2(),而_delay_loop_2()是履行4个指令周期,所以推迟时刻便是:
((F_CPU) / 4e3) * __ms*4*T (T = 1 / F_CPU 单位MHz)
能够试着计算下,当F_CPU取值为1M时,_delay_us(X)便是推迟X us,_delay_ms(X)便是推迟X ms
弥补:
其实,假如自己检查新的源代码能够发现,现在的守时的时刻并不像有的旧的文章上说的那样,约束在必定的范围内。由于代码更新过了,嘎嘎。
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/adas/261211.html