》》点此进入 http://bbs.armavr.com/ ARM-AVR嵌入式开发论坛
2009.07.19开始学习GCC编程,已将之前ICC编译的例程调试通过了12个,后续例程正在进行中。
此文档主要记录了使用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
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例程:
①每个.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”,需依据程序结构进行添加。
用户182713 2009-10-27 23:59
hendiao 2007-7-9 09:55
用户17616 2007-7-8 12:17
DING!!!!!
用户1053025 2007-5-28 10:24