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

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
avr-gcc中delay延时函数的应用

avr-gcc中关于delay延时函数的应用 ?????? 在51中我们的延时函数都是自己编写的,无论是在汇编中还是在C言语中。虽然有模板,有时还是有点烦。呵呵。不过在应用avr 单片机的时候我们就有福了。因为avr-gcc 提供给我们很方便的delay 延时函数, 只有在源文件包含:#include util/delay.h 就可以使用了。这个头文件定义了两个级别的延时函数分别是:void _delay_us (double __us) ;????? //微秒级 void _delay_ms (double __ms);??? //毫秒级 不过不可以高兴的太早,因为要在你的avr-gcc中正确使用它们是有条件的,下面我将慢慢道来。 这个参数和 Makefile 中的 F_CPU 值有关,Makefile 所定义的的F_CPU 变量的值会传递给编译器。你如果用AVR_studio 4.1X来编辑和调试,用内嵌AVR-GCC的进行编译,并且让AVR_studio 帮你自动生成Makefile 的话,那你可以在:?????????????????????????????????????????? Project - Configuration Options - Gerneral - Frequency?? 如下图:写下你的F_CPU的值,F_CPU这个值表示你的AVR单片机的工作频率。单位是 Hz ,不是 MHZ,不要写错。如 7.3728M?? 则 F_CPU = 7372800 。你会发现在delay.h 头文件中有这个样的一个定义如下:#ifndef F_CPU # warning F_CPU not defined for util/delay.h # define F_CPU 1000000UL??? // 1MHz #endif 这是为了在你没有定义F_CPU这个变量(包括空),或是AVR_studio Frequency没有给值的时候,提供一个默认的 1MHz频率值。让编译器编译时不至于出错。 下面是这两个函数的实体:void _delay_us(double __us)??????? // 微秒 { uint8_t __ticks; double __tmp = ((F_CPU) / 3e6) * __us;?? // 3e6 是因为调用的_delay_loop_1()是三条指令的 if (__tmp 1.0) ?? __ticks = 1; else if (__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) / 4e3) * __ms; // 4e3 是因为调用的_delay_loop_2()是四条指令的 if (__tmp 1.0) ?? __ticks = 1; else if (__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: dec %0 \n\t ?? brne 1b ?? : =r (__count) ?? : 0 (__count) ); }void _delay_loop_2(uint16_t __count) { __asm__ volatile ( ?? 1: sbiw %0,1 \n\t ?? brne 1b ?? : =w (__count) ?? : 0 (__count) ); } 这两个函数都是avr-gcc 的 inline汇编格式写的,具体的语法规则我就不多说了。可以参考avr-libc。不过这两个函数很简单,很容易明白。一个是字节递减,一个是字递减。如果你认真看上面几个函数,你就会发现要正确使用它们是有如下条件的:??????? 1. 首先,你要正确定义你的 F_CPU 的值,也就是你的AVR单片机实际的频率。否则延时不准。???????? 2. 你在编译时一定要打开优化,Makefile中OPT 不要选 0 ,如果AVR_studi

文档评论(0)

2017ll + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档