推荐win avr学习资料:ICCAVR向WinAVR过渡指南

推荐win avr学习资料:ICCAVR向WinAVR过渡指南

 

在中国电子开发网看到这篇文章,觉得很有用,并且对初学者特别适合阅读

对于利用win avr编程的人,或者从iccavr转向winavr的人,都非常有用:

转载如下:原文见http://www.ourdev.cn/bbs/bbs_content_all.jsp?bbs_sn=3545016

2009.07.19开始学习GCC编程,将之前ICC编译的例程在GCC环境下重新编译。
此文档主要记录了使用WinAVR过程中遇到的问题和对应的解决办法,不足之处请大家指正,同时希望大家继续补充,使更多即将由ICCAVR转向WinAVR的朋友或使用WinAVR的朋友更好的使用WinAVR。

***以下内容为文档摘录:***

以下内容硬件兰本为ATmega16,软件版本为:ICCAVR7.14+WinAVR-20090313,并以附录2个功能完全一样的ICCAVR和WinAVR程序为例来对ICCAVR向WinAVR的过渡技巧进行叙述,以供由ICCAVR向WinAVR过渡的朋友参考,不足之处,欢迎反馈,一起探讨。

1、头文件需要更改
ICCAVR中使用的“#include <iom16v.h>”需更换为“#include <avr/io.h>”
其他头文件应以程序而定,可参考WinAVR手册。

2、WinAVR中延时函数可使用“#include <util/delay.h>”头文件中的延时函数:

void _delay_us (double __us);    //微秒级 
void _delay_ms (double __ms);    //毫秒级

两个延时函数的参数均为double型,通常我们使用整数延时即可,

如:_delay_ms(100); //延时100ms

需要注意的时,两个延时函数的最长延时时间都是有限制的,请查阅“util/delay.h”有详细说明。

3、WinAVR中没有参数的函数需写出“void”,如:void LED_on(void);否则出现下面警告:
warning: function declaration isn't a prototype
WinAVR中没有类型的函数需写出“void”,如:void LED_on(void);否则出现下面警告:

warning: data definition has no type or storage class
//提示没有返回类型
warning: type defaults to 'int' in declaration of 'LED_on'
//编译器将其类型定为默认的“int”型

4、WinAVR源程序的最后一行需增加一个空行,否则出现下面警告:
warning: no new line at end of file


 (原文件名:1.jpg) 
引用图片



5、中断函数写法两者不一样
WinAVR中使用中断时,需添加“#include <avr/interrupt.h>”头文件:
#include <avr/interrupt.h]>

ISR(ADC_vect)          //中断名(中断向量名称)
{
   // user code here   //用户程序


中断向量名称可在:“avr-libc Manual [WinAVR]”的“<avr/interrupt.h>”中查询

6、WinAVR位操作与ICCAVR不同,在“sfr_defs.h”头文件中定义出:

   #define _BV(bit) (1 << (bit))

   因“sfr_defs.h”头文件已经被“avr/io.h”头文件所包含,所以使用位操作时只需添加“avr/io.h”头文件即可

7、WinAVR中,不同型号的单片机的头文件已被“avr/io.h”所包含,因此不需要添加额外对应型号的单片机头文件,这个很方便。

8、WinAVR中多文件编译解决办法,参考附录WinAVR例程:


 (原文件名:2.jpg) 
引用图片


 
①每个.c文件对应一个.h文件,.h文件中写出.c文件的所有函数声明,其他.c文件调用该.c文件中的函数时,只需包含该.c文件的.h文件即可。

②Makefile文件中需列出所有.c文件的清单,以空格隔开。

③满足上面两步即可实现WinAVR的多文件编译。

9、WinAVR中空指令使用没有定义“nop();”,可以使用“asm("nop");”

10、WinAVR中全局中断操作使用:“cli(); //禁止所有中断”和“sei();  //开全局中断”,它在“<avr/interrupt.h>”中定义,需将其包含;而ICC中为大写:“CLI(); //禁止所有中断”和“SEI();  //开全局中断”。

11、WinAVR和ICCAVR最大的不同在于它需要编写单独的Makefile文件,Makefile文件可用“MFile [WinAVR]”工具生成,稍作更改即可,而通常情况下只需更改以下几项:

①芯片类型,此例为“MCU = atmega16”

②芯片工具频率,此例为“F_CPU = 3686400”

③编译输入烧录文件格式,此例为“FORMAT = ihex”(默认)

④目标文件名,此例为“TARGET = main”(默认)

⑤C源程序清单,需以空格隔开,此例为“SRC = $(TARGET).c port_init.c led.c key_scan.c”,默认为“SRC = $(TARGET).c”,需依据程序结构进行添加。


 (原文件名:3.jpg) 
引用图片



 


 

 

 

posted @ 2011-11-09 17:57  proteus学习  阅读(812)  评论(0编辑  收藏  举报