原创 ICCAVR向WinAVR过渡指南_PDF

2009-8-14 11:19 3624 7 8 分类: MCU/ 嵌入式

》》点此进入    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”有详细说明。


3WinAVR中没有参数的函数需写出“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


attachimg.gif 1


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例程:


    attachimg.gif 2


每个.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”,需依据程序结构进行添加。


attachimg.gif 点击看大图


attachimg.gif 点击看大图


pdf

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户182713 2009-10-27 23:59

哈哈~随便了解了下winavr·

hendiao 2007-7-9 09:55

不错,感悟停深刻!我深有同感阿!投你一票哦!

用户17616 2007-7-8 12:17

DING!!!!!

用户1053025 2007-5-28 10:24

好文!顶!
相关推荐阅读
用户1400544 2012-09-24 08:55
【分享】ATmega16学习笔记PDF完整版下载(WinAVR)
  笔记均为原创,欢迎转载,转载请注明出处!   笔记1:8种LED点亮模式_GCC.pdf 笔记2:有源蜂鸣器驱动实验_GCC.pdf 笔记3:按键扫描(用KEY选择对应LED...
用户1400544 2011-01-19 23:26
博主邀请您:加入千脑,拥有“我的在线电脑”
点击加入千脑,拥有“我的在线电脑”在线电脑随时随地可用,安全可靠您可能遇到以下情况: 用户场景一:        我是一个集团公司的企业白领,经常负责写些策划书,制作各类表格等,有时候上班时间做不完就...
用户1400544 2010-04-07 00:43
ATmega16_Basic_V1.1范例2:8种LED点亮模式(ICC)
一、程序结构二、程序源码1、main.c /******************************************************************************...
用户1400544 2010-04-07 00:22
ATmega16_Basic_V1.1范例1:LED流水灯(ICC)
一、程序结构二、程序源码1、main.c /******************************************************************************...
用户1400544 2010-03-30 14:39
Altium Designer 6原理图元件库大全(7个种类)
》》点此进入      http://bbs.armavr.com/   ARM-AVR嵌入式开发论坛       ARM-AVR嵌入式开发论坛推出【Altium Designer 6 原理图元件库大...
用户1400544 2010-03-30 14:39
protel99原理图元件库大全(8个种类)
》》点此进入      http://bbs.armavr.com/   ARM-AVR嵌入式开发论坛       ARM-AVR嵌入式开发论坛推出【protel99原理图元件库大全(8个种类)】,共...
我要评论
1
7
关闭 站长推荐上一条 /3 下一条