购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.1 ICCAVR软件开发环境

ATmega128单片机的常用软件开发环境包括AVR Studio、GCCAVR (WINAVR)、ICC AVR、Code Vision AVR等,下面介绍各个软件的特点。

● AVR Studio:ATMEL公司提供的AVR单片机的汇编级开发环境,完全免费,并且集成了调试功能、AVR Prog串行、并行下载功能和JTAG ICE仿真等功能。缺点是本身只支持汇编语言的开发。

● GCCAVR (WINAVR):GCC本来是一个Linux上的C语言开发环境,当移植到Windows上用于AVR开发之后就变成了WINAVR。但是,WINAVR不是IDE(集成开发环境),需要用户使用makefile来定制IDE。另外,WINAVR不支持float数据类型。

● ICCAVR:ICCAVR是ImageCraft公司提供的一款基于C语言和汇编语言开发AVR单片机的IDE环境,集成度高,支持编译,并且可以和AVR Studio等环境联合调试。

● Code Vision AVR:Code Vision AVR也是一个基于C语言的IDE开发环境,其特点是内置的程序生成向导比较友好,易于入门。

ICCAVR集成开发环境是最常用的AVR单片机软件开发工具,其功能合适、使用方便、对各个型号的AVR单片机支持好,主要有以下3个特点。

● 是一个综合了编辑器和工程管理器的集成开发环境(IDE),集成度高,使用简单。

● 源文件全部被组织到工程之中,文件的编辑和工程的构筑也在这个环境中完成,编译错误会显示在状态窗口中,并且当单击错误时,光标自动跳转到错误的那一行,便于用户进行修改和编译。

● 工程管理器可以生成AVR单片机直接使用的.HEX格式文件,该格式的文件可被大多数编程器所支持,用于下载到芯片中。

说明

本书的例子都是基于ICCAVR软件开发环境的。

2.1.1 ICCAVR软件安装

在光盘或硬件中找到ICCAVR的安装程序iccavr 6.31A.exe(此处采用的是iccavr 6.31A版本),双击运行,可以看到如图2.1的提示,一路单击“Next”按钮之后,可以选择安装目录,如图2.2所示。

图2.1 开始安装ICCAVR

图2.2 选择安装路径

单击“Next”按钮,然后选择安装的文件夹之后单击“Install”按钮,出现如图2.3所示的安装进度,完成后单击“Finish”按钮即可。

图2.3 安装ICCAVR进度

安装完成之后,可以在“开始”菜单中找到对应的文件夹“ImageCraft Development Tools”,单击“ICC AVR”选项即可启动ICCAVR软件,如图2.4所示。

图2.4 启动ICC AVR软件菜单

此时的ICCAVR软件还是一个仅可以使用30天的未注册版本,需要在启动软件之后选择菜单命令“Help”→“Register Software”进行注册,方可获得完整的版本,如图2.5所示。

图2.5 注册ICCAVR软件

图2.6所示为ICCAVR的运行界面,可以分为菜单栏、快捷菜单栏、代码栏、输出栏、文件组织栏和状态栏等部分。

图2.6 ICCAVR的运行界面

● 菜单栏:集成了ICCAVR的所有菜单项。

● 快捷菜单栏:集成了ICCAVR的常用菜单的快捷按钮。

● 代码栏:用于编辑代码和文档。

● 输出栏:用于输出文件编译或者其他过程中的的相关信息,包括错误、警告等。

● 文件组织栏:用于项目文件的组织。

● 状态栏:用于显示当前正在编辑的文件相关信息。

2.1.2 ICCAVR菜单

ICCAVR的菜单栏包括File、Edit、Search、View、Project、Studio+、RCS、Tools、Ter minal、Help菜单项,本小节将详细介绍常用菜单的用途。

1.File(文件)菜单

图2.7所示是File(文件)菜单,该菜单包含了用于文件操作的相关菜单项,详细说明如下:

图2.7 File菜单

● New:新建一个文件。

● Reopen:打开历史文件,最近用过的历史文件将显示在其子菜单中。

● Open:打开一个已经存在的文件。

● Reload:放弃全部的修改从磁盘或备份中重新装载当前文件。

● Save:保存当前文件。

● Save As:将当前文件另保存为。

● Close:关闭当前文件。

● Compile File:把当前文件编译成目标文件、输出.hex或当前项目的启动文件。

● Save All:保存所有打开的文件。

● Close All:关闭当前打开的所有文件。

● Print:打印当前文件。

● Exit:退出ICCAVR IDE环境。

2.Edit(编辑)菜单

图2.8所示是Edit(编辑)菜单,该菜单包含了编辑操作相关的菜单项,其详细说明如下:

图2.8 Edit菜单

● Undo:撤销上一次的修改。

● Redo:恢复上一次撤销的操作。

● Cut:把选择的内容剪切到粘贴板。

● Copy:把选择的内容复制到粘贴板。

● Paste:将粘贴板的内容复制到当前光标的位置。

● Delete:删除所选择的内容。

● Select All:选择当前文件的全部内容。

● Block Indent:将当前选中的整块内容右移。

● Block Outdent:将当前选中的整块内容左移。

3.Search(查找)菜单

图2.9所示是Search(查找)菜单,该菜单包含了用于查找操作的相关菜单命令,其详细说明如下:

● Find:在当前编辑窗口中寻找一个或多个字符串,可以使用Match Case(区分大小写)、Whole Word(全字匹配)、Up/Down(往上或往下)选项。

● Find in Files:在当前所有打开的文件中或在当前工程的所有文件中或当前目录中的文件中寻找一个或多个字符串,可以使用Case Sensitive(区分大小写)、Whole Word(全字匹配)、Regular Expression(寻找规则的表达式)选项。

● Replace:在当前编辑窗口中替换一个或多个字符串。

● Search Again:再次查找。

● Goto Line Number:转到当前编辑窗口的指定行。

● Add Bookmark:添加书签。

● Delete Bookmark:删除书签。

● Next Bookmark:跳转到下一个书签。

● Goto Bookmark:跳转到指定的书签。

4.View (视图)菜单

图2.10所示是View(视图)菜单,该菜单包含了用于控制ICCAVR相关显示参数设置的操作,其详细说明如下:

图2.9 Search菜单

图2.10 View菜单

● Project File Window:打开或关闭项目组织窗口。

● Status Window:打开或关闭状态窗口。

● Project Makefile:以只读方式打开当前项目的makefile文件。

● Output Listing:以只读方式打开当前项目的输出列表文件。

● Map File:以只读方式打开当前项目的映射文件。

5.Project(项目)菜单

图2.11所示是Project(项目)菜单,该菜单包含了用于控制ICCAVR项目设置相关参数的操作,其详细说明如下:

● New:创建一个新的工程项目。

● Open:打开一个已经存在的工程项目。

● Open All Files:打开选定工程的全部文件。

● Close All Files:关闭当前全部打开的文件。

● Reopen:重新打开一个最近打开过的工程项目。

● Make Project:编译当前工程项目。

● Rebuild All:重新编译当前工程项目。

● Add File(s):添加一个文件到当前工程项目中。

● Remove Selected File(s):从工程项目中删除选中的文件。

● Option:打开工程项目编译选项菜单项。

● Close:关闭当前工程项目。

● Save As:使用新名称保存当前工程项目。

图2.11 Project菜单

Option(选项)菜单是Project菜单中最重要的菜单项,单击后弹出“Compiler Option”对话框,用于设置当前项目的相关编译参数,包含了4个标签页,其中最常用的两个标签页如图2.12和图2.13所示。

图2.12 编译标签页

图2.13 目标标签页

“Compiler”标签页常用的设置是选择项目的“Output Fomat”方式,通常情况下选择“COFF/HEX”即可,该选择生成项目对应的.COFF文件和.HEX文件,前者用于调试,后者用于对ATmega128编程。

“Target”标签页常用的设置如图2.13所示。左一,选择使用的具体器件;左二,选择当前项目的类型是应用代码还是Boot Loader代码;右边选择PRINTF的数据类型,相关参数如下:

● small:只支持%c、%d、%x、%X、%u和%s格式。

● long:支持%ld、%lu、%lx、%lX格式。

● float:支持%f格式,该选项会占用很大的内存空间。

6.RCS (源控制)菜单

图2.14所示是RCS(源控制)菜单,该菜单中包含了ICCAVR的文件相关控制的操作,其详细说明如下:

● Check In Selected File(s):检查当前工程项目中的所有选择文件。

● Check In Project:检查当前工程项目中的所有文件;

● Diff Selected File:显示选择文件的差异。

● Show Log of Selected Files(s):显示当前文件的的修改记录。

7.Tools(工具)菜单

图2.15所示是Tools(工具)菜单,该菜单中包含了用于对ICCAVR的外部相关工具控制的操作,其详细说明如下:

图2.14 RCS菜单

图2.15 Tools菜单

● Environment Options:环境和终端仿真器选项。

● Editor and Print Options:编辑和打印选项选项。

● In System Programmer:在系统编程器提供程序代码下载的应用,需要相应的下载硬件配合。

● AVRCalc:AVR计算器,可以计算串口波特率、定时/计数器的定时常数等。

● Application Builder:应用向导程序,可以生成硬件的初始化代码。

● Configure Tool:添加外部工具到工具菜单。

● Run:以命令行方式运行一个外部程序。

8.Help(帮助)菜单

Help菜单提供ICCAVR软件相关信息、帮助手册、升级及注册帮助等操作,在此不再赘述。

2.1.3 ICCAVR的常用文件类型

ICCAVR的常用文件类型扩展名如下:

● .c:C语言源文件。

● .s:汇编语言源文件或C语言源文件在编译器编译时产生的汇编输出文件。

● .h:C语言头文件。

● .prj:工程项目文件,该文件保存项目的相关信息。

● .a:库文件,可以由几个库封装在一起。其中,libcavr.a是一个由ICCAVR提供的,包含了标准C和AVR特殊程序调用的基本库。如果某个库被引用,ICCAVR内置的链接器会将其链接到对应的模块或文件中。用户也可以创建或修改一个符合自己需要的库。

● .o:汇编文件汇编产生的目标文件,多个目标文件可以链接成一个可执行文件。

● .hex:INTEL HEX格式文件,是用户代码对应的机器代码。

● .eep:INTEL HEX格式文件,是E 2 PROM的初始化数据。

● .cof:COFF格式输出文件,用于在诸如ATMEL的AVR Studio等环境下进行程序调试。

● .lst:列表文件,此文件中列举出了目标代码对应的最终地址。

● .mp:内存映像文件,包含了用户程序中有关符号信息及其所占内存大小的信息。

● .cmd:NoICE 2.xx的调试命令文件。

● .noi:NoICE 2.xx的调试命令文件。

● .dbg:ICCAVR的调试命令文件。

2.1.4 ICCAVR的扩展关键字

ICCAVR除了支持标准的C语言关键字之外,还支持一些扩展关键字,用于编译和诸如中断之类的特殊操作。

1.中断关键字

“Interrupt_handler”关键字必须在函数之前定义,用于说明该函数是中断操作函数。编译器会在中断操作函数中生成中断返回指令reti来代替普通返回指令ret,保存和恢复函数所使用的全部寄存器,并且会根据中断向量号vector number生成中断向量地址。

2.非挥发寄存器关键字

“ctask”关键字指定了函数使用非挥发寄存器来保存和恢复代码,其典型应用是在RTOS实时操作系统中让RTOS核直接管理寄存器。

3.数据段关键字

“data”关键字用于改变数据段名称,使其与命令行选项相适应。在分配全局变量至E 2 PROM中时必须使用该关键字。

2.1.5 ICCAVR的启动文件

启动文件用于对ATmega128单片机进行初始化工作,包括清除RAM数据等操作。ICC AVR的链接器会自动将启动文件连接到用户程序之前,并且将标准库libcavr.a和用户的程序相连接。启动文件根据目标芯片的不同,在crtavr.o和crtatmega.o中间选择一个。

启动文件中定义了一个全局符号“_start”,它也是用户程序的起始执行点。启动文件的功能如下:

● 初始化硬件和软件堆栈指针。

● 从idata区复制初始化数据到直接寻址数据区data区。

● 将bss区全部初始化为零。

● 调用用户代码的主函数main()。

● 定义一个退出点,如果用户主函数main()一旦退出,系统将进入这个退出点执行无限循环操作。

● 启动文件定义了复位向量。

用户可以自行修改和使用新的启动文件,其操作步骤如下:

● 进入ICCAVR安装路径。

● 找到crtavr.s文件。

● 用IDE打开crtavr.s文件。

● 修改相关信息。

● 选择编译到目标文件,创建一个新的crtavr.o。

● 把crtavr.o复制到ICCAR的库目录。

注意

1.如果使用的目标芯片是Mega系列,则应该用“crtatmega”代替“crtavr”。

2.在ICCAVR中可以有多个启动文件,可以在工程选项对话框中很方便地直接指定一个启动文件加入用户的工程,但是必须指定启动文件的绝对路径或启动文件必须位于工程选项库路径所指定的目录中。

2.1.6 ICCAVR的库函数

ICCAVR提供了许多库函数以供用户调用,使用这些函数可以大大地提高开发效率,本小节将详细介绍这些库函数。

1.ICCAVR库函数的头文件

● io*.h:I/O寄存器的头文件。

● macros.h:宏和定义的头文件。

● assert.h:声明宏的头文件。

● ctype.h:字符类型函数头文件。

● float.h:浮点数原形头文件。

● limits.h:数据类型的大小和范围头文件。

● math.h:浮点运算函数头文件。

● stdarg.h:变量参数表头文件。

● stddef.h:标准定义头文件。

● stdio.h:标准输入/输出(I/O)函数头文件。

● stdlib.h:内存分配函数的标准库头文件。

● string.h:字符串处理函数头文件。

2.字符类型库

字符类型库用于按照输入的ASCII字符集对字符进行处理,使用这些函数之前必须用“#include<ctype.h>”包含其头文件。

● int isalnum (int c):如果c是数字或字母,则返回非零数值;否则,返回零。

● int isalpha(int c):如果c是字母,则返回非零数值;否则,返回零。

● int iscntrl(int c):如果c是控制字符,如FF、BELL、LF等,则返回非零数值;否则,返回零。

● int isdigit(int c):如果c是数字,则返回非零数值;否则,返回零。

● int isgraph(int c):如果c是一个可打印字符而非空格,则返回非零数值;否则,返回零。

● int islower(int c):如果c是小写字母,则返回非零数值;否则,返回零。

● int isprint(int c):如果c是一个可打印字符,则返回非零数值;否则,返回零。

● int ispunct(int c):如果c是一个可打印字符而不是空格、数字或字母,返回非零数值;否则,返回零。

● int isspace(int c):如果c是一个空格字符,则返回非零数值,包括空格CR、FF、HT、NL和VT;否则,返回零。

● int isupper(int c):如果c是大写字母,则返回非零数值;否则,返回零。

● int isxdigit(int c):如果c是十六进制数字,则返回非零数值;否则,返回零。

● int tolower(int c):如果c是大写字母,则返回c对应的小写字母,其他类型仍然返回c。

● int toupper(int c):如果c是小写字母,则返回c对应的大写字母,其他类型仍然返回c。

3.浮点运算库

浮点运算库的函数用于支持浮点数运算,使用这些函数之前必须用“#include<math.h>”包含对应的头文件。

● float asin(float x):以弧度形式返回x的反正弦值。

● float acos(float x):以弧度形式返回x的反余弦值。

● float atan(float x):以弧度形式返回x的反正切值。

● float atan2(float x,float y):返回y/x的反正切,其范围在-π~+π之间。

● float ceil(float x):返回对应x的一个整型数,其小数部分四舍五入。

● float cos(float x):返回以弧度形式表示的x的余弦值。

● float cosh(float x):返回x的双曲余弦函数值。

● float exp(float x):返回以e为底的x的幂,即e x

● float exp10(float x):返回以10为底的幂,即10 x

● float fabs(float x):返回x的绝对值。

● float floor(float x):返回不大于x的最大整数。

● float fmod(float x,float y):返回x/y的余数。

● float frexp(float x,int*pexp):把浮点数x分解成数字部分y(尾数)和以2为底的指数n两个部分,即x=y×2 n ,y的范围为0.5≤y<1,y值被函数返回,而n值存放到pexp指向的变量中。

● float fround(float x):返回最接近x的整型数。

● float ldexp(float x,int exp):返回x×2 exp

● float log(float x):返回x的自然对数。

● float log10(float x):返回以10为底的x的对数。

● float modf(float x,float*pint):把浮点数分解成整数部分和小数部分,整数部分存放到pint指向的变量,小数部分应当大于或等于0且小于1,并且作为函数返回值。

● float pow(float x,float y):返回x y 的值。

● float sqrt(float x):返回x的平方根。

● float sin(float x):返回以弧度形式表示的x的正弦值。

● float sinh(float x):返回x的双曲正弦函数值。

● float tan(float x):返回以弧度形式表示的x的正切值。

● float tanh(float x):返回x的双曲正切函数值。

4.标准输入/输出库

ATmega128单片机并不支持真正的标准输入/输出库,所以标准stdio.h的很多内容不可以在ICCAVR中使用。不过有一些I/O函数是被支持的,同样使用之前必须用“#include<stdio.h>”包含其头文件,并且需要初始化输出端口。最基础的I/O函数是单字符的输入(getchar)函数和输出(putchar)函数。如果用户需要针对不同的装置使用高层的I/O函数,例如用printf函数输出LCD,则需要全部重新定义最底层的函数。

注意

作为默认单字符输出函数putchar(),必须输出到UART模块,在使用时需进行修改后,才能如期望的那样出现在程序终端窗口中。“\n”字符必须被映射为成对的回车和换行CR/LF。

● int getchar():使用查询方式从UART返回一个字符。

● int printf(char*fmt,..):按照格式说明符输出格式化之后的字符串,说明符是标准格式的一个子集:

● %d:输出有符号十进制整数。

● %o:输出无符号八进制整数。

● %x:输出无符号十六进制整数。

● %X:除了大写字母使用“A”~“F”外,同%x。

● %u:输出无符号十进制整数。

● %s:输出一个以C中空字符NULL结束的字符串。

● %c:以ASCII字符形式输出,每次只输出一个字符。

● %f:以小数形式输出浮点数。

● %S:输出在Flash存储器中的字符串常量。

说明

printf支持3个版本。

● int putchar(int c):输出单个字符,该函数使用了UART,以查询方式输出单个字符。

● int puts(char*s):输出以NL结尾的字符串。

● int sprintf(char*buf,char*fmt):按照格式说明符输出格式化之后的字符串到一个缓冲区,其说明符同printf()。

● Cprintf()/csprintf():将Flash中的格式字符串分别以prinf/sprinf形式输出。

5.标准库和内存分配函数

ICCAVR的标准库头文件<stdlib.h>定义了宏NULL和RAND_MAX,以及新定义的类型size_t,用户在调用任意内存分配函数,如calloc malloc()和realloc()之前,必须调用_NewHeap命令来初始化堆。

● int abs(int i):返回i的绝对值。

● int atoi(char*s):转换字符串s为整型数,并返回对应的值。s的起始必须是整型数形式字符;否则,返回0。

● double atof(const char*s):转换字符串s为双精度浮点数并返回其对应的值,s的起始必须是浮点数形式字符串;否则,返回0。

● long atol(char*s):转换字符串s为长整型数并返回其对应的值,s的起始必须是长整型数形式字符;否则,返回0。

● void*calloc(size_t nelem,size_t size):分配“nelem”个数据项的内存连续空间,每个数据项的大小为size字节,并且初始化为0。如果分配成功,返回分配内存单元的首地址;否则,返回0。

● void exit(status):终止用户代码的运行,典型的是无限循环,它是用户main函数的返回点。

● void free(void*ptr):释放ptr所指向的内存区。

● void*malloc(size_t size):分配size字节的存储区,如果分配成功,则返回内存区地址;如果内存不够分配,则返回0。

● void_NewHeap(void*start,void*end):初始化内存分配程序的堆。

● int rand(void):返回一个在0和RAND_MAX之间的随机数。

● void*realloc(void*ptr,size_t size):重新分配ptr所指向内存区的大小为size字节,size可比原来大或小,返回指向该内存区的地址指针。

● void srand(unsigned seed):初始化随后调用的随机数发生器的种子数。

● long strtol(char*s,char**endptr,int base):按照“base”的格式转换“s”中起始字符为长整型数,如果“endptr”不为空,* endptr将设定“s”中转换结束的位置。

● unsigned long strtoul(char*s,char**endptr,int base):除了返回类型为无符号长整型数外,其余同“strtol”。

6.字符串函数库

字符串函数库中包含了用于字符串处理的相关函数,string.h头文件中定义了NULL、size_t参数,当用“#include<string.h>”进行预处理后,可以调用下列函数。

● void*memchr(void*s,int c,size_t n):在字符串s中搜索n个字节长度,寻找与c相同的字符,如果成功,则返回匹配字符的地址指针;否则,返回NULL。

● int memcmp(void*s1,void*s2,size_t n):对字符串s1和s2的前n个字符进行比较,如果相同,则返回0;如果s1中字符大于s2中字符,则返回1;如果s1中字符小于s2中字符,则返回-1。

● void*memcpy(void*s1,void*s2,size_t n):复制s2中n个字符至s1,但复制区不可以重叠。

● void*memmove(void*s1,void*s2,size_t n):复制s2中n个字符至s1,返回s1,该函数与memcpy函数基本相同,但复制区可以重叠。

● void*memset(void*s,int c,size_t n):在s中填充n个字节的c,函数返回s。

● char*strcat(char*s1,char*s2):复制s2到s1的结尾,函数返回s1。

● char*strchr(char*s,int c):在s1中搜索第一个出现的c,包括结束NULL字符,如果成功,则返回指向匹配字符的指针;如果没有匹配字符,则返回空指针。

● int strcmp(char*s1,char*s2):比较两个字符串,如果相同,则返回0;如果s1>s2,则返回1;如果s1<s2,则返回-1。

● char*strcpy(char*s1,char*s2):复制字符串s2至字符串s1,函数返回s1。

● size_t strcspn(char*s1,char*s2):在字符串s1中搜索与字符串s2匹配的第一个字符,包括结束NULL字符,函数返回s1中找到的匹配字符的索引。

● size_t strlen(char*s):返回字符串s的长度,不包括结束NULL字符。

● char*strncat(char*s1,char*s2,size_t n):复制字符串s2(不含结束NULL字符)中n个字符到s1,如果s2长度比n小,则只复制s2,函数返回s1。

● int strncmp(char*s1,char*s2,size_t n):和strcmp函数类似,但是只比较前n个字符。

● char*strncpy(char*s1,char*s2,size_t n):和strcpy函数类似,但只复制前n个字符。

● char*strpbrk(char*s1,char*s2):基本和strcspn函数相同,但它返回的是s1匹配字符的地址指针。如果不匹配,则返回NULL指针。

● char*strrchr(char*s,int c):在字符串s中搜索最后出现的c,并返回它的指针;否则,返回NULL。

● size_t strspn(char*s1,char*s2):在字符串s1中搜索与字符串s2不匹配的第一个字符,包括结束NULL字符,函数返回s1中找到的第一个不匹配字符的索引。

● char*strstr(char*s1,char*s2):在字符串s1中找到与s2匹配的子字符串,如果成功,则返回s1中匹配子字符串的地址指针;否则,返回NULL。

7.变量参数函数库

stdarg.h头文件提供了对重入式函数的变量参数处理,定义了不确定的类型va_list和如下3个宏,使用前也需要用“#include<stdarg.h>”进行预定义。

● va_start(va_list foo,<last-arg>):初始化变量foo。

● va_arg(va_list foo,<promoted type>):访问下一个参数,分派指定的类型。需要注意的是,该类型必须是高级类型,如int long或double,不支持小的整型类型,如char。

● va_end(va_list foo):结束变量参数处理。 4zM8jFHoTpuA9ML7Re5yxID6zpMco2F68J5R9y+aRRogLctSsoBV3N7mvMX5syLL

点击中间区域
呼出菜单
上一章
目录
下一章
×