avr-gcc中delay延时函数的应用.doc

avr-gcc中delay延时函数的应用.doc

ID:49619754

大小:55.00 KB

页数:3页

时间:2020-03-02

avr-gcc中delay延时函数的应用.doc_第1页
avr-gcc中delay延时函数的应用.doc_第2页
avr-gcc中delay延时函数的应用.doc_第3页
资源描述:

《avr-gcc中delay延时函数的应用.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、avr-gcc中关于delay延时函数的应用      在51中我们的延时函数都是自己编写的,无论是在汇编中还是在C言语中。虽然有模板,有时还是有点烦。呵呵。不过在应用avr单片机的时候我们就有福了。因为avr-gcc提供给我们很方便的delay延时函数,只有在源文件包含:#include就可以使用了。这个头文件定义了两个级别的延时函数分别是:void_delay_us(double__us);     //微秒级void_delay_ms(double__ms);   //毫秒级不过不可以高兴的太早,因为要在你的avr-gcc中正

2、确使用它们是有条件的,下面我将慢慢道来。这个参数和Makefile中的F_CPU值有关,Makefile所定义的的F_CPU变量的值会传递给编译器。你如果用AVR_studio4.1X来编辑和调试,用内嵌AVR-GCC的进行编译,并且让AVR_studio帮你自动生成Makefile的话,那你可以在:                                          Project->ConfigurationOptions->Gerneral->Frequency  如下图:写下你的F_CPU的值,F_CPU这个值表示你的AVR单片机的工作频

3、率。单位是Hz,不是MHZ,不要写错。如7.3728M  则F_CPU=7372800。你会发现在"delay.h"头文件中有这个样的一个定义如下:#ifndefF_CPU#warning"F_CPUnotdefinedfor"#defineF_CPU1000000UL   //1MHz#endif这是为了在你没有定义F_CPU这个变量(包括空),或是AVR_studioFrequency没有给值的时候,提供一个默认的1MHz频率值。让编译器编译时不至于出错。下面是这两个函数的实体:void_delay_us(double__us)

4、       //微秒{uint8_t__ticks;double__tmp=((F_CPU)/3e6)*__us;  //3e6是因为调用的_delay_loop_1()是三条指令的if(__tmp<1.0)  __ticks=1;elseif(__tmp>255)  __ticks=0;/*i.e.256*/else  __ticks=(uint8_t)__tmp;_delay_loop_1(__ticks);}void_delay_ms(double__ms)      //毫秒{uint16_t__ticks;double__tmp=((F_CPU)/

5、4e3)*__ms;//4e3是因为调用的_delay_loop_2()是四条指令的if(__tmp<1.0)  __ticks=1;elseif(__tmp>65535)  __ticks=0;/*i.e.65536*/else  __ticks=(uint16_t)__tmp;_delay_loop_2(__ticks);}你会发现他们都分别调用了  _delay_loop_1();和_delay_loop_2();这两个函数而这两个函数又如下所示:void_delay_loop_1(uint8_t__count){__asm__volatile(  "1

6、:dec%0""t"  "brne1b"  :"=r"(__count)  :"0"(__count));}void_delay_loop_2(uint16_t__count){__asm__volatile(  "1:sbiw%0,1""t"  "brne1b"  :"=w"(__count)  :"0"(__count));}这两个函数都是avr-gcc的inline汇编格式写的,具体的语法规则我就不多说了。可以参考avr-libc。不过这两个函数很简单,很容易明白。一个是字节递减,一个是字递减。如果你认真看上面几个函数,你就会发现要正确使用它

7、们是有如下条件的:       1.首先,你要正确定义你的F_CPU的值,也就是你的AVR单片机实际的频率。否则延时不准。        2.你在编译时一定要打开优化,Makefile中OPT不要选0,如果AVR_studio不要选O0。       3.你在使用这两个delay()时,传递给两个函数的实参要使用常量,不要使用变量。       4.设置的时间参数__ms,__us是有范围的,不要超过范围。__ms:1-[262.14ms/(F_CPU/1e6)],__us:1-[768us/(F_CPU/1e6)]。[...]表取整数部分.对于第4条范围,来

8、个例子:     如果F_CPU=73

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。