原创 GCC中Delay函数的用法

2009-11-24 14:01 3612 3 3 分类: MCU/ 嵌入式

GCC编译器中<avr/delay>的用法<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


avr/delay函数的用法
avr GCC的函数库中包有个非常有用的精确延时函数,
#include <avr/delay.h>
其中包括4个函数
_delay_loop_1( );   
_delay_loop_2( );
_delay_us( );
_delay_ms( );
  
_delay_loop_1(uint8_t __count);
即一个数为(1/晶振)*3 


参数 __count 8bit 长度,1256256表示为0
每个循环花费3CPU周期。
所以当晶振为1Mhz时,最长延时为768usmicroseconds
  
_delay_loop_2(uint16_t __count);
即一个计数为(1/晶振)*4  
参数 __count 16bit 长度,16553665536被认为是0
每个循环花费4CPU周期。
所以当晶振为1Mhz时,最长延时为262.1 ms milliseconds
1*4*65536
262144 us
  
_delay_us(double __us);
  
us
的精确延时,参数为double,最长为768 us
原头文件中定义了晶振频率为1Mhz。在makefile中默认为F_CPU8000000
#ifndef F_CPU
/* prevent compiler error by supplying a default */
# warning "F_CPU not defined for <avr/delay.h>"
# define F_CPU 1000000UL
#endif
原函数为:

static __inline__ void
_delay_us(double __us)
{
uint8_t __ticks;
double __tmp = ((F_CPU) / 3e6) * __us;
if (__tmp < 1.0)
  __ticks = 1;
else if (__tmp > 255)
  __ticks = 0; /* i.e. 256 */
else
  __ticks = (uint8_t)__tmp;
_delay_loop_1(__ticks);
}

  
_delay_ms(double __ms);
  
ms
的精确延时,参数为double,最长为262.14 ms


另外,补充一句,要注意时钟晶振频率对延时函数中延时时间极限的限制.


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
3
关闭 站长推荐上一条 /3 下一条