iccavr使用说明
ICCAVR的使用
ICCA VR 的使用1,运行iccavr软件,出现如下界面:2,点击“project”里德“new”选项,如下图:3,点击“new”后出现如下对话框:可以自己命名工程名。
4,假设存在新建文件夹下可取名为“TEST”,如下图:5,点击保存,即新建一个名为“TEST”的工程,在软件右上角会出现如下图样:6,点击左上角的“”的图案可新建一个源文件,点击后出现如下图样:7,可以再空白区编写程序,例如写一个流水灯的程序,在空白区编写如下图:8,写完之后点击左上角的保存按钮“”,会出现如下对话框,在对话框中写入源文件名(可自己取)如test,但是需要注意的是后面必须跟着“.c”后缀,或者是“.h”后缀。
9,然后点击保存,保存之后需要把“tese.c”文件添加到工程中,方法如下:鼠标右击右上角的“files”图样,会出现“Add file(s)”字样,10,点击它,出现对话框,10,选中“test”文件,点击“打开”按钮,这时在右上角就会出现如下图样(即源文件已添加到工程中):11,点击工具栏中的“project”选项中的“options”选项,出现如下对话框:12,这是选择单片机类型的对话框,在“Device Configuration”字样的下拉菜单中选型如下图:12,并且把前面打钩,如下图:13,点击左下角的:“ok”。
14,点击工具栏中的编译快捷键“”,点击后下方会出现如下图样表示没有错:在保存的文件中会找到“.hex”文件,这是烧写程序需要的文件。
这样我们就学会了初步使用iccavr软件了,以后的工作就是自己慢慢研究了。
双击A VR_fighter.exe弹出如下对话框:(运行该软件前要先安装ISP驱动)点击左上角装入FLASH图标,弹出如下对话框:找到利用ICC所建的工程,打开,找到.exe文件,点击打开,装入FLASH完毕,2.进行芯片选择:点击下拉按钮,出现一系列单片机芯片类型,找到我们需要的就可,在我们选择Atmega16的芯片。
ICCAVR快速开发使用教程
ICCAVR快速开发使用教程
一、安装ICCAVR
二、创建一个新项目
安装完成后,打开ICCAVR并点击“新建项目”按钮。
在弹出的对话
框中,输入项目的名称和保存路径,然后点击“确定”按钮。
三、设置系统时钟频率
在新建的项目中,可以看到一个默认的配置文件。
点击打开配置文件,然后找到“系统时钟频率”选项。
根据自己的需求,设置系统时钟频率,
并保存配置文件。
四、编写代码
在左侧的工程资源管理器中,可以看到项目的文件结构。
双击打开“main.c”文件,就可以开始编写代码了。
在这里,可以使用C语言进行
编程,并且ICCAVR提供了丰富的API函数供开发者使用。
在编写代码时,可以参考官方文档和示例代码。
六、调试程序
七、常用功能
除了上述基本功能外,ICCAVR还提供了许多其他的功能,如代码模板、固件库管理、仿真器支持等。
开发者可以根据自己的需求,灵活地使
用这些功能,提高开发效率。
八、学习资源
除了官方文档和示例代码外,开发者还可以通过参加培训班或自学来学习ICCAVR的使用。
在互联网上也有很多关于ICCAVR的教程和论坛,可以提供帮助和解答问题。
总结:
ICCAVR是一款强大的AVR单片机开发工具,可以帮助开发者快速开发应用程序。
本教程简要介绍了ICCAVR的安装和基本使用方法,以及常用功能和学习资源。
希望通过本教程,开发者能够更好地掌握ICCAVR的使用,提高开发效率。
刘佳-ICCAVR使用教程
ICCARV使用教程
一、打开ICCARV软件
二、Project à New,选择保存路径,以及工程文件名称。
三、File à New,新建一个C源程序文件,保存在工程路径中,名称后缀.c必不可少。
点击保存完成保存。
四、输入程序,在程序空白处点击右键à Add to project,或者右键点击Files à Add File(s)…,将刚编好的C程序加入到工程中。
在工程的Files中就会出现刚刚加入的C程序文件。
五、Project à Options…,在弹出的Compiler Options对话框中
Target选项中,选择ATmega128芯片,点击OK。
六、Project à Rebuilt All,或者点击图标,编译程序。
如果
出现错误,则下方会出现提醒,根据提示修改程序。
在出现Device 0% full,则没有错误,并生成可执行程序.hex文件。
.hex文件在工程路径下。
ICCAVR快速开发使用教程
7:将其他 C 代码都编写好后,添加到工程中。 对编译环境进行配置,如下图:
快速入门 8:编译连接程序,如下图: 成功后在项目目录下生成.HEX 文件,将该文件下 IC诚CA创VR电软子件出品 载到开发板内就可以对程序进行验证。
ICCavr 软件支持快速代码生成功能,可Байду номын сангаас方便快速的利用该功能 进行程序代码的生成。
IC诚CA创VR电软子件出快品速入门 可以对端口设置,定时器 UART SPI 等进行设置
都设置好后,点击”Preview”就可以生成 C 代码,将代码复制到 工程中就可以了,方便快速进行 C 代码的编写和开发
IC诚CA创VR电软子件出快品速入门
ICCAVR 快速使用教程 一:在 ICCAVR 中新建工程,C 文件,并进行编译连接。
1:新建项目文件:打开 ICCavr 软件
2:I新建C诚立工C程项A创目V: R电软子件出快品速入门
3:保存工程项目
IC诚CA创VR电软子件出快品速入门 4:新建一个 C 文件,编写好代码
5:保存 C 文件
速入门 6:将刚才编写的 C 文件,添加到工程中,在 FILE 上点击右键,选择“ADD FILE IC诚CA创VR电软子件出快品 “ 将刚才编写的 C 文件添加到工程中去。
AVR单片机教程7—第七课ICCAVR使用教程
AVR单片机教程7—第七课ICCAVR使用教程——第七课ICCA VR使用教程本教程节选自周兴华老师《手把手教你学AVR单片机C程序设计》教程,如需转载,请注明出处!读者可通过当当网、淘宝网等网站购买本教程,如需购买配书实验器材,可登陆周兴华单片机培训中心网购部自助购买!接下来我们来做第一个AVR程序,让程序跑起来,控制AVR单片机综合试验板上的8个LED,让它们亮、灭进行闪烁。
3.4.1 ICCAVR使用教程通过ICCAVR对源程序编译连接工程之前,需要对编译器属性进行设置,设置好的某些属性可保留起来作为新建工程的默认属性。
打开ICCAVR软件界面,选择Project→Option进入属性设置对话窗。
共有Paths、Compiler、Target、Config Salvo四个属性标签页。
1). Paths标签页(图3-12)在属性中设置编译器的头文件目录(Include Path(s):)和库文件目录(Library Path:)。
我们使用系统默认的头文件目录和库文件目录。
——图3-12 Paths标签页由于我们不使用汇编语言进行开发,因此汇编语言包含路径(Asm Include Path(s):)空着不填。
输出文件目录(Output Directory:)空着不填,则输出文件自动存放在工程项目目录中,否则存放在用户填写的路径下。
2).Compiler标签页(图3-13)Strict ANSI C Checkings:选中表示进行严格的C语法检查。
——图3-13 Compiler标签页Accept Extensions(C++ comments,binary constants) :选中表示接受C++风格的程序注释。
Int size enum(for backword compatibility) :选中表示可以向下兼容程序。
Optimizations栏可以选择默认设置(Default)或使能代码压缩功能(Enable code compression),对程序的编译进行优化。
ICCAVR 使用快速入门
AVR ICC 使用快速入门菜单解释1、关于窗口设置:[如图]如上图:这是ICC avr 6.31 版本的窗口,分为5大区。
1.菜单项1.文件▪新建,打开,打印文件等常规选项。
很别扭的一件事关闭文件在菜单里。
2.编辑▪复制,粘贴,删除,撤销,重做等常规操作,一看就明白。
3.搜索▪搜索功能,书签功能,可以使用添加标签,删除标签,下一个标签,转到标签。
你可以直接点击左侧快速添加或删除标签。
▪4.视图▪对新手几乎没有用处,你可以用它显示或者隐藏工程文件窗口,编译状态窗口。
查看输出文件,makefile文件,Map文件。
5.Project Menu 工程菜单1.New... – 创建一个新的工程文件2.Open –打开一个已经存在的工程文件3.Open All Files... – 打开工程的全部源文件4.Close All Files – 关闭全部打开的文件5.Reopen... – 重新打开一个最近打开过的工程文件6.Make Project –解释和编译已经修改的文件为输出文件*注意与7Rebuild All的区别7.Rebuild All – 重新构筑全部文件注意在版本升级后对原有工程最好全部重新构筑*8.Add File(s) – 添加一个文件到工程中这个文件可以是非源文件9.Remove Selected Files – 从工程中删除选择的文件10.Option... – 打开工程编译选项对话框11.Close – 关闭工程12.Save As... – 将工程换一个名称存盘13.6.Tools Menu 工具菜单1.Environment Options – 打开环境和终端仿真器选项对话框2.Editor and Print Options –打开编辑和打印选项对话框3.AVR Calc – 打开AVR 计算器可以计算4.UART 的波特率定时器的定时常数5.Application Builder –打开应用向导程序生成硬件的初始化代码cool,对新手非常有用6.Configure Tools – 允许你添加自己的内容到工具菜单7.Run –以命令行方式运行一个程序7.Terminal 电脑终端使用很少,串口调试终端8.Help 帮助不用我说了。
ICCAVR教程
源文件全部被组织到工程之中 文件的编辑和工程的构筑也在这个环境中完成 编译 错误显示在状态窗口中 并且当你用鼠标单击编译错误时 光标会自动跳转到编辑窗口中 引起错误的那一行 这个工程管理器还能直接产生您希望得到的可以直接使用的 INTEL HEX 格式文件 INTEL HEX 格式文件可被大多数的编程器所支持 用于下载程序到芯片 中去
击鼠标右键选择编译选项
在工程窗口中双击文件名 IDE 将使用编辑器打开这个文件 按这个方法打开 led.c
作为试验可设置一些错误 例如从一行中删除分号
现在从 Project 菜单中选择 Make
Project 命令 IDE 首先自动保存已经改变的文件 并且开始编译这个文件 这时在状态
窗口中会显示错误信息 单击状态窗口中错误信息行 或单击其左边的错误符号 光标
通常 你的 main 例程完成一些初始化后 然后是无限循环地运行 作为例子 让我 们看 \icc\examples 目录中的文件 led.c
如果你选择了编译扩充(Project->Options->Compiler) 你可以在你的源代码中使用 C ++ 的 // 类型的注释 二进制常数
如果你选择了编译扩充(Project->Options->Compiler) 你可以使用 0b<1|0>* 来指定二 进制常数 例如 0b10101 等于十进制数 21 在线汇编
ICCAVR 是一个 32 位的程序 支持长文件名 出于篇幅考虑 本说明书并不介绍通用的 C 语言语法知识 仅介绍使用 ICC AVR 所 必须具备的知识 因此要求读者在阅读本说明书之前 应对 C 语言有了一定程度的理解 2 ICCAVR 中的文件类型及其扩展名 文件类型是由它们的扩展名决定的 IDE 和编译器可以使用以下几种类型的文件 输入文件 .c 扩展名----表示是 C 语言源文件 .s 扩展名----表示是汇编语言源文件 .h 扩展名----表示是 C 语言的头文件 .prj 扩展名----表示是工程文件 这个文件保存由 IDE 所创建和修改的一个工程的有 关信息 .a 扩展名----库文件 它可以由几个库封装在一起 libcavr.a 是一个包含了标准 C 的 库和 AVR 特殊程序调用的基本库 如果库被引用 链接器会将其链接到您的模块或文件中 您也可以创建或修改一个符合你需要的库 输出文件 .s 对应每个 C 语言源文件 由编译器在编译时产生的汇编输出文件 .o 由汇编文件汇编产生的目标文件 多个目标文件可以链接成一个可执行文件 .hex INTEL HEX 格式文件 其中包含了程序的机器代Байду номын сангаас .eep INTEL HEX 格式文件 包含了 EEPROM 的初始化数据 .cof COFF 格式输出文件 用于在 ATMEL 的 AvrStudio 环境下进行程序调试 .lst 列表文件 在这个文件中列举出了目标代码对应的最终地址 .mp 内存映象文件 它包含了您程序中有关符号及其所占内存大小的信息 .cmd NoICE 2.xx 调试命令文件 .noi NoICE 3.xx 调试命令文件 .dbg ImageCraft 调试命令文件 3 附注和扩充 #pragma 编译附注 这个编译器接受以下附注 #pragma interrupt_handler <func1>:<vector number> <func2>:<vector> ...
嵌入式开发-IccAVR C 编译器的使用
第十章 IccA VR C编译器的使用自ATMEL的AT90系列单片机诞生以来ATMEL公司推荐的第三方C编译器: Expanded 3rd Party Support ICCAVR/ICCtiny ImageCraft–Supports devices without SRAM–Embedded application builder–Global optimizer–ISP-support (STK200/300)-compiler CodeVision C–Includes advanced codeWizard关于几种C语言的比较,另见一文 免费提供30天的使用版软件,可生成烧录文件,而IAR免费提供的使用版软件,只生成调试文件,不能生成烧录文件;不断增加新功能模块,如单总线,SPI,UART,IIC总线,LCD,LED(本公司也在帮助改进,增加新功能)等;一运行光盘上的SETUP.EXE程序进行安装aÎҵĵçÄÔ打开光盘驱动器所对应的盘符c SETUP.EXE按照屏幕提示a¿ªÊ¼在对话框中填入 注意drive对应你的机器中的光盘驱动器盘符cÈ·¶¨其余同方法一注意按上述方法进行安装后对正式版用户还要进行第二步的注册´úÂëµÄѹ2ÔÚ±ê×¼°æÖÐÓÐһЩ¹¦ÄÜÏÞÖÆ缩2¿ÉÒÔÕâÑù×¢²áa IDEb Unlock Diskc Help Importing a License from a Floppy Disk²¢ÇÒ½øÐе¥»÷ICCAVR软件自动进行注册当你确定并再次重新启动ICCAVR后对不是首次安装或使用时间已超过30天的用户 对这类用户在程序启动时已不能进入IDE环境你应该选择按钮 这时会出现一个注册对话框Importing a License from aFloppy Diskc Unlock Diskµ¥»÷ÉÏÒ»²½ÖÐÌáµ½µÄ°´Å¥ICCAVR软件自动进行注册当你确定并再次重新启动ICCAVR后注意软盘在注册时应打开写保护b软盘成为一张空盘cÓ¦¸ÃÊ×ÏÈÔÚ菜单中选择一项然后再按上述方法进行安装注册 ICCAVR介绍1MCU ËüÓÐÒÔϼ¸¸öÖ÷ÒªÌصãIDE其可在WINDOWS9X/NT 下工作文件的编辑和工程的构筑也在这个环境中完成并且当你用鼠标单击编译错误时这个工程管理器还能直接产生您希望得到的可以直接使用的INTEL HEX格式文件用于下载程序到芯片中去支持长文件名本书并不介绍通用的C语言语法知识因此要求读者在阅读本书内容之前2IDE和编译器可以使用以下几种类型的文件.c 扩展名----表示是C语言源文件.s 扩展名----表示是汇编语言源文件.h 扩展名----表示是C语言的头文件.prj 扩展名----表示是工程文件.a 扩展名----库文件libcavr.a是一个包含了标准C的库和AVR 特殊程序调用的基本库链接器会将其链接到您的模块或文件中输出文件由编译器在编译时产生的汇编输出文件多个目标文件可以链接成一个可执行文件其中包含了程序的机器代码包含了EEPROM的初始化数据用于在ATMEL的A vrStudio环境下进行程序调试在这个文件中列举出了目标代码对应的最终地址它包含了您程序中有关符号及其所占内存大小的信息.noi NoICE 3.xx调试命令文件3编译附注#pragma interrupt_handler <func1>:<vector number> <func2>:<vector> ...这个附注必须在函数之前定义func2是中断操作函数并且保存和恢复函数所使用的全部寄存器#pragma ctask <func1> <func2>...这个附注指定了函数不生成挥发寄存器来保存和恢复代码#pragma text:<name>改变代码段名称#pragma data:<data>改变数据段名称这个附注在分配全局变量至EEPROM中时必须被使用#pragma abs_address:<address>函数与全局数据不使用浮动定位这在访问中断向量和其它硬件项目时特别有用使目标程序使用正常浮动定位你可以在你的源代码中使用 C ++ 的 // 类型的注释你可以使用0b<1|0>* 来指定二进制常数0b10101等于十进制数21¶ÁÕ߿ɲο¼ÔÚÏß»ã±à代码转换IAR或其它ANSI C编译系统的代码转换IAR C编译器作为应用于AVR的第一个C编译器当你从IAR编译系统转换到ImageCraft编译系统时IAR C中IO寄存器的定义与ICCAVR也是相同的ICCAVR使用pragma附注描述中断操作函数interrupt 关键字下面是一个对照#pragma interrupt_handler func:4 // 4 是这个中断的向量号ICCAVR 可以使多个中断向量共用一个中断处理函数interrupt [vector_name] func() // vec tor_name是某一个中断向量的名称以增加程序的可读性FLASH存贮器ICCAVR使用const关键字来达到相同的目的这仅影响手工写的汇编函数宏等而ICCAVR支持在线汇编 ICCAVR导游1Ê×ÏÈ´ÓProject菜单系统选择Open命令led¹¤³Ì¹ÜÀíÆ÷ÏÔʾÔÚÕâ¸ö¹¤³ÌÖÐÖ»ÓÐÒ»¸öÎļþled.cÔÚ"Target"标号下选择目标处理器IDE将调用编译器编译这个工程文件如果没有错误在这个例子中是\icc\examples.avr这个文件是INTEL H EX格式并且能下载这个程序进入你的目标系统如果你希望用支持COFF调试信息的工具来测试你的程序那么你需要从Project菜单中选择Options命令对一些常用的功能例如在工程窗口中双击文件名按这个方法打开led.cÀýÈç´ÓÒ»ÐÐÖÐɾ³ý·ÖºÅÏÖÔÚ´ÓProject菜单中选择Make Project命令并且开始编译这个文件单击状态窗口中错误信息行光标将移到编辑器中错误行的下面一行上并且浏览至你希望输出工程文件的目录例如那么输出文件名称为foo.hex或foo.cof等你可以开始写你的源代码(C或汇编格式)µ¥»÷¹¤¾ßÀ¸ÖÐ图标IDE输出与ATMEL 的AVR Studio完全兼容的COFF文件为更容易地使用这个开发工具2±àÒëÆ÷»á½«ÄãµÄ³ÌÐòÓëÆô¶¯´úÂëºÍ¿âº¯ÊýÁ´½Ó³ÉÒ»¸öÎļþÆô¶¯´úÂëµÄÓÃ;ÔÚÆô¶¯ÎļþÖкÜÏêϸµØ±»ÃèÊöÁËÆô¶¯´úÂë³õʼ»¯Õâ¸öÄ¿±êʹÆäÂú×ãËùÓеÄÒªÇóÄãµÄmain例程完成一些初始化后作为例子#include <io8515.h> /* 为使能够看清LED的变化图案对应LED熄灭*/while (1){/*LED向前步进 */for (i = 0; i < 8; i++)LED_On(i);/* LED向后步进 */for (i = 8; i > 0; i--)LED_On(i);/* LED跳跃*/for (i = 0; i < 8; i += 2)LED_On(i);for (i = 7; i > 0; i -= 2)LED_On(i);}}主个main例程是很简单的它运行在一个无限循环中LED是在LED_On例程中被改变的因为CPU运行很快因为延时的实际延时值不能被确定如果这个实际定时时间是重要的其它的例子但同样清楚地显示了如何用C写一个中断处理过程四编译一个单独的文件正常建立一个输出文件的次序是然而这时可以这样操作File Compile File...À´Ö´ÐÐ和中的任意一个文件应该是打开的编译一个文件为目标文件编译一个文件为输出文件注意2´Ó²Ëµ¥中选择命令在对话框中你可以指定工程的名称如果你使用一些已经建立的源文件Project AddFile(s)另外File NewÄã¿ÉÒÔÔڲ˵¥中选择或命令来保存文件AddFile(s)Ò²¿ÉÔÚµ±Ç°±à¼-´°¿ÚÖе¥»÷Êó±êÓÒ¼üÑ¡Ôñ将文件加入已打开的工程列表中但也可不作这样要求Project Options3¶øÇÒ¶¨ÒåËüÃǵıàÒëÑ¡Ïîµ±Äã´¦Àí¹¤³Ì¹¹ÖþʱÈç¹ûÒ»¸öÍ·Îļþ×÷ÁËÐÞ¸ÄIDE会自动重新编译已经改变的头文件C文件必须使用扩展名.sÄã¿ÉÒÔ½«ÈÎÒâÎļþ·ÅÔÚ¹¤³ÌÁбíÖй¤³Ì¹ÜÀíÆ÷ÔÚ¹¹Öþ¹¤³Ìʱ¶ÔÔ´ÎļþÒÔÍâµÄÎļþ²»Óè理睬可以在编译选项中设置有关参数使用默认的编译选项也可将默认编译选项装入现有工程中为避免你的工程目录混乱通常这个目录是你的工程目录的一个子目录编辑窗口编辑窗口是你与IDE交流信息的主要区域当编译存在错误时编辑器会自动将光标定位在错误行的位置对C源文件中缺少分号编辑器定位于其下面一行应用构筑向导应用构筑向导是用于创建外围设备初始化代码的一个图形界面Wizard Tools ApplicationBuilder应用构筑向导使用编译选项中指定的目标MCU来产生相应的选项和代码它的使用是很显而易见的内存IO端口SPI和模拟量比较器等外围设备如果你需要的话67×¢ÒâËü²»°üº¬ÈÎÒâÒ»¸öISP¹¦ÄÜ»òÐí¿ÉÒÔÏÔʾÄãµÄÄ¿±ê×°Öõĵ÷ÊÔÐÅÏ¢码文件五弹出菜单在ICCAVR环境中单击右键2新建一个文件ReopenÓйØÀúÊ·ÎļþÏÔʾµÄÓұߵÄ×Ӳ˵¥ÖÐ打开一个已以经存在的文件用于编辑Reload …form Disk´Ó´ÅÅÌÖÐÖØÐÂ×°Ôص±Ç°Îļþ从最后一次的备份文件中装载当前文件保存当前文件则将原文件以<file>.~<ext>形式保存将当前文件用另外一个名称来保存关闭当前文件系统会进行提示编译当前文件成目标文件其主要用于为创建新的启动文件或库产生目标文件编译当前文件成输出文件Save AllCloss AllͬÑùËü»áÌáʾÄã±£´æÒѾ-Ð޸ĵÄÎļþ打印当前文件退出ICCAVR的IDE环境Edit Menu 编辑菜单UndoRedoCutCopyPasteDeleteSelect AllBlock Indent对选择的整块内容左移4它有以下选项它有以下选项Find Again – 寻找下一个Add Bookmark – 添加书签Next Bookmark – 跳转到下一个签5ÏÔʾ״̬´°¿ÚProject Menu工程菜单New... – 创建一个新的工程文件Open All Files... – 打开工程的全部源文件Reopen... – 重新打开一个最近打开过的工程文件Rebuild All – 重新构筑全部文件Add File(s) – 添加一个文件到工程中Remove Selected Files – 从工程中删除选择的文件Close – 关闭工程Save As... – 将工程换一个名称存盘Tools Menu 工具菜单Environment Options – 打开环境和终端仿真器选项对话框Editor and Print Options –打开编辑和打印选项对话框AVR Calc – 打开A V R计算器定时器的定时常数 Application Builder –打开应用向导程序Configure Tools – 允许你添加自己的内容到工具菜单Run –以命令行方式运行一个程序8Paths在Paths页面中有Output Directory –输出文件的目录Compiler页面有宏之间用空格或分号分开name[:value] 或 name[=value]例如但意义相反Intel HEX或COFFÏó¼Ä´æÆ÷·ÖÅäËüµ÷ÓÃÁË´úÂëѹËõÓÅ»¯Target页面有包括ROMData Address – 指定数据起始地址 Use Long JMP/CALL 指定MCU是否支持长跳转和长调用IO Registers Offset Internal SRAM – 指定内部SRAM的偏移量而 Mega603 , IO寄存器覆盖在SRAM空间中Internal 对External SRAM – 指定你的目标系统的数据SRAM类型PRINTF Version – 选择PRINTF的版本Small 或 Basic: 只有 %c, %d, %x, %X, %u, and %s 格式支持Long: 支持 %ld, %lu, %lx, %lXFloating point: %f 支持AVR Studio Simulator IO – 如果选中Additional Libraries –使用标准库以外的附加库Strings in FLASH – 字符串只保存在FLASH存贮器中编译器使用的软件堆栈的大小不需地指定系统默认的启动文件在Paths页中指定Unused ROM Fill Pattern – 用一串十六进制数填充空余的ROM空间六启动文件这个链接器会自动将启动文件连接到您的程序之前启动文件根据目标MCU的不同在crtavr.o 和 crtatmega.o 中间任意选择一个它也是您的程序的起点12345Èç¹ûÄãµÄÖ÷º¯Êýmain( )一旦退出启动文件也定义了复位向量具体可参考中断操作部分cd \icc\libsrc.avr ; 进入你安装的编译器路径<edit crtavr.s> ; 编辑修改crtavr.s文件<open crtavr.s using the IDE> ; 用IDE打开crtavr.s文件<Choose "Compile File To->Object"> ;选择编译到目标文件你应该用"crtatmega" 代替"crtavr"word而非Mega芯片每一个中断入口地址使用一个字. 你也可以有多个启动文件注意2ȱʡ·¾¶Îªc:\icc\libsrc.avr\libsrc.zipÄã¿ÉÒÔ´Ó»¥Á¬ÍøÉÏÈÎÒâÏÂÔØÒ»¸öUNZIP程序进行解压缩密码显示在"About"对话框中unzip -s libsrc.zip; unzip 提示输入密码2AVR特殊函数----- ICCAVR有许多访问UART¶ÑÕ»¼ì²éº¯Êý¶Ô¼ì²â¶ÑÕ»ÊÇ·ñÒç³öºÜÓÐÓÃ3io*.h (io2313.h, io8515.h, iom603.h, ... 等.)这些文件中是从ATMEL官方公开的定义IO寄存器的源文件经过修改得到的PORTB = 1;uc = PORTA;4macros.h这个文件包含了许多有用的宏和定义如果你的程序使用了头文件所列出的函数在使用浮点数和长整型数的程序中必须用#include预编译指令包含这些包含了这些函数原形的头文件assert.h - assert(), 声明宏ctype.h – 字符类型函数float.h – 浮点数原形limits.h – 数据类型的大小和范围math.h – 浮点运算函数stdarg.h – 变量参数表.stddef.h – 标准定义stdio.h – 标准输入输出函数stdlib.h – 包含内存分配函数的标准库string.h – 字符串处理函数3ʹÓÃÕâЩº¯Êý֮ǰӦµ±ÓÃ"#include <ctype.h>"包含否则返回零int isalpha(int c)如果c是字母返回非零数值如FF, BELL, LF ..等否则返回零int isdigit(int c)如果c是数字返回非零数值否则返回零int islower(int c)如果c是小写字母返回非零数值否则返回零int ispunct(int c)如果c是一个可打印字符而不是空格否则返回零int isspace(int c)如果c是一个空格字符返回非零数值否则返回零int isupper(int c)如果c是大写字母返回非零数值否则返回零int tolower(int c)如果c是大写字母则返回c对应的小写字母如果c是小写字母则返回c对应的大写字母浮点运算库下列函数支持浮点数运算#incl ude <math.h>Æ䷶ΧÔÚ-之间float ceil(float x)返回对应x的一个整型数float cos(float x)返回以弧度形式表示的x的余弦值float cosh(float x)返回x的双曲余弦函数值float exp(float x)返回以e为底的x的幂即10xfloat 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两个部分2 n y y值被函数返回float fround(float x)返回最接近x的整型数float ldexp(float x, int exp)返回xÕûÊý²¿·Ö´æ·Åµ½pint指向的变量并且作为函数返回值返回返回x的平方根float sin(float x)返回以弧度形式表示的x的正弦值float sinh(float x)返回x的双曲正弦函数值float tan(float x)返回以弧度形式表示的x的正切值float tanh(float x)返回x的双曲正切函数值5MCU±ê×¼stdio.h的许多内容不可以使用同样使用之前应用"#include <stdio.h>"预处理最低层的IO程序是单字符的输入(getchar)和输出(putchar)程序例如用printf输出LCD为在ATMEL的AVR Studio模拟器使用标准IO函数注意单字符输出函数putchar是输出到UART装置没有修改'\n' 字符必须被映射为成对的回车和换行格式说明符是标准格式的一个子集同 %x%u - 输出无符号十进制整数%s – 输出一个以C中空字符NULL结束的字符串%c – 以 ASCII 字符形式输出取决于你的特别需要和代码的大小代码越大基本形: 只有 %c, %d, %x, %u, 和 %s 格式说明符是承认的长整形: 针对长整形数的修改 %ld, %lu, %lx被支持, 以适用于精度要求较高的领域浮点形: 全部格式包括%f 被支持你使用编译选项对话框来选择版本int putchar(int c)输出单个字符注意输出’\n’字符至程序终端窗口int sprintf(char *buf, char *fmt)按照格式说明符输出格式化文本frm字符串到一个缓冲区 支持功能"const char *" cprintf 和csprintf 是将FLASH中的格式字符串分别以prinf和sprinf形式输出标准库和内存分配函数标准库头文件<stdlib.h>定义了宏NULL和RAND_MAX和新定义的类型size_t ×¢ÒâÔÚÄãµ÷ÓÃÈÎÒâÄÚ´æ·ÖÅä³ÌÐòmalloc和realloc)之前int abs(int i) 返回i的绝对值int atoi(char *s)转换字符串s为整型数并返回它否则返回0double atof(const char *s)转换转换字符串s为双精度浮点数并返回它long atol(char *s)转换字符串s为长整型数并返回它否则返回0 void *calloc(size_t nelem, size_t size)分配"nelem"个数据项的内存连续空间如果分配成功返回分配内存单元的首地址 void exit(status) 终止程序运行它是担任用户main函数的返回点如果分配成功则返回内存区地址 void _NewHeap(void *start, void *end) 初始化内存分配程序的堆符号_bss_end定义为编译器用来存放全局变量和字符串的数据内存的结束这个结束值不能被放入堆栈中void *realloc(void *ptr, size_t size)重新分配ptr所指向内存区的大小为size字节返回指向该内存区的地址指针long strtol(char *s, char **endptr, int base)按照"base."的格式转换"s"中起始字符为长整型数* endptr将设定"s"中转换结束的位置其余同"strtol"7±àÒëÆ÷Ö§³ÖÏÂÁк¯Êý类型size_t 和下列字符串及字符阵列函数void *memchr(void *s, int c, size_t n)在字符串s中搜索n个字节长度寻找与c相同的字符否则返回NULLÈç¹ûÏàͬÔò·µ»Ø0Ôò·µ»Ø1Ôò·µ»Ø-1但拷贝区不可以重迭返回s1µ«¿½±´Çø¿ÉÒÔÖصü它返回s·µ»Øs1包括结束NULL字符如果没有匹配字符找到int strcmp(char *s1, char *s2)比较两个字符串如果s1>s2则返回1char *strcpy(char *s1, char *s2)拷贝字符串s2至字符串s1size_t strcspn(char *s1, char *s2)在字符串s1搜索与字符串s2匹配的第一个字符其返回s1中找到的匹配字符的索引不包括结束NULL字符不含结束NULL字符如果s2长度比n小返回s1µ«ÆäÖ»±È½ÏÇ°n个字符但其只拷贝前n个字符但它返回的是在s1匹配字符的地址指针char *strrchr(char *s, int c)在字符串s中搜索最后出现的c·ñÔò·µ»ØNULL°üÀ¨½áÊøNULL字符char *strstr(char *s1, char *s2)在字符串s1中找到与s2匹配的子字符串否则返回NULL这些函数除了它的操作对象是在FLASH中常数字符串外size_t cstrlen(const char *s)char *cstrcpy(char *dst, const char *src);int cstrcmp(const char *s1, char *s2);8Ëü¶¨ÒåÁ˲»È·¶¨µÄÀàÐÍva_list和三个宏分派指定的类型如int小的整型类型如"char"不能被支持printf()可以使用vfprintf()来实现#include <stdarg.h>int printf(char *fmt, ...){va_list ap;va_start(ap, fmt);vfprintf(fmt, ap);va_end(ap);}9ÄÚ´æͼÈçÏÂÄÇôÈí¼þ¶ÑÕ»µÄÄÚÈݽ«»á±»¸Ä±äÓ²¼þ¶ÑÕ»ÊÇÓÃ×÷º¯ÊýµÄ·µ»ØµØÖ·同样地如果你使用动态分配内存警戒线数据区低端地址警戒线启动代码写了一个正确的关于数据区的地址字节和一个类似的正确的关于软件堆栈的地址字节作为警戒线如果你使用了你自己的启动文件你将需要额外改造为新的启动文件如果你使用动态分配内存参考内存分配函数如果警戒线字节仍然保持正确的值那么函数检查通过那么警戒线字节将可能被破坏你的程序将可能运行不正常或偶然崩溃它调用了带一个参数的函数_StackOverflowed(char c)那么硬件堆栈有过溢出那么软件堆栈曾经溢出它是两个堆栈都可能溢出的在_StackOverflowed执行起作用时作为例子那么将不能返回_StackCheck函数库会用一个缺省的_StackOverflowed函数来跳转到0的位置你可能希望用一个函数来代替它以指示更多的错误条件注意自堆栈溢出指示故障程序以来这两个函数的原型在头文件macros.h.中访问A V R的低层硬件A V R系列使用高级语言编程时有很高的C语言密度由于AVR性能偶然情况下目标MCU的硬件特点在C语言中不能很好地使用头文件io*.h iom603.h等这些文件是从ATMEL官方发布的文件经过修改文件macros.h定义了许多有用的宏这个编译器的效率很高outsbi等注意尽管io*.h定义了它们的bit的位置很多时候你将需要使用定义在macros.h文件中的BIT()宏avr.h:#define SRE 0x80// 外部 RAM 使能... (你的C程序)MCUCR |= SRE;io8515.h#define SRE 7... (你的C程序)#include <macros.h>MCUCR |= BIT(SRE);2bit很幸运而没有借助于汇编指令或其它非标准C结构a |b – 按位或这惯用于打开某些位例如这个运算在检查某些位是否置1时有用If ((PORTA & 0x81) == 0) // 检查位7和位0注意圆括号需要括在&运算符的周围这是C程序中很多错误的原因之一这个运算对一个位取反有用在下面的例子中PORTA ^= 0x80; // 翻转位7~a – 按位取反. 在表达式中这个运算执行一个取反与这个运算组合使用尤其有用PORTA &= ~0x80;// 关闭位7这个编译器对这些运算能产生最理想的机器指令sbic指令可以用在根据位的状态进行条件分枝的按位与运算中程序存贮器和常量数据A V R是哈佛结构的MCUÕâÑùµÄÉè¼ÆÊÇÓÐһЩÓŵãµÄ·Ö¿ªµÄµØÖ·¿Õ¼äÔÊÐíA VR装置比传统结构访问更多的存贮器Atmega系列允许有超过64K字的程序存贮器和64K字节的数据存贮器而程序计数器仍保留在16位上C不是在这种机器上发明的C指针是任意一个数据指针或函数指针可是同是哈佛结构的AVR非标准C解决了这个问题注意对指针描述不管是限定指针变量自己还是指向项目的指针const int table[] = { 1, 2, 3 };const char *ptr1;char * const ptr2;const char * const ptr3;"table"是表格式样分配进程序存贮器"ptr2"是一个项目在程序存贮器而指向数据的指针在数据存贮器"ptr3"是项目在程序存贮器而指向数据的指针也在程序存贮器C 编译器生成LPM指令来访问程序存贮器而且在传统结构中因而无论如何例如带有const限定的第二个参数表示函数不能修改参数const限定词表示第二个参数指向程序存贮器是不合适的最后例如定义在函数体外的变量或有静态存贮类型限制的变量将不被放入FLASH中而可能导致不明确有结果字符串在哈佛结构的AVR中程序内存和数据内存分开给程序内存和数据内存的说明带来了一定的复杂性字符串这个编译器将带有const说明的表和项目放入程序存贮器中问题在于C中将字符串转换为char指针那么所有字符串库函数中的任意一个必须被复制成不同于指针的操作ImageCraft编译器提出了解决这个问题的两个方法所有涉及的字符串是拷贝进数据存贮器的在程序启动时字符串是由程序存贮器拷贝进数据存贮器中的编译器执行全局变量初始化也是这样处理的如果你希望节省空间例如hello可以在上下文中作为字符串使用Printf已被扩展成带%S格式字符来输出只存贮于FLASH中字符串新的字符串函数已加入了对只存贮于FLASH中字符串的支持你可以指挥编译器将字符串只放在FLASH中当这个选项是选中的并且你必须保证函数获得了合适的参数类型创建了cprintf 和csprintf函数承认字符串格式的类型注意只分配全部字符串到FLASH存贮器中应使用cprintf()²¢ÇÒ¼Ó%S参数应使用printf()²¢ÇÒ¼Ó%S参数堆栈生成代码使用两个堆栈一个是用于以堆栈结构传递的参数硬件堆栈起初是用于存贮函数返回的地址通常没有子程序调用那么默认的16字节应该在大多数的例子中能良好工作除了很繁重的递归调用程序硬件堆栈是从数据内存的顶部开始分配的硬件堆栈和数据内存的大小是受在编译器选项中的目标装置项设定限制的在IO空间后面是正确的如果你选择的目标装置带有32K或64K的外部SRAM¶øÇÒÏòµÍÄÚ´æµØÖ··½ÏòÉú³¤堆栈检查任意一个程序失败的重要原因是堆栈溢出到其它数据内存的范围并且当一个堆栈溢出时会偶然产生坏的事情6ÔÚÏß»ã±àÔÊÐíÄãд»ã±à´úÂë½øÄãµÄC文件中当然asm("<string>");多个汇编声明可以被符号\n分隔成新的一行String³ýÁ˶îÍâÔö¼ÓµÄASM关键词可使用%<变量名>格式如果你在汇编指令中需使用一个CPU寄存器register通常如果你在函数中描述了太多的寄存器变量在这种情况那时也不能控制寄存器变量的分配作为例子但这里没有请求使用在线汇编在线汇编可以被用在C函数的内部或外部不象AVR汇编器所以你可以在你的在线汇编代码中创建标签你可能得到一个警告7°üÀ¨×´Ì¬¼Ä´æÆ÷SREG IO地址在0x00和0x3f之间或者使用在0x20 和0x5F之间的数据内存地址两种方法在C中都可使用一个直接地址可以通过加指针类型符号直接访问SREG的数据内存在地址是0x5F:unsigned char c = *(volatile unsigned char *)0x5F; // 读SREG*(volatile unsigned char *)0x5F |= 0x80; // 打开全局断位注意注意不要不注意地改变CPU寄存器编译器自动生成低级指令象in sbrsIO地址register unsigned char uc;asm("in %uc,$3F");// 读 SREGasm("out $3F,%uc"); // 打开全局中断位注意尽管io*.h定义了它们的bit的位置很多时候你将需要使用定义在macros.h文件中的BIT()宏avr.h:#define SRE 0x80// 外部 RAM 使能... (填充你的C程序)MCUCR |= SRE;io8515.h#define SRE 7... (填充你的C程序)#include <macros.h>MCUCR |= BIT(SRE);8ÀýÈçÍⲿIO设备通常被映射成特殊的内存通常你可以使用在线汇编或单独的汇编文件来描述那些定位在特殊内存地址的数据已在C语言中提供这些能力假设有一个两字节的LCD 控制寄存器定位在0x1000地址并且有一个100字节的双口SRAM定位在0x2000的地址在一个汇编文件中输入以下内容extern unsigned int LCD_control_register, LCD_data_register;extern char dual_port_SRAM[100];注意并且使用两个冒号定义为全局变量在线汇编遵守同样的汇编语法规则在C文件中asm(".area memory(abs)"".org 0x1000""_LCD_control_register:: .blkw 1""_LCD_data_register:: .blkw 1");asm(".org 0x2000""_dual_port_SRAM:: .blkb 100");在C中你仍然要使用"extern"描述变量否则C编译器不会真正知道在asm中的声明C任务 作为汇编界面的描述和调用规则在一些情况下例如实时操作系统RTOS管理着寄存器的保存和恢复并作为任务切换处理的一部分为了禁止这种行为例如注意作为默认的情况它也没有必要为返回保存和恢复任意一个寄存器中断操作C中断操作中断操作中C中可以使用你必须用一个附注在函数定义之前通知编译器这个函数是一个中断操作注意向量号是从1开始的这个附注有两个作用:对中断操作函数而且保存和恢复在函数中用过的全部寄存器例如jmp _timer_handler ;对Mega MCU上述指令定位在0x06Õë¶ÔÆÕͨװÖÃ字节地址Mega 使用2个字作为中断向量如果你希望对多个中断入口使用同一个中断操作分别带有多个不同的向量号#pragma interrupt_handler timer_ovf:7 timer_ovf:8汇编中断操作你可以用汇编语言写中断操作无论如何要小心参考汇编界面C函数不做这些工作那么你必须自己定义向量用".org"来声明rjmp 或jmp指令的正确地址; 对全部除ATMega 以外的MCU.area vectors(abs) ;中断向量.org 0x6rjmp _timer; 对 ATMega MCU.area vectors(abs) ; 中断向量.org 0xCjmp _timer11ÔÚ\icc\examples.avr目录12ÔÚµ÷ÓÃÕâЩº¯Êý֮ǰ¼ÓÈë#include <eeprom.h>"object"可以是任意程序变量包括结构和数组int i;EEPROM_Read(0x1, i); // 读2个字节给iEEPROM_WRITE(int location, object)这个宏调用了EEPROMWriteBytes函数将数据对象写入到EEPROM的指定位置例如int i;EEPROM_WRITE(0x1, i); //写两个字节至0x1这些宏和函数可以用于任意AVR装置即使不需要高地址字节它们也是欠佳的如果它关系重大初始化EEPROMEEPROM可以在你的程序源文件中初始化这是可以用附注实现的例如为返回默认的"data."区域需要重设数据区名称初始化EEPROM数据至0地址是不可以使用的比如访问在另一个文件中的foo你不需要加入这个附注extern int foo;int i;EEPROM_READ((int)&foo, i);内部函数如果需要下列函数可以直接使用unsigned char EEPROMread(int location)从EEPROM指定位置读取一个字节int EEPROMwrite(int location, unsigned char byte)写一个字节到EEPROM指定位置 void EEPROMReadBytes(int location, void *ptr, int size) 从EEPROM指定位置处开始读取"size"个字节至由"ptr."指向的缓冲区写的内容由"ptr."指向的缓冲区提供访问SPI一个以查寻模式访问SPI的函数是提供的 14全部范围内的跳转可以使用相对转移和调用指令(rjmp 和 rcall)Ïà¶ÔתÒƺ͵÷Óõķ¶Î§ÊÇÒÔ8K为分界的一个较远的跳转跳转到0x2100字节处实际上会跳转到地址0x100处只要目标装置的程序存贮器是8K的 C的运行结构17位表示指数1位表示符号而且将被包含在一个较小的空间中struct {unsigned a : 1, b : 1;};这个结构体的长度只有一个1 byte2名称C 语言中的名称在汇编文件中是以下划线为前坠的名称的有效长度为32个字符:可以定义成一个全局变量_foo::.word 1(在C 文件中)extern int foo;b)µÚ¶þ¸ö²ÎÊýÔòͨ¹ýR18/R19传递其余参数通过软件堆栈传递如char int¼´Ê¹º¯ÊýÔ-ÐÍÊÇ¿ÉÓõĶøµÚ¶þ¸ö²ÎÊýÊdz¤ÕûÐÍ»ò¸¡µãÊý¶ø¸ß°ë²¿·Öͨ¹ýÈí¼þ¶ÑÕ»´«µÝ。
ICCAVR的基本使用图解
ICCAVR的基本使⽤图解ICCAVR的基本使⽤图解1、打开ICCAVR⽤⿏标双击桌⾯快捷⽅式。
就可以弹出IICAVR主界⾯。
2、新建⼯程1)、单击project菜单下的new选项,在弹出的save new project as.....填写好⼯程名称并保存。
⼯程管理器中将列出新建⼯程。
2)、单击按钮,弹出的“compiler options”。
在paths选项中output directory中点击browser指定到我们新建⼯程⽬录下。
在target选项中的device configuration下拉单中选择AVR单⽚机型号。
然后点击ok按钮退出。
3、新建⼀个C⽂件,并将它保存到⼯程中1)点击按钮,将弹出⼀个空⽩⽂本。
输⼊我们的程序。
2)点击按钮,在弹出的savefile as.....的中输⼊以.c为后缀的⽂件名,点击保存按钮。
3)在⼯作区右键选择把程序⽂本添加到⼯程中。
4)、程序的编译。
把程序写进.C⽂档中。
点击project下的rebuild all,对程序进⾏编译。
之后对⽂档做修改后可以点击对程序重新编译。
⽤和查找编译中出现的错误。
5)可以利⽤ICCAVR的程序⽣成向导功能⽣成程序格式。
点击在弹出选项对话框。
(1)在cpu选项target cpu下选择avr单⽚机型号,在xtal speed(MHz)下选择晶振的⼯作频率。
(2)在ports下设定IO⼝。
(3)点击options选项,选择include“main()”(4)点击ok⽣成标准⽂档格式。
ICCAVR编译器中文使用说明
ICCAVR编译器中⽂使⽤说明ImageCraft ICCAVR的中⽂使⽤说明翻译詹卫前⼀ 运⾏光盘上的SETUP.EXE程序进⾏安装a?òµ?µ打开光盘驱动器所对应的盘符c SETUP.EXE按照屏幕提⽰a?aê?在对话框中填⼊注意drive对应你的机器中的光盘驱动器盘符cè·?¨其余同⽅法⼀注意 按上述⽅法进⾏安装后对正式版⽤户还要进⾏第⼆步的注册在标准版中有⼀些功能限制代码的压缩2éòaù×¢2áa IDEb Unlock Diskc Help Importing a License from a Floppy Disk2¢?ò??DDµ¥?÷ ICCAVR软件⾃动进⾏注册当你确定并再次重新启动ICCAVR后对不是⾸次安装或使⽤时间已超过30天的⽤户 对这类⽤户在程序启动时已不能进⼊IDE环境你应该选择按钮 这时会出现⼀个注册对话框Importing a License froma Floppy Diskc Unlock Diskµ¥?÷é?ò?2??Dìáµ?µ?°′?¥ ICCAVR软件⾃动进⾏注册当你确定并再次重新启动ICCAVR后注意 软盘在注册时应打开写保护软盘成为⼀张空盘安装和注册 当你需要在不同的电脑中使⽤ICCAVR或在同⼀台电脑中将ICCAVR重新安装在与原来不同的⽬录位置时Help TransferringYour License to a Floppy Diskµ?×¢2át′??íµ?òèí?ìé?t ImageCraft 的ICCAVR介绍ImageCraft 的ICCAVR是⼀种使⽤符合ANSI标准的C语⾔来开发微控制器程序的⼀个⼯具ICCAVR是⼀个综合了编辑器和⼯程管理器的集成⼯作环境源⽂件全部被组织到⼯程之中编译错误显⽰在状态窗⼝中光标会⾃动跳转到编辑窗⼝中引起错误的那⼀⾏INTEL HEX格式⽂件可被⼤多数的编程器所⽀持ICCAVR是⼀个32位的程序出于篇幅考虑仅介绍使⽤ICC AVR所必须具备的知识应对C语⾔有了⼀定程度的理解ICCAVR中的⽂件类型及其扩展名⽂件类型是由它们的扩展名决定的输⼊⽂件这个⽂件保存由IDE所创建和修改的⼀个⼯程的有关信息它可以由⼏个库封装在⼀起如果库被引⽤您也可以创建或修改⼀个符合你需要的库.s 对应每个C语⾔源⽂件.o 由汇编⽂件汇编产⽣的⽬标⽂件.hex INTEL HEX格式⽂件.eep INTEL HEX格式⽂件.cof COFF 格式输出⽂件.lst 列表⽂件.mp 内存映象⽂件.cmd NoICE 2.xx 调试命令⽂件.dbg ImageCraft 调试命令⽂件3编译附注#pragma interrupt_handler : : ...这个附注必须在函数之前定义func2是中断操作函数并且保存和恢复函数所使⽤的全部寄存器#pragma ctask ...这个附注指定了函数不⽣成挥发寄存器来保存和恢复代码#pragma text:改变代码段名称#pragma data:改变数据段名称这个附注在分配全局变量⾄EEPROM 中时必须被使⽤#pragma abs_address:函数与全局数据不使⽤浮动定位这在访问中断向量和其它硬件项⽬时特别有⽤使⽬标程序使⽤正常浮动定位你可以在你的源代码中使⽤C ++的 // 类型的注释你可以使⽤0b<1|0>* 来指定⼆进制常数0b10101等于⼗进制数21áé2ú±à代码转换IAR或其它ANSI C编译系统的代码转换IAR C编译器作为应⽤于AVR的第⼀个C编译器当你从IAR 编译系统转换到ImageCraft编译系统时IAR C中IO寄存器的定义与ICCAVR也是相同的ICCAVR使⽤pragma附注描述中断操作函数interrupt关键字下⾯是⼀个对照#pragma interrupt_handler func:4// 4 是这个中断的向量号ICCAVR可以使多个中断向量共⽤⼀个中断处理函数interrupt [vector_name] func() // vector_name是某⼀个中断向量的名称以增加程序的可读性FLASH存贮器ICCAVR使⽤const关键字来达到相同的⽬的过程调⽤转换在两个编译系统之间函数参数传递使⽤的寄存器是不同的在线汇编IAR不⽀持在线汇编符号三起步⾃你启动IDE后进⼊\icc\examples.avr⽬录并且选择并打开⼯程然后从Project菜单中选择Options命令打开⼯程编译选项然后从Project菜单中选择Make Project命令并且在状态窗⼝中显⽰所有的信息在与源⽂件同⼀个⽬录中输出⼀个⽂件led.hex′ó?àêy?ü?§3?AVR MCU的编程器和模拟器都⽀持这种格式这样就完成了⼀个程序的构筑⽐如AVR Studioú±àò±êCOFF输出⽂件格式你也可使⽤⼯具条或⿏标右键弹出菜单你可以在⼯程窗⼝单击⿏标右键选择编译选项IDE将使⽤编辑器打开这个⽂件作为试验可设置⼀些错误IDE⾸先⾃动保存已经改变的⽂件这时在状态窗⼝中会显⽰错误信息或单击其左边的错误符号基本上所有C编译器都是这样开始⼀个新的⼯程从Project菜单中选择New命令输出⽂件的名称取决于你的⼯程⽂件名称如果你创建⼀个名称为foo.prj的⼯程⾃从创建你⾃⼰的⼯程后并且将这个⽂件加⼊到⼯程⽂件排列中Build?éò?oüèYò×µ?11?t?a??1¤3ìéò?ê1ó?ATMEL的AVR Studio来调试你的代码你可以使⽤应⽤程序向导来⽣成⼀些使⽤有关硬件的初始化代码C程序的剖析⼀个C程序必须定义⼀个main调⽤函数可执⾏因此你也可以在你的⽬标系统中执⾏它⼀个C程序需要设定⽬标环境通常然后是⽆限循环地运⾏让我们看 \icc\examples⽬录中的⽂件led.c/* 为使能够看清LED的变化图案对应LED熄灭*/while (1){/*LED向前步进 */for (i = 0; i < 8; i++)LED_On(i);/* LED向后步进 */for (i = 8; i > 0; i--)LED_On(i);/* LED跳跃*/for (i = 0; i < 8; i += 2)LED_On(i);for (i = 7; i > 0; i -= 2)LED_On(i);}}这个main例程是很简单的它运⾏在⼀个⽆限循环中LED是在LED_On例程中被改变的因为CPU运⾏很快因为延时的实际延时值不能被确定如果这个实际定时时间是重要的其它的例⼦但同样清楚地显⽰了如何⽤C写⼀个中断处理过程四 编译⼀个单独的⽂件正常建⽴⼀个输出⽂件的次序是然⽽这时可以这样操作File Compile File...à′?′DD和中的任意⼀个⽂件应该是打开的编译⼀个⽂件为⽬标⽂件编译⼀个⽂件为输出⽂件注意2′ó2?µ¥中选择命令在对话框中你可以指定⼯程的名称如果你使⽤⼀些已经建⽴的源⽂件Project AddFile(s)áííaFile Newéò??ú2?µ¥中选择或命令来保存⽂件AddFile(s)ò2?é?úµ±?°±à?-′°?ú?Dµ¥?÷êó±êóò?ü将⽂件加⼊已打开的⼯程列表中但也可不作这样要求Project Options3ò?¨ò??ü??µ?±àò??µ±??′|àí1¤3ì11?tê±è?1?òí·t×÷á?DT??IDE会⾃动重新编译已经改变的头⽂件C⽂件必须使⽤扩展名.séòè?òat·??ú1¤3ìáD±í?D1¤3ì1üàí?÷?ú11?t1¤3ìê±′tò?íaµ?t2?óèàí2?éòú±àòDéèóD12êyê1óè?µ?±àò??ò2?é?è?±àò??×°èóD1¤3ì?D为避免你的⼯程⽬录混乱通常这个⽬录是你的⼯程⽬录的⼀个⼦⽬录 编辑窗⼝编辑窗⼝是你与IDE交流信息的主要区域当编译存在错误时编辑器会⾃动将光标定位在错误⾏的位置对C源⽂件中缺少分号编辑器定位于其下⾯⼀⾏ 应⽤构筑向导应⽤构筑向导是⽤于创建外围设备初始化代码的⼀个图形界⾯Wizard Tools ApplicationBuilderó|ó?11?t?òµ?ê1ó?±àòD???¨µ???±êMCU来产⽣相应的选项和代码它的使⽤是很显⽽易见的在这⾥你可以设置MCU的所具有的中断定时器UART2¢2úéú?àó|µ?′ú1?é2úéúmain( )函数 状态窗⼝状态窗⼝显⽰IDE的状态信息 终端仿真IDE有⼀个内置的终端仿真器在系统编程但它可以作为⼀个简单的终端也可下载⼀个ASC从6.20版本开始五弹出菜单在ICCAVR环境中单击右键2新建⼀个⽂件ReopenóD1?àúê·t??ê?µ?óò±?µ?×ó2?µ¥?D打开⼀个已以经存在的⽂件⽤于编辑Reload …form Disk′ó′??ì?D??D?×°??µ±?°t从最后⼀次的备份⽂件中装载当前⽂件保存当前⽂件则将原⽂件以.~形式保存将当前⽂件⽤另外⼀个名称来保存关闭当前⽂件系统会进⾏提⽰编译当前⽂件成⽬标⽂件其主要⽤于为创建新的启动⽂件或库产⽣⽬标⽂件编译当前⽂件成输出⽂件Save AllCloss Allí??ù?ü?áìáê±£′?ò??-DT??µt打印当前⽂件退出ICCAVR的IDE环境Edit Menu编辑菜单UndoRedoCutCopyPasteDeleteSelect AllBlock Indent对选择的整块内容左移4Find…在编辑窗⼝中寻找⼀个⽂本Match Case – 区分⼤⼩写Whole Word – 全字匹配Up/Down –往上或往下Find in Files... –在当前打开的⽂件中或在当前⼯程的所有⽂件中或当前⽬录中的⽂件中寻找⼀段⽂本Case Sensitive –⼤⼩写敏感Whole Word - 全字匹配Regular Expression – 寻找规则的表达式Replace... – 在编辑器中替换⽂本Goto Line Number – 转到指定⾏号Delete Bookmark – 删除书签Goto Bookmark – 跳转到指定的书签View Menu视图菜单Status Window – 如果选中Project Makefile – 以只读⽅式打开makefile ⽂件Output Listing File – 以只读⽅式打开列表⽂件6Open –打开⼀个已经存在的⼯程⽂件Close All Files – 关闭全部打开的⽂件Make Project –解释和编译已经修改的⽂件为输出⽂件注意在版本升级后对原有⼯程最好全部重新构筑这个⽂件可以是⾮源⽂件Option... – 打开⼯程编译选项对话框7UART的波特率éò⽣成硬件的初始化代码Compiler Options 编译选项编译选项总共有三个页⾯Compiler和Target在Paths页⾯中有Include Path(s) –你可以指定包含⽂件的路径Assembler Include Path(s) – 指定汇编包含⽂件的路径Library Path – 链接器所使⽤的库⽂件的路径Strict ANSI C Checking – 严格的ANSI C语法检查Accept Extensions – 接受C++类型语法扩充Macro Define(s) – 定义宏宏定义形式如下DEBUG:1;PRINT=printf等价于#define DEBUG 1#define PRINT printfMacro Undefine(s) –同上Output File Format – 输出⽂件格式COFF/HEXOptimizations – 代码优化Default – 基本优化共⽤相同的⼦例程等Maximize Code Size Reduction – 只有专业版才可使⽤去除了⽆⽤的碎⽚代码Device Configuration – 选择⽬标MCUMemory Sizes – 要选择"Custom" 时指定内存⼤⼩SRAM和EEPROM Text Address – 通常代码地址开始于中断向量区域后⾯通常为0x60Enhanced Core – 指定硬件⽀持增强核指令例如, 8515的SRAM 起始于0x60, 在IO寄存器空间后⾯延伸了512字节因此SRAM也是从0开始的注意这个选项需要很⼤的内存AVR Studio的终端模拟仿真被⽀持Return Stack Size – 指定编译器使⽤的硬件堆栈的⼤⼩Non Default Startup –允许你指定⼀个启动⽂件的位置这样IDE可以使⽤多个启动⽂件六 启动⽂件这个链接器会⾃动将启动⽂件连接到您的程序之前启动⽂件根据⽬标MCU的不同在crtavr.o 和 crtatmega.o 中间任意选择⼀个它也是您的程序的起点12345è?1µ??÷o¯êymain( )⼀旦退出启动⽂件也定义了复位向量具体可参考中断操作部分cd \icc\libsrc.avr; 进⼊你安装的编译器路径; 编辑修改crtavr.s⽂件; ⽤IDE打开crtavr.s⽂件Object">;选择编译到⽬标⽂件你应该⽤"crtatmega" 代替"crtavr"word⽽⾮Mega芯⽚每⼀个中断⼊⼝地址使⽤⼀个字.你也可以有多个启动⽂件注意2è±ê??·ac:\icc\libsrc.avr\libsrc.zipéò?′ó?¥á?í?é?è?òaò???UNZIP程序进⾏解压缩密码显⽰在"About"对话框中unzip -s libsrc.zip; unzip 提⽰输⼊密码2AVR特殊函数----- ICCAVR有许多访问UARTì2éo¯êy???ì2a????ê?·?ò?3?oüóDó?3io*.h (io2313.h, io8515.h, iom603.h, ... 等.)这些⽂件中是从ATMEL官⽅公开的定义IO寄存器的源⽂件经过修改得到的PORTB = 1;uc = PORTA;4macros.h这个⽂件包含了许多有⽤的宏和定义如果你的程序使⽤了头⽂件所列出的函数在使⽤浮点数和长整型数的程序中必须⽤#include预编译指令包含这些包含了这些函数原形的头⽂件assert.h - assert(), 声明宏ctype.h – 字符类型函数float.h – 浮点数原形limits.h – 数据类型的⼤⼩和范围math.h – 浮点运算函数stdarg.h – 变量参数表.stddef.h – 标准定义stdio.h – 标准输⼊输出函数stdlib.h – 包含内存分配函数的标准库string.h – 字符串处理函数3ê1ó??aD?o¯êy°ó|µ±ó?"#include "包含否则返回零int isalpha(int c)如果c是字母返回⾮零数值如FF, BELL, LF ..等否则返回零int isdigit(int c)如果c是数字返回⾮零数值否则返回零int islower(int c)如果c是⼩写字母返回⾮零数值否则返回零int ispunct(int c)如果c是⼀个可打印字符⽽不是空格否则返回零int isspace(int c)如果c是⼀个空格字符返回⾮零数值否则返回零int isupper(int c)如果c是⼤写字母返回⾮零数值否则返回零int tolower(int c)如果c是⼤写字母则返回c对应的⼩写字母int toupper(int c)如果c是⼩写字母则返回c对应的⼤写字母 浮点运算库下列函数⽀持浮点数运算#include·§?ú-之间float ceil(float x)返回对应x的⼀个整型数float cos(float x)返回以弧度形式表⽰的x的余弦值float cosh(float x)返回x的双曲余弦函数值float exp(float x)返回以e为底的x的幂即10xfloat fabs(float x)返回x的绝对值float floor(float x)返回不⼤于x的最⼤整数float fmod(float x, float y)返回x/y的余数float frexp(float x, int *pexp)把浮点数x分解成数字部分yoíò?2为底的指数n两个部分2n y y值被函数返回float fround(float x)返回最接近x的整型数float ldexp(float x, int exp)返回xêy2?·?′?·?µ?pint指向的变量并且作为函数返回值返回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的双曲正切函数值5MCU±ê×?stdio.h的许多内容不可以使⽤同样使⽤之前应⽤"#include "预处理最低层的IO程序是单字符的输⼊(getchar)和输出(putchar)程序例如⽤printf输出LCD为在ATMEL的AVR Studio模拟器使⽤标准IO函数注意单字符输出函数putchar是输出到UART装置没有修改'\n' 字符必须被映射为成对的回车和换⾏格式说明符是标准格式的⼀个⼦集同 %x%u - 输出⽆符号⼗进制整数%s – 输出⼀个以C中空字符NULL结束的字符串%c – 以 ASCII 字符形式输出取决于你的特别需要和代码的⼤⼩代码越⼤基本形: 只有 %c, %d, %x, %u, 和 %s 格式说明符是承认的长整形: 针对长整形数的修改 %ld, %lu, %lx被⽀持, 以适⽤于精度要求较⾼的领域浮点形: 全部格式包括%f 被⽀持你使⽤编译选项对话框来选择版本int putchar(int c)输出单个字符注意输出’\n’字符⾄程序终端窗⼝int sprintf(char *buf, char *fmt)按照格式说明符输出格式化⽂本frm字符串到⼀个缓冲区⽀持功能"const char *" cprintf 和csprintf 是将FLASH中的格式字符串分别以prinf和sprinf形式输出 标准库和内存分配函数标准库头⽂件定义了宏NULL和RAND_MAX和新定义的类型size_t×¢òa?ú??µ÷ó?è?òa?ú′?·3ìDòmalloc和realloc)之前int abs(int i)返回i的绝对值int atoi(char *s)转换字符串s为整型数并返回它否则返回0 double atof(const char *s)转换转换字符串s为双精度浮点数并返回它long atol(char *s)转换字符串s为长整型数并返回它否则返回0void *calloc(size_t nelem, size_t size)分配"nelem"个数据项的内存连续空间如果分配成功返回分配内存单元的⾸地址void exit(status)终⽌程序运⾏它是担任⽤户main函数的返回点如果分配成功则返回内存区地址void _NewHeap(void *start, void *end)初始化内存分配程序的堆符号_bss_end定义为编译器⽤来存放全局变量和字符串的数据内存的结束这个结束值不能被放⼊堆栈中void *realloc(void *ptr, size_t size)重新分配ptr所指向内存区的⼤⼩为size字节返回指向该内存区的地址指针long strtol(char *s, char **endptr, int base)按照"base."的格式转换"s"中起始字符为长整型数* endptr将设定"s"中转换结束的位置除了返回类型为⽆符号长整型数外 字符串函数⽤"#include "预处理后定义了NULLvoid *memchr(void *s, int c, size_t n)在字符串s中搜索n个字节长度寻找与c相同的字符否则返回NULLè?1??àí??ò·µ??0ò·µ1ò·µ-1但拷贝区不可以重迭返回s1µ±′éòµü它返回s·µ??s1包括结束NULL字符如果没有匹配字符找到int strcmp(char *s1, char *s2)⽐较两个字符串如果s1>s2则返回1char *strcpy(char *s1, char *s2)拷贝字符串s2⾄字符串s1size_t strcspn(char *s1, char *s2)在字符串s1搜索与字符串s2匹配的第⼀个字符其返回s1中找到的匹配字符的索引不包括结束NULL字符不含结束NULL字符如果s2长度⽐n⼩返回s1µ±è???°n个字符但其只拷贝前n个字符但它返回的是在s1匹配字符的地址指针char *strrchr(char *s, int c)在字符串s中搜索最后出现的c·??ò·µ??NULL°üà¨?áê?NULL字符中找到的第⼀个不匹配字符的索引如果成功它返回s1中匹配⼦字符串的地址指针⽀持函数"const char *" 这些函数除了它的操作对象是在FLASH中常数字符串外size_t cstrlen(const char *s)char *cstrcpy(char *dst, const char *src);int cstrcmp(const char *s1, char *s2);8ü¨òá2è·¨µààDíva_list和三个宏分派指定的类型如int ⼩的整型类型如"char"不能被⽀持printf()可以使⽤vfprintf()来实现#includeint printf(char *fmt, ...){va_list ap;va_start(ap, fmt);vfprintf(fmt, ap);va_end(ap);}9ú′?í?è′èí?tµ??úèY???á±???±?ó2?tê?ó?×÷o¯êyµ?·µ??µ??·同样地如果你使⽤动态分配内存警戒线警戒线数据区低端地址警戒线启动代码写了⼀个正确的关于数据区的地址字节和⼀个类似的正确的关于软件堆栈的地址字节作为警戒线如果你使⽤了你⾃⼰的启动⽂件你将需要额外改造为新的启动⽂件如果你使⽤动态分配内存参考内存分配函数如果警戒线字节仍然保持正确的值那么函数检查通过那么警戒线字节将可能被破坏你的程序将可能运⾏不正常或偶然崩溃_StackOverflowed(char c)它调⽤了带⼀个参数的函数那么硬件堆栈有过溢出那么软件堆栈曾经溢出它是两个堆栈都可能溢出的在_StackOverflowed执⾏起作⽤时作为例⼦那么将不能返回_StackCheck函数库会⽤⼀个缺省的_StackOverflowed函数来跳转到0的位置你可能希望⽤⼀个函数来代替它以指⽰更多的错误条件注意⾃堆栈溢出指⽰故障程序以来macros.h.中这两个函数的原型在头⽂件七 访问AVR的低层硬件AVR系列使⽤⾼级语⾔编程时有很⾼的C语⾔密度由于AVR性能偶然情况下⽬标MCU的硬件特点在C语⾔中不能很好地使⽤头⽂件io*.h iom603.h等这些⽂件是从ATMEL官⽅发布的⽂件经过修改⽂件macros.h定义了许多有⽤的宏这个编译器的效率很⾼outsbi等注意尽管io*.h定义了它们的bit 的位置很多时候你将需要使⽤定义在macros.h⽂件中的BIT()宏avr.h:#define SRE0x80// 外部 RAM 使能... (你的C程序)MCUCR |= SRE;io8515.h#define SRE7... (你的C程序)#includeMCUCR |= BIT(SRE);2bit很幸运⽽没有借助于汇编指令或其它⾮标准C结构a |b – 按位或这惯⽤于打开某些位例如这个运算在检查某些位是否置1时有⽤If ((PORTA & 0x81) == 0)// 检查位7和位0注意圆括号需要括在&运算符的周围这是C程序中很多错误的原因之⼀这个运算对⼀个位取反有⽤在下⾯的例⼦中PORTA ^= 0x80;// 翻转位7~a – 按位取反. 在表达式中这个运算执⾏⼀个取反与这个运算组合使⽤尤其有⽤PORTA &= ~0x80;// 关闭位7这个编译器对这些运算能产⽣最理想的机器指令sbic指令可以⽤在根据位的状态进⾏条件分枝的按位与运算中 程序存贮器和常量数据AVR是哈佛结构的MCU?a?ùµ?éè??ê?óDò?D?ó?µ?µ?·??aµ?µ??·êDíAVR装置⽐传统结构访问更多的存贮器Atmega系列允许有超过64K字的程序存贮器和64K字节的数据存贮器⽽程序计数器仍保留在16位上C不是在这种机器上发明的C指针是任意⼀个数据指针或函数指针可是同是哈佛结构的AVR⾮标准C解决了这个问题序存贮器中这个const限定词可以应⽤于不同的场合例如"ptr1"是⼀个项⽬在数据存贮器⽽指向数据的指针在程序存贮器最后在⼤多数的例⼦中"table" 和和"ptr1"是很典型的注意C标准不要求"const"数据是放⼊只读存贮器中除了正确访问就没有要紧的了在承认参数的C标准中使⽤const限定是⾮传统的这样做与标准C函数定义是有⼀定冲突的标准"strcpy"的原型是strcpy(char *dst, const char *src)èúICCAVR下因此这些函数定义设有const限制注意只有常数变量以⽂件存贮类型放⼊FLASH中如果你使⽤有const限制的局部变量4aò3µ÷×·′?×?à§??µ?ê?×?·?′?µ?·oí′|àíè?1?×?·?′?ê?·3ìDò′??ü?÷?Dò×·′?ò2±?D?±?·úêy?Y′??ü?÷?D缺省的字符串分配这个缺省的⽅法是同时分配字符串在数据和程序存贮器中为了确保它们的值是正确的因此只有单⼀的字符串拷贝函数是必须的你能使⽤常量字符型数组来将字符串只分配进程序存贮器中const char hello[] = "Hello World";在这个例⼦中但不能⽤作标准C库中字符串函数的参数另外只分配全部字符串到FLASH存贮器中当对应"Project->Options->Target->Strings In FLASH Only"检查框被选中时这时称必须很⼩⼼地调⽤库函数字符串类型"const char *"是有效的。
AVR单片机教程7—第七课ICCAVR使用教程
AVR单片机教程7—第七课ICCAVR使用教程AVR单片机是一种高性能、低功耗的8位微控制器,因其易于使用和广泛应用于各种嵌入式系统而备受欢迎。
本教程将带您深入了解AVR单片机的编程和应用,特别是介绍第七课程ICCAVR的使用。
ICCAVR是一种基于AVR系列单片机的集成开发环境,它提供了丰富的功能和工具,有助于简化和加速单片机的开发过程。
在本节课中,我们将学习如何使用ICCAVR进行AVR单片机的编程。
一、ICCAVR的安装与配置在开始使用ICCAVR之前,首先需要下载并安装该软件。
您可以在官方网站上找到ICCAVR的最新版本,并按照安装向导进行安装。
安装完成后,打开ICCAVR,进入设置界面,完成对编译器、调试器和单片机型号的配置。
确保所选的单片机型号与您所使用的AVR单片机一致,这样才能保证编程的准确性和兼容性。
二、新建工程在ICCAVR中,您可以创建一个新的工程来开始编程。
选择“文件”-“新建”-“项目”,然后选择单片机型号和存储工程的路径。
点击“确定”后,ICCAVR将自动生成一个空的工程,供您编写代码和调试。
三、编写代码在ICCAVR的工程中,您可以添加源文件和头文件。
源文件中包含了您的程序代码,而头文件则用于声明变量、函数和宏定义等。
编写代码时,您可以使用C语言或汇编语言进行编程。
C语言是一种高级语言,更易于使用和理解,适合大多数应用场景。
而汇编语言则更接近底层硬件,可以直接控制单片机的各个寄存器和引脚,适用于对性能要求较高的应用。
四、编译和烧录在编写完代码后,可以使用ICCAVR提供的编译器将代码转换为可执行文件。
选择“生成”-“编译”,ICCAVR会检查代码中的语法错误并生成可执行文件。
生成可执行文件后,您可以选择烧录器将程序烧录到AVR单片机中。
连接烧录器到电脑,并将AVR单片机与烧录器连接好。
选择“烧录”-“烧录器设置”,然后选择正确的烧录器和单片机型号。
点击“烧录”按钮,ICCAVR会自动将程序加载到单片机中进行烧录。
ICCAVR安装及使用教程
ICCAVR安装及使用教程
一、ICCAVR的安装
二、ICCAVR的使用
1.创建新项目:双击桌面上的ICCAVR图标,启动ICCAVR。
在主界面
点击“文件”菜单,然后选择“新建项目”。
在弹出的对话框中输入项目
的名称和路径,点击“确定”按钮创建项目。
3. 编译代码:在ICCAVR主界面的工具栏上点击“编译”按钮,或者
使用快捷键“Ctrl + F9”进行代码编译。
编译过程中,ICCAVR会检查语
法错误并生成可执行文件。
4. 仿真调试:在ICCAVR主界面的工具栏上点击“仿真”按钮,或者
使用快捷键“Ctrl + F5”进行仿真调试。
ICCAVR会启动内置的仿真器,
并自动加载可执行文件。
通过调试按钮进行单步调试或设置断点来查找和
解决问题。
7.项目管理:在ICCAVR主界面的工具栏上点击“项目”按钮,然后
选择“属性”进行项目属性设置。
可以设置芯片类型、时钟频率等参数。
此外,还可以添加和管理项目中的文件、文件夹和资源。
8.保存退出:在使用ICCAVR进行开发过程中,需要经常保存和退出。
在主界面点击“文件”菜单,选择“保存”或“另存为”来保存项目和文件。
点击“文件”菜单再选择“退出”按钮来退出ICCAVR。
通过上述步骤,您应该已经学会了如何安装和使用ICCAVR进行嵌入
式软件开发。
通过不断的练习和实践,您将可以熟练掌握ICCAVR的各项
功能,并能够高效地开发和调试嵌入式系统。
祝您在嵌入式软件开发的道路上取得成功!。
ICCAVR教程
ICCAVR 是 一 个 综 合 了 编 辑 器 和 工 程 管 理 器 的 集 成 工 作 环 境 IDE 其 可 在 WINDOWS9X/NT 下工作
源文件全部被组织到工程之中 文件的编辑和工程的构筑也在这个环境中完成 编译 错误显示在状态窗口中 并且当你用鼠标单击编译错误时 光标会自动跳转到编辑窗口中 引起错误的那一行 这个工程管理器还能直接产生您希望得到的可以直接使用的 INTEL HEX 格式文件 INTEL HEX 格式文件可被大多数的编程器所支持 用于下载程序到芯片 中去
2 对安装完成的软件进行注册 对首次安装并且使用期未超过 30 天的用户 可以这样注册 a 启动 ICC AVR 编译器的集成环境 IDE b 将正式版中附带的一张名称为 Unlock Disk 的软盘插入你机器的软驱器中 c 在 IDE 的 Help 菜单中寻找标题为 Importing a License from a Floppy Disk 的一项 并且进行单击 d ICCAVR 软件自动进行注册 当注册完成后会提示你注册文件已从软盘移走 当你确定并再次重新启动 ICCAVR 后 会发现软件已经完成注册 对不是首次安装或使用时间已超过 30 天的用户 可这样注册 a 对这类用户在程序启动时已不能进入 IDE 环境 而是出现一个提示你注册的 对话框 你应该选择 YES 按钮 b 这时会出现一个注册对话框 对话框上有一个标题为 Importing a License from a Floppy Disk 的按钮 c 将正式版中附带的一张名称为 Unlock Disk 的软盘插入你机器的软盘驱动 器中 单击上一步中提到的按钮 d ICCAVR 软件自动进行注册 当注册完成后会提示你注册文件已从软盘移走 当你确定并再次重新启动 ICCAVR 后 会发现软件已经完成注册 注意 Unlock Disk 软盘在注册时应打开写保护 否则无法完成注册 完成注册后 Unlock Disk 软盘成为一张空盘 不可以在另一台机器上进行 安装和注册 当你需要在不同的电脑中使用 ICCAVR 或在同一台电脑中将 ICCAVR 重新安 装在与原来不同的目录位置时 应该首先在 Help 菜单中选择 Transferring
ICCAVR使用快速入门
ICCAVR使用快速入门ICCAVR(Integrated Concurrent C Language and AVR)是一种基于嵌入式系统的编程语言,可以用于开发和控制单片机等硬件设备。
使用ICCAVR可以实现对硬件设备的操作和控制,并编写各种嵌入式系统应用程序。
以下是ICCAVR的快速入门指南,以帮助您开始使用这个强大的嵌入式系统编程语言。
2.创建新项目:打开ICCAVR软件后,您可以创建一个新的项目。
在项目中,您可以编写和管理多个源文件,并定义所需的硬件设备配置和库文件。
3.编写源代码:在新项目中,您可以使用ICCAVR的编译器和IDE(集成开发环境)来编写源代码。
ICCAVR支持C语言,因此您可以使用C语言的语法和特性来编写代码。
在代码中,您可以使用ICCAVR提供的库函数来操作硬件设备,如GPIO(通用输入输出)口、串口、定时器等。
4.编译和调试代码:在编写完源代码后,您可以使用ICCAVR的编译器将源代码编译为目标代码。
编译后,ICCAVR会生成可执行的机器码文件。
您可以使用ICCAVR的调试工具来调试和测试代码,以确保代码的正确性和稳定性。
5.烧写和运行代码:在调试通过后,您可以使用ICCAVR或其他的固件烧写工具将目标代码烧写到硬件设备中。
烧写完成后,您可以将硬件设备连接到电源,并观察代码的运行情况。
6.调优和优化代码:通过观察代码的运行情况,您可以发现和解决潜在的问题和优化代码。
ICCAVR提供了一系列的优化功能和性能工具,可以帮助您发现代码中的性能瓶颈和内存泄漏等问题,并进行改进和优化。
以上是ICCAVR的快速入门指南。
通过学习和掌握ICCAVR的使用,您可以编写出高质量和高可靠性的嵌入式系统应用程序,并将其应用于各种硬件设备。
祝您编程愉快!。
iccavr使用说明
ICCAVR中文使用说明(1)ImageCraft ICCAVR 的中文使用说明ICCAVR 介绍1 ImageCraft 的ICCAVR 介绍ImageCraft 的ICCAVR 是一种使用符合ANSI 标准的C 语言来开发微控制器MCU程序的一个工具它有以下几个主要特点ICCAVR 是一个综合了编辑器和工程管理器的集成工作环境IDE 其可在WINDOWS9X/NT 下工作源文件全部被组织到工程之中文件的编辑和工程的构筑也在这个环境中完成编译错误显示在状态窗口中并且当你用鼠标单击编译错误时光标会自动跳转到编辑窗口中引起错误的那一行这个工程管理器还能直接产生您希望得到的可以直接使用的INTEL HEX 格式文件INTEL HEX 格式文件可被大多数的编程器所支持用于下载程序到芯片中去ICCAVR 是一个32 位的程序支持长文件名出于篇幅考虑本说明书并不介绍通用的C 语言语法知识仅介绍使用ICC AVR 所必须具备的知识因此要求读者在阅读本说明书之前应对C 语言有了一定程度的理解2 ICCAVR 中的文件类型及其扩展名文件类型是由它们的扩展名决定的IDE 和编译器可以使用以下几种类型的文件输入文件.c 扩展名----表示是C 语言源文件.s 扩展名----表示是汇编语言源文件.h 扩展名----表示是C 语言的头文件.prj 扩展名----表示是工程文件这个文件保存由IDE 所创建和修改的一个工程的有关信息.a 扩展名----库文件它可以由几个库封装在一起libcavr.a 是一个包含了标准C 的库和AVR 特殊程序调用的基本库如果库被引用链接器会将其链接到您的模块或文件中您也可以创建或修改一个符合你需要的库输出文件.s 对应每个C 语言源文件由编译器在编译时产生的汇编输出文件.o 由汇编文件汇编产生的目标文件多个目标文件可以链接成一个可执行文件.hex INTEL HEX 格式文件其中包含了程序的机器代码.eep INTEL HEX 格式文件包含了EEPROM 的初始化数据.cof COFF 格式输出文件用于在ATMEL 的AvrStudio 环境下进行程序调试.lst 列表文件在这个文件中列举出了目标代码对应的最终地址.mp 内存映象文件它包含了您程序中有关符号及其所占内存大小的信息.cmd NoICE 2.xx 调试命令文件.noi NoICE 3.xx 调试命令文件.dbg ImageCraft 调试命令文件3 附注和扩充#pragma 编译附注这个编译器接受以下附注#pragma interrupt_handler <func1>:<vector number> <func2>:<vector> ...这个附注必须在函数之前定义它说明函数func1 func2 是中断操作函数所以编译器在中断操作函数中生成中断返回指令reti 来代替普通返回指令ret 并且保存和恢复函数所使用的全部寄存器同样编译器根据中断向量号vector number 生成中断向量地址#pragma ctask <func1> <func2>...这个附注指定了函数不生成挥发寄存器来保存和恢复代码它的典型应用是在RTOS实时操作系统中让RTOS 核直接管理寄存器#pragma text:<name>改变代码段名称使其与命令行选项相适应#pragma data:<data>改变数据段名称使其与命令行选项相适应这个附注在分配全局变量至EEPROM中时必须被使用读者可参考访问EEPROM 的例子#pragma abs_address:<address>函数与全局数据不使用浮动定位重定位而是从<address>开始分配绝对地址这在访问中断向量和其它硬件项目时特别有用#pragma end_abs_address结束绝对定位使目标程序使用正常浮动定位C++ 注释如果你选择了编译扩充(Project->Options->Compiler) 你可以在你的源代码中使用C ++ 的 // 类型的注释二进制常数如果你选择了编译扩充(Project->Options->Compiler) 你可以使用0b<1|0>* 来指定二进制常数例如0b10101 等于十进制数21在线汇编你可以使用asm("string")函数来指定在线汇编代码读者可参考在线汇编4 代码转换IAR 或其它ANSI C 编译系统的代码转换IAR C 编译器作为应用于AVR 的第一个C 编译器它有十分丰富的源代码当你从IAR编译系统转换到ImageCraft 编译系统时绝大多数符合ANSI C标准的程序代码不需要转换IAR C 中IO 寄存器的定义与ICCAVR 也是相同的中断操作描述ICCAVR 使用pragma 附注描述中断操作函数而IAR 引入了语法扩充interrupt 关键字下面是一个对照在ICCAVR 中#pragma interrupt_handler func:4 // 4 是这个中断的向量号func 为中断处理函数名称ICCAVR 可以使多个中断向量共用一个中断处理函数在IAR 中interrupt [vector_name] func() // vector_name 是某一个中断向量的名称IAR C 的中断向量地址使用中断名称来代替以增加程序的可读性扩充关键字IAR 引入flash 关键字将项目分配进入程序存贮空间FLASH 存贮器ICCAVR 使用const 关键字来达到相同的目的过程调用转换在两个编译系统之间函数参数传递使用的寄存器是不同的这仅影响手工写的汇编函数在线汇编宏等IAR 不支持在线汇编符号而ICCAVR 支持在线汇编ICCAVR中文使用说明(2)1 起步自你启动IDE 后首先从Project 菜单系统选择Open 命令进入\icc\examples.avr 目录并且选择并打开led 工程工程管理器显示在这个工程中只有一个文件 led.c 然后从Project 菜单中选择Options 命令打开工程编译选项在"Target"标号下选择目标处理器然后从Project 菜单中选择Make Project 命令IDE 将调用编译器编译这个工程文件并且在状态窗口中显示所有的信息如果没有错误在与源文件同一个目录在这个例子中是\icc\examples.avr 中输出一个文件 led.hex 这个文件是INTEL HEX 格式大多数能支持AVR MCU 的编程器和模拟器都支持这种格式并且能下载这个程序进入你的目标系统这样就完成了一个程序的构筑如果你希望用支持COFF 调试信息的工具来测试你的程序比如AVR Studio 那么你需要从Project 菜单中选择Options 命令在编译标签下选择COFF 输出文件格式对一些常用的功能你也可使用工具条或鼠标右键弹出菜单例如你可以在工程窗口单击鼠标右键选择编译选项在工程窗口中双击文件名IDE 将使用编辑器打开这个文件按这个方法打开led.c作为试验可设置一些错误例如从一行中删除分号现在从Project 菜单中选择Make Project 命令IDE 首先自动保存已经改变的文件并且开始编译这个文件这时在状态窗口中会显示错误信息单击状态窗口中错误信息行或单击其左边的错误符号光标将移到编辑器中错误行的下面一行上基本上所有C 编译器都是这样开始一个新的工程从Project 菜单中选择New 命令并且浏览至你希望输出工程文件的目录输出文件的名称取决于你的工程文件名称例如如果你创建一个名称为foo.prj 的工程那么输出文件名称为foo.hex 或foo.cof 等自从创建你自己的工程后你可以开始写你的源代码(C 或汇编格式) 并且将这个文件加入到工程文件排列中单击工具栏中Build 图标可以很容易地构筑这个工程IDE 输出与ATMEL 的AVR Studio 完全兼容的COFF 文件你可以使用ATMEL 的AVR Studio 来调试你的代码为更容易地使用这个开发工具你可以使用应用程序向导来生成一些使用有关硬件的初始化代码2 C 程序的剖析一个C 程序必须定义一个main 调用函数编译器会将你的程序与启动代码和库函数链接成一个可执行文件因此你也可以在你的目标系统中执行它启动代码的用途在启动文件中很详细地被描述了一个C 程序需要设定目标环境启动代码初始化这个目标使其满足所有的要求通常你的main 例程完成一些初始化后然后是无限循环地运行作为例子让我们看 \icc\examples 目录中的文件led.c#include <io8515.h>/* 为使能够看清LED 的变化图案延时程序需要有足够的延时时间*/void Delay(){unsigned char a, b;for (a = 1; a; a++)for (b = 1; b; b++);}void LED_On(int i){PORTB = ~BIT(i); /* 低电平输出使LED 点亮 */Delay();}void main()4{int i;DDRB = 0xFF; /*定义 B口输出*/PORTB = 0xFF; /* B 口全部为高电平对应LED 熄灭*/while (1){/*LED 向前步进 */for (i = 0; i < 8; i++)LED_On(i);/* LED 向后步进 */for (i = 8; i > 0; i--)LED_On(i);/* LED 跳跃*/for (i = 0; i < 8; i += 2)LED_On(i);for (i = 7; i > 0; i -= 2)LED_On(i);}}这个main 例程是很简单的在初始化一些IO 寄存器后之后它运行在一个无限循环中并且在这个循环中改变LED 的步进图案LED 是在LED_On 例程中被改变的在LED_On 例程中直接写正确的数值到IO 端口因为CPU 运行很快为能够看见图案变化LED_On 例程调用了延时例程因为延时的实际延时值不能被确定这一对嵌套循环只能给出延时的近似延时时间如果这个实际定时时间是重要的那么这个例程应该使用硬件定时器来完成延时其它的例子8515intr.c 程序很简单但同样清楚地显示了如何用C 写一个中断处理过程这两个例子可以作为你的程序的起点四ICCAVR 的IDE 环境1 编译一个单独的文件正常建立一个输出文件的次序是你首先应该建立一个工程文件并且定义属于这个工程的所有文件然而我们有时也需要将一个文件单独地编译为目标文件或最终的输出文件这时可以这样操作从IDE 菜单File 中选择Compile File... 命令来执行to Object 和to Output 中的任意一个当你调用这个命令时文件应该是打开的并且在编辑窗口中可以编辑的编译一个文件为目标文件to Object 对检查语法错误和编译一个新的启动文件是很有用的编译一个文件为输出文件to Output 对较小的并且是一个文件的程序较为有用注意这里使用默认的编译选项2 创建一个新的工程为创建一个新的工程从菜单Project 中选择New 命令IDE 会弹出一个对话框在对话框中你可以指定工程的名称这也是你的输出文件的名称如果你使用一些已经建立的源文件你可在菜单Project 中选择AddFile(s) 命令另外你可以在菜单File 中选择New 命令来建立一个新的源文件来输入你的代码你可以在菜单File 中选择Save 或Save As 命令来保存文件然后你可以象上面所述调用AddFile(s) 命令将文件加入到工程中也可在当前编辑窗口中单击鼠标右键选择Add to Project 将文件加入已打开的工程列表中通常你输出源文件在工程同一个目录中但也可不作这样要求工程的编译选项使用菜单中Project 中的Options 命令3 工程管理工程管理允许你将多个文件组织进同一个工程而且定义它们的编译选项这个特性允许你将工程分解成许多小的模块当你处理工程构筑时只有一个文件被修改和重新编译如果一个头文件作了修改当你编译包含这个头文件的源文件时IDE 会自动重新编译已经改变的头文件一个源文件可以写成C 或汇编格式的任意一种C 文件必须使用.c 扩展名汇编文件必须使用.s 扩展名你可以将任意文件放在工程列表中例如你可以将一个工程文档文件放在工程管理窗口中工程管理器在构筑工程时对源文件以外的文件不予理睬对目标器件不同的工程可以在编译选项中设置有关参数当你新建一个工程时使用默认的编译选项你可以将现有编译选项设置成默认选项也可将默认编译选项装入现有工程中默认编译选项保存在default.prj 文件中为避免你的工程目录混乱你可以指定输出文件和中间文件到一个指定的目录通常这个目录是你的工程目录的一个子目录4 编辑窗口编辑窗口是你与IDE 交流信息的主要区域在这个窗口中你可以修改相应的文件当编译存在错误时用鼠标单击有关错误信息时编辑器会自动将光标定位在错误行的位置注意对C 源文件中缺少分号的错误编辑器定位于其下面一行5 应用构筑向导应用构筑向导是用于创建外围设备初始化代码的一个图形界面你可以单击工具条中的Wizard 按钮或菜单Tools 中的ApplicationBuilder 命令来调用它应用构筑向导使用编译选项中指定的目标MCU来产生相应的选项和代码应用构筑向导显示目标MCU 的每一个外围设备子系统它的使用是很显而易见的在这里你可以设置MCU 的所具有的中断内存定时器IO 端口UART SPI 和模拟量比较器等外围设备并产生相应的代码如果你需要的话还可产生main( )函数6 状态窗口状态窗口显示IDE 的状态信息7 终端仿真IDE 有一个内置的终端仿真器注意它不包含任意一个ISP 在系统编程功能但它可以作为一个简单的终端或许可以显示你的目标装置的调试信息也可下载一个ASC 码文件从6.20 版本开始IDE 加入了对ISP 的支持五菜单解释1 弹出菜单在ICCAVR 环境中单击右键那么ICCAVR 会根据实际情况弹出相应的工具菜单2 File Menu 文件菜单New 新建一个文件你可在编辑窗口是输入文字或代码Reopen 重新打开历史文件有关历史文件显示的右边的子菜单中Open 打开一个已以经存在的文件用于编辑文件用浏览窗口选择Reload … form Disk 放弃全部的修改从磁盘中重新装载当前文件Reload ….from Back UP 从最后一次的备份文件中装载当前文件Save 保存当前文件如果环境设置中设置了保存备份文件则将原文件以<file>.~<ext>形式保存Save as 将当前文件用另外一个名称来保存Close 关闭当前文件如果文件有过修改系统会进行提示Compile File … to Object 编译当前文件成目标文件注意目标文件不可以直接用于对芯片编程或用于调试其主要用于语法检查为创建新的启动文件或库产生目标文件Compile File ... to Output 编译当前文件成输出文件其产生的输出文件可用于编程器和调试器Save All 保存所有打开的文件Closs All 关闭当前打开的所有文件同样它会提示你保存已经修改的文件Print 打印当前文件Exit 退出ICCAVR 的IDE 环境3 Edit Menu 编辑菜单Undo 撤消最后一次的修改Redo 撤消最后一次的UndoCut 剪切选择的内容到剪帖板Copy 拷贝选择的内容到剪帖板Paste 将剪帖板内容粘帖在当前光标的位置Delete 删除选择的内容Select All 选择全部内容Block Indent 对选择的整块内容右移Block Outdent 对选择的整块内容左移4 Search menu 寻找菜单Find …在编辑窗口中寻找一个文本它有以下选项Match Case –区分大小写Whole Word –全字匹配Up/Down –往上或往下Find in Files... –在当前打开的文件中或在当前工程的所有文件中或当前目录中的文件中寻找一段文本它有以下选项Case Sensitive –大小写敏感Whole Word - 全字匹配Regular Expression –寻找规则的表达式Replace... –在编辑器中替换文本Find Again –寻找下一个Goto Line Number –转到指定行号Add Bookmark –添加书签Delete Bookmark –删除书签Next Bookmark –跳转到下一个签Goto Bookmark –跳转到指定的书签5 View Menu 视图菜单Status Window –如果选中显示状态窗口Project Makefile –以只读方式打开makefile 文件Output Listing File –以只读方式打开列表文件6 Project Menu 工程菜单New... –创建一个新的工程文件Open –打开一个已经存在的工程文件Open All Files... –打开工程的全部源文件Close All Files –关闭全部打开的文件Reopen... –重新打开一个最近打开过的工程文件Make Project –解释和编译已经修改的文件为输出文件Rebuild All –重新构筑全部文件注意在版本升级后对原有工程最好全部重新构筑Add File(s) –添加一个文件到工程中这个文件可以是非源文件Remove Selected Files –从工程中删除选择的文件Option... –打开工程编译选项对话框Close –关闭工程Save As... –将工程换一个名称存盘7 Tools Menu 工具菜单Environment Options –打开环境和终端仿真器选项对话框Editor and Print Options –打开编辑和打印选项对话框AVR Calc –打开AVR 计算器可以计算UART 的波特率定时器的定时常数Application Builder –打开应用向导程序生成硬件的初始化代码Configure Tools –允许你添加自己的内容到工具菜单Run –以命令行方式运行一个程序8 Compiler Options 编译选项编译选项总共有三个页面Paths Compiler 和Target在Paths 页面中有Include Path(s) –你可以指定包含文件的路径Assembler Include Path(s) –指定汇编包含文件的路径Library Path –链接器所使用的库文件的路径Output Directory –输出文件的目录Compiler 页面有Strict ANSI C Checking –严格的ANSI C 语法检查Accept Extensions –接受C++类型语法扩充Macro Define(s) –定义宏宏之间用空格或分号分开宏定义形式如下name[:value] 或 name[=value]例如DEBUG:1;PRINT=printf等价于#define DEBUG 1#define PRINT printfMacro Undefine(s) –同上但意义相反Output File Format –输出文件格式COFF/HEX Intel HEX 或COFFOptimizations –代码优化Default –基本优化象寄存器分配共用相同的子例程等Maximize Code Size Reduction –只有专业版才可使用它调用了代码压缩优化去除了无用的碎片代码Target 页面有Device Configuration –选择目标MCUMemory Sizes –要选择"Custom" 时指定内存大小包括ROM SRAM 和EEPROMText Address –通常代码地址开始于中断向量区域后面Data Address –指定数据起始地址通常为0x60Use Long JMP/CALL –指定MCU 是否支持长跳转和长调用Enhanced Core –指定硬件支持增强核指令IO Registers Offset Internal SRAM –指定内部SRAM 的偏移量例如, 8515 的SRAM 起始于0x60, 在IO 寄存器空间后面延伸了512 字节而 Mega603 , IO 寄存器覆盖在SRAM 空间中因此SRAM 也是从0 开始的Internal 对External SRAM –指定你的目标系统的数据SRAM 类型PRINTF Version –选择PRINTF 的版本Small 或 Basic: 只有 %c, %d, %x, %X, %u, and %s 格式支持Long: 支持 %ld, %lu, %lx, %lXFloating point: %f 支持注意这个选项需要很大的内存AVR Studio Simulator IO –如果选中 AVR Studio 的终端模拟仿真被支持Additional Libraries –使用标准库以外的附加库Strings in FLASH –字符串只保存在FLASH存贮器中Return Stack Size –指定编译器使用的硬件堆栈的大小编译器使用的软件堆栈的大小不需地指定Non Default Startup –允许你指定一个启动文件的位置系统默认的启动文件在Paths 页中指定这样IDE 可以使用多个启动文件Unused ROM Fill Pattern –用一串十六进制数填充空余的ROM 空间ICCAVR中文使用说明(3)C 库函数与启动文件1 启动文件这个链接器会自动将启动文件连接到您的程序之前并将标准库libcavr.a 与你的程序相连接启动文件根据目标MCU 的不同在crtavr.o 和 crtatmega.o 中间任意选择一个启动文件定义了一个全局符号__start 它也是您的程序的起点启动文件的功能有1 初始化硬件和软件堆栈指针2 从idata 区拷贝初始化数据到直接寻址数据区data 区3 将bss 区全部初始化为零4 调用用户主例程main 函数5 定义一个退出点如果你的主函数main( )一旦退出它将进入这个退出点进行无限循环启动文件也定义了复位向量你不需要修改启动文件来使用别的中断具体可参考中断操作部分为修改和使用新的启动文件cd \icc\libsrc.avr ; 进入你安装的编译器路径<edit crtavr.s> ; 编辑修改crtavr.s 文件<open crtavr.s using the IDE> ; 用IDE 打开crtavr.s 文件<Choose "Compile File To->Object"> ;选择编译到目标文件创建一个新的crtavr.o copy crtavr.o ..\lib ; 拷贝到库目录如果您使用的目标MCU 是Mega 你应该用"crtatmega" 代替"crtavr" 注意Mega 的每个中断入口地址使用两个字word 而非Mega 芯片每一个中断入口地址使用一个字word .你也可以有多个启动文件你可以在工程选项对话框中很方便地直接指定一个启动文件加入您的工程中注意您必须指定启动文件的绝对路径或启动文件必须位于工程选项库路径所指定的目录中2 常用库介绍1 库源代码这个库源代码缺省路径为c:\icc\libsrc.avr\libsrc.zip 是一个密码保护的ZIP 压缩文件你可以从互连网上任意下载一个UNZIP 程序进行解压缩当本软件被开锁后密码显示在"About"对话框中例如unzip -s libsrc.zip; unzip 提示输入密码2 AVR 特殊函数----- ICCAVR 有许多访问UART EEPROM 和SPI 的函数堆栈检查函数对检测堆栈是否溢出很有用另外我们的互连网上有一个页专门存放用户写的源代码3 io*.h (io2313.h, io8515.h, iom603.h, ... 等.)这些文件中是从ATMEL 官方公开的定义IO 寄存器的源文件经过修改得到的应该用这些文件来代替老的avr.h 文件PORTB = 1;uc = PORTA;4 macros.h这个文件包含了许多有用的宏和定义5 其它头文件下列标准的C 头文件是被支持的如果你的程序使用了头文件所列出的函数那么包含头文件是一个好习惯在使用浮点数和长整型数的程序中必须用 #include 预编译指令包含这些包含了这些函数原形的头文件读者可参考返回非整型值的函数assert.h - assert(), 声明宏ctype.h –字符类型函数float.h –浮点数原形limits.h –数据类型的大小和范围math.h –浮点运算函数stdarg.h –变量参数表.stddef.h –标准定义stdio.h –标准输入输出IO 函数stdlib.h –包含内存分配函数的标准库string.h –字符串处理函数3 字符类型库下列函数按照输入的ACS II 字符集字符分类使用这些函数之前应当用"#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 对应的小写字母其它类型仍然返回cint toupper(int c)如果c 是小写字母则返回c 对应的大写字母其它类型仍然返回c4 浮点运算库下列函数支持浮点数运算使用这些函数之前必须用#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 的幂即exfloat exp10(float x)返回以10 为底的幂即10xfloat 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 e x pfloat 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 的双曲正切函数值5 标准输入输出库标准的文件输入输出是不能真正植入微控制器MCU 的标准stdio.h 的许多内容不可以使用不过有一些IO 函数是被支持的同样使用之前应用"#include <stdio.h>"预处理并且需要初始化输出端口最低层的IO 程序是单字符的输入(getchar)和输出(putchar)程序如果你针对不同的装置使用高层的IO 函数例如用 printf 输出LCD 你需要全部重新定义最底层的函数为在ATMEL 的AVR Studio 模拟器终端IO 窗口使用标准IO 函数应当在编译选项中选中相应的单选钮注意作为缺省单字符输出函数putchar 是输出到UART 装置没有修改无论如何为使输出能如期望的那样出现在程序终端窗口中'' 字符必须被映射为成对的回车和换行CR/LFint getchar()使用查寻方式从UART 返回一个字符int printf(char *fmt, ..)按照格式说明符输出格式化文本frm 字符串格式说明符是标准格式的一个子集%d--输出有符号十进制整数%o --输出无符号八进制整数%x - 输出无符号十六进制整数%X –除了大写字母使用'A'-'F'外同 %x%u - 输出无符号十进制整数%s –输出一个以C 中空字符NULL 结束的字符串%c –以 ASCII 字符形式输出只输出一个字符%f –以小数形式输出浮点数%S –输出在FLASH存贮器中的字符串常量printf 支持三个版本取决于你的特别需要和代码的大小越高的要求代码越大基本形: 只有 %c, %d, %x, %u, 和 %s 格式说明符是承认的长整形: 针对长整形数的修改 %ld, %lu, %lx 被支持, 以适用于精度要求较高的领域浮点形: 全部格式包括%f 被支持你使用编译选项对话框来选择版本代码大小的增加是值得关注的int putchar(int c)输出单个字符这个库程序使用了UART 以查寻方式输出单个字符注意输出’’字符至程序终端窗口int puts(char *s)输出以NL 结尾的字符串int sprintf(char *buf, char *fmt)按照格式说明符输出格式化文本frm 字符串到一个缓冲区格式说明符同printf( ) "const char *" 支持功能cprintf 和csprintf 是将FLASH中的格式字符串分别以prinf 和sprinf 形式输出6 标准库和内存分配函数标准库头文件<stdlib.h>定义了宏NULL 和RAND_MAX 和新定义的类型size_t 并且描述了下列函数注意在你调用任意内存分配程序比如.. calloc malloc 和realloc)之前必须调用_NewHeap 来初始化堆heapint abs(int i)返回i 的绝对值int atoi(char *s)转换字符串s 为整型数并返回它字符串s 起始必须是整型数形式字符否则返回0。
ICC AVR菜单
五菜单解释 iccavr使用手册P71 弹出菜单在 ICCAVR 环境中单击右键那么ICCAVR 会根据实际情况弹出相应的工具菜单2 File Menu 文件菜单New 新建一个文件你可在编辑窗口是输入文字或代码Reopen 重新打开历史文件有关历史文件显示的右边的子菜单中Open 打开一个已以经存在的文件用于编辑文件用浏览窗口选择Reload … form Disk 放弃全部的修改从磁盘中重新装载当前文件Reload ….from Back UP 从最后一次的备份文件中装载当前文件Save 保存当前文件如果环境设置中设置了保存备份文件则将原文件以<file>.~<ext>形式保存Save as 将当前文件用另外一个名称来保存Close 关闭当前文件如果文件有过修改系统会进行提示Compile File … to Object 编译当前文件成目标文件注意目标文件不可以直接用于对芯片编程或用于调试其主要用于语法检查为创建新的启动文件或库产生目标文件Compile File ... to Output 编译当前文件成输出文件其产生的输出文件可用于编程器和调试器Save All 保存所有打开的文件Closs All 关闭当前打开的所有文件同样它会提示你保存已经修改的文件Print 打印当前文件Exit 退出ICCAVR 的IDE 环境3 Edit Menu 编辑菜单Undo 撤消最后一次的修改Redo 撤消最后一次的UndoCut 剪切选择的内容到剪帖板Copy 拷贝选择的内容到剪帖板Paste 将剪帖板内容粘帖在当前光标的位置Delete 删除选择的内容Select All 选择全部内容Block Indent 对选择的整块内容右移Block Outdent 对选择的整块内容左移4 Search menu 寻找菜单Find …在编辑窗口中寻找一个文本它有以下选项Match Case –区分大小写Whole Word –全字匹配Up/Down –往上或往下Find in Files... –在当前打开的文件中或在当前工程的所有文件中或当前目录中的文件中寻找一段文本它有以下选项Case Sensitive –大小写敏感Whole Word - 全字匹配Regular Expression –寻找规则的表达式Replace... –在编辑器中替换文本Find Again –寻找下一个Goto Line Number –转到指定行号Add Bookmark –添加书签Delete Bookmark –删除书签Next Bookmark –跳转到下一个签Goto Bookmark –跳转到指定的书签5 View Menu 视图菜单Status Window –如果选中显示状态窗口Project Makefile –以只读方式打开 makefile 文件Output Listing File –以只读方式打开列表文件6 Project Menu 工程菜单New... –创建一个新的工程文件Open –打开一个已经存在的工程文件Open All Files... –打开工程的全部源文件Close All Files –关闭全部打开的文件Reopen... –重新打开一个最近打开过的工程文件Make Project –解释和编译已经修改的文件为输出文件Rebuild All –重新构筑全部文件注意在版本升级后对原有工程最好全部重新构筑Add File(s) –添加一个文件到工程中这个文件可以是非源文件Remove Selected Files –从工程中删除选择的文件Option... –打开工程编译选项对话框Close –关闭工程Save As... –将工程换一个名称存盘7 Tools Menu 工具菜单Environment Options –打开环境和终端仿真器选项对话框Editor and Print Options –打开编辑和打印选项对话框AVR Calc –打开 AVR 计算器可以计算UART 的波特率定时器的定时常数Application Builder –打开应用向导程序生成硬件的初始化代码Configure Tools –允许你添加自己的内容到工具菜单Run –以命令行方式运行一个程序8 Compiler Options 编译选项编译选项总共有三个页面 Paths Compiler 和Target在 Paths 页面中有Include Path(s) –你可以指定包含文件的路径Assembler Include Path(s) –指定汇编包含文件的路径Library Path –链接器所使用的库文件的路径Output Directory –输出文件的目录Compiler 页面有Strict ANSI C Checking –严格的 ANSI C 语法检查Accept Extensions –接受 C++类型语法扩充Macro Define(s) –定义宏宏之间用空格或分号分开宏定义形式如下name[:value] 或 name[=value]例如DEBUG:1;PRINT=printf等价于#define DEBUG 1#define PRINT printfMacro Undefine(s) –同上但意义相反Output File Format –输出文件格式 COFF/HEX Intel HEX 或COFFOptimizations –代码优化Default –基本优化象寄存器分配共用相同的子例程等Maximize Code Size Reduction –只有专业版才可使用它调用了代码压缩优化去除了无用的碎片代码Target 页面有Device Configuration –选择目标 MCUMemory Sizes –要选择"Custom" 时指定内存大小包括ROM SRAM 和EEPROMText Address –通常代码地址开始于中断向量区域后面Data Address –指定数据起始地址通常为0x60Use Long JMP/CALL –指定 MCU 是否支持长跳转和长调用Enhanced Core –指定硬件支持增强核指令IO Registers Offset Internal SRAM –指定内部 SRAM 的偏移量例如, 8515 的SRAM起始于0x60, 在IO 寄存器空间后面延伸了512 字节而 Mega603 , IO 寄存器覆盖在SRAM 空间中因此SRAM 也是从0 开始的Internal 对External SRAM –指定你的目标系统的数据 SRAM 类型PRINTF Version –选择 PRINTF 的版本Small 或 Basic: 只有 %c, %d, %x, %X, %u, and %s 格式支持Long: 支持 %ld, %lu, %lx, %lXFloating point: %f 支持注意这个选项需要很大的内存AVR Studio Simulator IO –如果选中 AVR Studio 的终端模拟仿真被支持Additional Libraries –使用标准库以外的附加库Strings in FLASH –字符串只保存在 FLASH存贮器中Return Stack Size –指定编译器使用的硬件堆栈的大小编译器使用的软件堆栈的大小不需地指定Non Default Startup –允许你指定一个启动文件的位置系统默认的启动文件在Paths 页中指定这样IDE 可以使用多个启动文件Unused ROM Fill Pattern –用一串十六进制数填充空余的 ROM 空间。
ICCAVR使用说明
ImageCraft ICCAVR的中文使用说明翻译詹卫前一 运行光盘上的SETUP.EXE程序进行安装aÎҵĵçÄÔ打开光盘驱动器所对应的盘符c SETUP.EXE按照屏幕提示a¿ªÊ¼在对话框中填入注意drive对应你的机器中的光盘驱动器盘符cÈ·¶¨其余同方法一注意 按上述方法进行安装后对正式版用户还要进行第二步的注册在标准版中有一些功能限制代码的压缩2¿ÉÒÔÕâÑù×¢²áa IDEb Unlock Diskc Help Importing a License from a Floppy Disk²¢ÇÒ½øÐе¥»÷ ICCAVR软件自动进行注册当你确定并再次重新启动ICCAVR后对不是首次安装或使用时间已超过30天的用户 对这类用户在程序启动时已不能进入IDE环境你应该选择按钮 这时会出现一个注册对话框Importing a License froma Floppy Diskc Unlock Diskµ¥»÷ÉÏÒ»²½ÖÐÌáµ½µÄ°´Å¥ ICCAVR软件自动进行注册当你确定并再次重新启动ICCAVR后注意 软盘在注册时应打开写保护软盘成为一张空盘应该首先在菜单中选择Your License to a Floppy Disk½«ÄãµÄ×¢²áÎļþ´«Ë͵½Ò»ÕÅÈíÅÌÉ϶þ ImageCraft 的ICCAVR介绍ImageCraft 的ICCAVR是一种使用符合ANSI标准的C语言来开发微控制器程序的一个工具ICCAVR是一个综合了编辑器和工程管理器的集成工作环境源文件全部被组织到工程之中编译错误显示在状态窗口中光标会自动跳转到编辑窗口中引起错误的那一行INTEL HEX格式文件可被大多数的编程器所支持ICCAVR是一个32位的程序出于篇幅考虑仅介绍使用ICC AVR所必须具备的知识应对C语言有了一定程度的理解ICCAVR中的文件类型及其扩展名文件类型是由它们的扩展名决定的输入文件这个文件保存由IDE所创建和修改的一个工程的有关信息它可以由几个库封装在一起如果库被引用您也可以创建或修改一个符合你需要的库.s 对应每个C语言源文件.o 由汇编文件汇编产生的目标文件.hex INTEL HEX格式文件.eep INTEL HEX格式文件.cof COFF 格式输出文件.lst 列表文件.mp 内存映象文件.cmd NoICE 2.xx 调试命令文件.dbg ImageCraft 调试命令文件附注和扩充#pragmaÕâ¸ö±àÒëÆ÷½ÓÊÜÒÔϸ½×¢这个附注必须在函数之前定义func2是中断操作函数并且保存和恢复函数所使用的全部寄存器#pragma ctask <func1> <func2>...这个附注指定了函数不生成挥发寄存器来保存和恢复代码#pragma text:<name>改变代码段名称#pragma data:<data>改变数据段名称这个附注在分配全局变量至EEPROM 中时必须被使用#pragma abs_address:<address>函数与全局数据不使用浮动定位这在访问中断向量和其它硬件项目时特别有用使目标程序使用正常浮动定位你可以在你的源代码中使用C ++的 // 类型的注释你可以使用0b<1|0>* 来指定二进制常数0b10101等于十进制数21¶ÁÕ߿ɲο¼ÔÚÏß»ã±à代码转换IAR或其它ANSI C编译系统的代码转换IAR C编译器作为应用于AVR的第一个C编译器当你从IAR 编译系统转换到ImageCraft编译系统时IAR C中IO寄存器的定义与ICCAVR也是相同的ICCAVR使用pragma附注描述中断操作函数interrupt关键字下面是一个对照#pragma interrupt_handler func:4// 4 是这个中断的向量号ICCAVR可以使多个中断向量共用一个中断处理函数interrupt [vector_name] func() // vector_name是某一个中断向量的名称以增加程序的可读性FLASH存贮器ICCAVR使用const关键字来达到相同的目的这仅影响手工写的汇编函数宏等而ICCAVR支持在线汇编三起步自你启动IDE后进入\icc\examples.avr目录并且选择并打开工程然后从Project菜单中选择Options命令打开工程编译选项然后从Project菜单中选择Make Project命令并且在状态窗口中显示所有的信息在与源文件同一个目录中输出一个文件led.hex´ó¶àÊýÄÜÖ§³ÖAVR MCU的编程器和模拟器都支持这种格式这样就完成了一个程序的构筑比如AVR StudioÔÚ±àÒë±êÇ©ÏÂÑ¡ÔñCOFF输出文件格式你也可使用工具条或鼠标右键弹出菜单你可以在工程窗口单击鼠标右键选择编译选项IDE将使用编辑器打开这个文件作为试验可设置一些错误IDE首先自动保存已经改变的文件这时在状态窗口中会显示错误信息或单击其左边的错误符号基本上所有C编译器都是这样开始一个新的工程从Project菜单中选择New命令输出文件的名称取决于你的工程文件名称如果你创建一个名称为foo.prj的工程自从创建你自己的工程后并且将这个文件加入到工程文件排列中Build¿ÉÒÔºÜÈÝÒ׵ع¹ÖþÕâ¸ö¹¤³ÌÄã¿ÉÒÔʹÓÃATMEL的AVR Studio来调试你的代码你可以使用应用程序向导来生成一些使用有关硬件的初始化代码C程序的剖析一个C程序必须定义一个main调用函数可执行因此你也可以在你的目标系统中执行它一个C程序需要设定目标环境通常然后是无限循环地运行让我们看 \icc\examples目录中的文件led.cÑÓʱ³ÌÐòÐèÒªÓÐ×ã¹»µÄÑÓʱʱ¼ä*/void Delay(){unsigned char a, b;for (a = 1; a; a++)for (b = 1; b; b++);}void LED_On(int i){PORTB = ~BIT(i);/* 低电平输出使LED点亮 */Delay();}void main()4{int i;DDRB = 0xFF;/*定义B口输出*/PORTB = 0xFF;/* B口全部为高电平在初始化一些IO寄存器后之后并且在这个循环中改变LED的步进图案在LED_On例程中直接写正确的数值到IO端口为能够看见图案变化LED_On例程调用了延时例程这一对嵌套循环只能给出延时的近似延时时间那么这个例程应该使用硬件定时器来完成延时8515intr.c程序很简单这两个例子可以作为你的程序的起点ICCAVR的IDE环境1ÄãÊ×ÏÈÓ¦¸Ã½¨Á¢Ò»¸ö¹¤³ÌÎļþ²¢ÇÒ¶¨ÒåÊôÓÚÕâ¸ö工程的所有文件我们有时也需要将一个文件单独地编译为目标文件或最终的输出文件从IDE菜单中选择命令to Object to Outputµ±Äãµ÷ÓÃÕâ¸öÃüÁîʱ²¢ÇÒÔÚ±à¼-´°¿ÚÖпÉÒÔ±à¼-µÄto Object对检查语法错误和编译一个新的启动文件是很有用的to Output对较小的并且是一个文件的程序较为有用这里使用默认的编译选项 创建一个新的工程为创建一个新的工程Project New IDE会弹出一个对话框这也是你的输出文件的名称你可在菜单中选择命令你可以在菜单中选择命令来建立一个新的源文件来输入你的代码File Save Save AsÈ»ºóÄã¿ÉÒÔÏóÉÏÃæËùÊöµ÷ÓÃ命令将文件加入到工程中Add to Projectͨ³£ÄãÊä³öÔ´ÎļþÔÚ¹¤³Ìͬһ¸öĿ¼ÖÐ工程的编译选项使用菜单中中的命令 工程管理工程管理允许你将多个文件组织进同一个工程这个特性允许你将工程分解成许多小的模块只有一个文件被修改和重新编译当你编译包含这个头文件的源文件时一个源文件可以写成C或汇编格式的任意一种.c»ã±àÎļþ±ØÐëʹÓÃ扩展名例如你可以将一个工程文档文件放在工程管理窗口中对目标器件不同的工程当你新建一个工程时你可以将现有编译选项设置成默认选项默认编译选项保存在default.prj文件中你可以指定输出文件和中间文件到一个指定的目录4ÔÚÕâ¸ö´°¿ÚÖÐÄã¿ÉÒÔÐÞ¸ÄÏàÓ¦µÄÎļþÓÃÊó±êµ¥»÷ÓйشíÎóÐÅϢʱעÒâµÄ´íÎó5Äã¿ÉÒÔµ¥»÷¹¤¾ßÌõÖеÄ按钮或菜单中的命令来调用它应用构筑向导显示目标MCU的每一个外围设备子系统在这里你可以设置MCU的所具有的中断定时器UART²¢²úÉúÏàÓ¦µÄ´úÂ뻹¿É²úÉúmain( )函数 状态窗口状态窗口显示IDE的状态信息7×¢ÒâËü²»°üº¬ÈÎÒâÒ»¸öISP¹¦ÄÜ»òÐí¿ÉÒÔÏÔʾÄãµÄÄ¿±ê×°Öõĵ÷ÊÔÐÅÏ¢码文件IDE加入了对ISP的支持 菜单解释1ÄÇôI CCAVR会根据实际情况弹出相应的工具菜单File Menu 文件菜单New Äã¿ÉÔÚ±à¼-´°¿ÚÊÇÊäÈëÎÄ×Ö»ò´úÂë重新打开历史文件OpenÎļþÓÃä¯ÀÀ´°¿ÚÑ¡Ôñ放弃全部的修改Reload….from Back UPSaveÈç¹û»·¾³ÉèÖÃÖÐÉèÖÃÁ˱£´æ±¸·ÝÎļþSave asCloseÈç¹ûÎļþÓйýÐÞ¸ÄCompile File …to Object ×¢ÒâÄ¿±êÎļþ²»¿ÉÒÔÖ±½ÓÓÃÓÚ¶ÔоƬ±à³Ì»òÓÃÓÚµ÷ÊÔÓï·¨¼ì²éCompile File ... to OutputÆä²úÉúµÄÊä³öÎļþ¿ÉÓÃÓÚ±à³ÌÆ÷ºÍµ÷ÊÔÆ÷保存所有打开的文件关闭当前打开的所有文件PrintExit3撤消最后一次的修改撤消最后一次的Undo剪切选择的内容到剪帖板拷贝选择的内容到剪帖板将剪帖板内容粘帖在当前光标的位置删除选择的内容选择全部内容对选择的整块内容右移Block OutdentSearch menu 寻找菜单Find…在编辑窗口中寻找一个文本Match Case – 区分大小写Whole Word – 全字匹配Up/Down –往上或往下Find in Files... –在当前打开的文件中或在当前工程的所有文件中或当前目录中的文件中寻找一段文本Case Sensitive –大小写敏感Whole Word - 全字匹配Regular Expression – 寻找规则的表达式Replace... – 在编辑器中替换文本Goto Line Number – 转到指定行号Delete Bookmark – 删除书签Goto Bookmark – 跳转到指定的书签View Menu视图菜单Status Window – 如果选中Project Makefile – 以只读方式打开makefile 文件Output Listing File – 以只读方式打开列表文件6Open –打开一个已经存在的工程文件Close All Files – 关闭全部打开的文件Make Project –解释和编译已经修改的文件为输出文件注意在版本升级后对原有工程最好全部重新构筑这个文件可以是非源文件Option... – 打开工程编译选项对话框7¿ÉÒÔ¼ÆËãUART的波特率生成硬件的初始化代码Compiler Options 编译选项编译选项总共有三个页面Compiler和Target在Paths页面中有Output Directory –输出文件的目录Compiler页面有宏之间用空格或分号分开name[:value] 或 name[=value]例如但意义相反Intel HEX或COFFÏó¼Ä´æÆ÷·ÖÅäËüµ÷ÓÃÁË´úÂëѹËõÓÅ»¯Target页面有包括ROMData Address – 指定数据起始地址Use Long JMP/CALL 指定MCU是否支持长跳转和长调用IO Registers Offset Internal SRAM – 指定内部SRAM的偏移量而 Mega603 , IO寄存器覆盖在SRAM 空间中Internal 对External SRAM – 指定你的目标系统的数据SRAM类型PRINTF Version – 选择PRINTF的版本Small 或 Basic: 只有 %c, %d, %x, %X, %u, and %s 格式支持Long: 支持 %ld, %lu, %lx, %lXFloating point: %f 支持AVR Studio Simulator IO – 如果选中Additional Libraries –使用标准库以外的附加库Strings in FLASH – 字符串只保存在FLASH存贮器中编译器使用的软件堆栈的大小不需地指定系统默认的启动文件在Paths页中指定Unused ROM Fill Pattern – 用一串十六进制数填充空余的ROM空间 C库函数与启动文件1²¢½«±ê×¼¿âlibcavr.a与你的程序相连接启动文件定义了一个全局符号__startÆô¶¯ÎļþµÄ¹¦ÄÜÓÐ初始化硬件和软件堆栈指针从idata区拷贝初始化数据到直接寻址数据区data区将bss区全部初始化为零调用用户主例程main函数定义一个退出点它将进入这个退出点进行无限循环你不需要修改启动文件来使用别的中断为修改和使用新的启动文件创建一个新的crtavr.ocopy crtavr.o ..\lib; 拷贝到库目录如果您使用的目标MCU是Mega注意Mega的每个中断入口地址使用两个字wordÄã¿ÉÒÔÔÚ¹¤³ÌÑ¡Ïî¶Ô»°¿òÖкܷ½±ãµØÖ±½ÓÖ¸¶¨Ò»¸öÆô¶¯Îļþ¼ÓÈëÄúµÄ¹¤³ÌÖÐÄú±ØÐëÖ¸¶¨Æô¶¯ÎļþµÄ¾ø¶Ô·¾¶»òÆô¶¯Îļþ±ØÐëλÓÚ¹¤³ÌÑ¡Ïî¿â·¾¶ËùÖ¸¶¨µÄĿ¼ÖÐ 常用库介绍1库源代码这个库源代码是一个密码保护的ZIP压缩文件当本软件被开锁后例如EEPROM和SPI的函数另外我们的互连网上有一个页专门存放用户写的源代码应该用这些文件来代替老的avr.h文件5其它头文件下列标准的C头文件是被支持的那么包含头文件是一个好习惯读者可参考返回非整型值的函数IO 字符类型库下列函数按照输入的ACS II字符集字符分类int isalnum(int c)如果c是数字或字母返回非零数值否则返回零int iscntrl(int c)如果c是控制字符返回非零数值否则返回零int isgraph(int c)如果c是一个可打印字符而非空格返回非零数值否则返回零int isprint(int c)如果c是一个可打印字符返回非零数值数字或字母返回非零数值包括空格CR, FF, HT, NL, 和 VT·ñÔò·µ»ØÁãint isxdigit(int c)如果c是十六进制数字返回非零数值其它类型仍然返回cint toupper(int c)如果c是小写字母则返回c对应的大写字母 浮点运算库下列函数支持浮点数运算#include <math.h>以弧度形式返回x的反正弦值float acos(float x)以弧度形式返回x的反余弦值float atan(float x)以弧度形式返回x的反正切值float atan2(float x, float y)返回y/x的反正切 ̄+小数部分四舍五入即e xfloat exp10(float x)返回以10为底的幂尾数即x=y y 的范围为0.51¶øn值存放到pexp指向的变量中2 e x pfloat log(float x)返回x的自然对数float log10(float x)返回以10为底的x的对数float modf(float x, float *pint)把浮点数分解成整数部分和小数部分小数部分应当大于或等于0而小于1float pow(float x, float y)返回x y值float sqrt(float x)返回x的平方根float sin(float x)返回以弧度形式表示的x的正弦值返回x的双曲正弦函数值float tan(float x)返回以弧度形式表示的x的正切值float tanh(float x)返回x的双曲正切函数值5MCU±ê×¼stdio.h的许多内容不可以使用同样使用之前应用"#include <stdio.h>"预处理最低层的IO程序是单字符的输入(getchar)和输出(putchar)程序例如用printf输出LCD为在ATMEL的AVR Studio模拟器使用标准IO函数注意单字符输出函数putchar是输出到UART装置没有修改'\n' 字符必须被映射为成对的回车和换行格式说明符是标准格式的一个子集同 %x%u - 输出无符号十进制整数%s – 输出一个以C中空字符NULL结束的字符串%c – 以 ASCII 字符形式输出取决于你的特别需要和代码的大小代码越大基本形: 只有 %c, %d, %x, %u, 和 %s 格式说明符是承认的长整形: 针对长整形数的修改 %ld, %lu, %lx被支持, 以适用于精度要求较高的领域浮点形: 全部格式包括%f 被支持你使用编译选项对话框来选择版本int putchar(int c)输出单个字符注意输出’\n’字符至程序终端窗口int sprintf(char *buf, char *fmt)按照格式说明符输出格式化文本frm字符串到一个缓冲区支持功能"const char *" cprintf 和csprintf 是将FLASH中的格式字符串分别以prinf和sprinf形式输出6并且描述了下列函数比如.. calloc±ØÐëµ÷ÓÃ_NewHeap来初始化堆heap×Ö·û´®s起始必须是整型数形式字符字符串s起始必须是浮点数形式字符串否则返回0 void *calloc(size_t nelem, size_t size)分配"nelem"个数据项的内存连续空间如果分配成功返回分配内存单元的首地址void exit(status)终止程序运行它是担任用户main函数的返回点如果分配成功则返回内存区地址void _NewHeap(void *start, void *end)初始化内存分配程序的堆符号_bss_end定义为编译器用来存放全局变量和字符串的数据内存的结束这个结束值不能被放入堆栈中void *realloc(void *ptr, size_t size)重新分配ptr所指向内存区的大小为size字节返回指向该内存区的地址指针long strtol(char *s, char **endptr, int base)按照"base."的格式转换"s"中起始字符为长整型数* endptr将设定"s"中转换结束的位置其余同"strtol"7±àÒëÆ÷Ö§³ÖÏÂÁк¯Êý类型size_t和下列字符串及字符阵列函数在字符串s中搜索n个字节长度寻找与c相同的字符否则返回NULLÈç¹ûÏàͬÔò·µ»Ø0Ôò·µ»Ø1Ôò·µ»Ø-1但拷贝区不可以重迭返回s1µ«¿½±´Çø¿ÉÒÔÖصü它返回s·µ»Øs1包括结束NULL字符如果没有匹配字符找到int strcmp(char *s1, char *s2)比较两个字符串如果s1>s2则返回1char *strcpy(char *s1, char *s2)拷贝字符串s2至字符串s1size_t strcspn(char *s1, char *s2)在字符串s1搜索与字符串s2匹配的第一个字符其返回s1中找到的匹配字符的索引不包括结束NULL字符不含结束NULL字符如果s2长度比n小返回s1µ«ÆäÖ»±È½ÏÇ°n个字符但其只拷贝前n个字符但它返回的是在s1匹配字符的地址指针char *strrchr(char *s, int c)在字符串s中搜索最后出现的c·ñÔò·µ»ØNULL°üÀ¨½áÊøNULL字符char *strstr(char *s1, char *s2)在字符串s1中找到与s2匹配的子字符串否则返回NULL这些函数除了它的操作对象是在FLASH中常数字符串外size_t cstrlen(const char *s)char *cstrcpy(char *dst, const char *src);int cstrcmp(const char *s1, char *s2);8Ëü¶¨ÒåÁ˲»È·¶¨µÄÀàÐÍva_list和三个宏分派指定的类型如int 小的整型类型如"char"不能被支持printf()可以使用vfprintf()来实现#include <stdarg.h>int printf(char *fmt, ...){va_list ap;va_start(ap, fmt);vfprintf(fmt, ap);va_end(ap);}9ÄÚ´æͼÈçÏÂÄÇôÈí¼þ¶ÑÕ»µÄÄÚÈݽ«»á±»¸Ä±äÓ²¼þ¶ÑÕ»ÊÇÓÃ×÷º¯ÊýµÄ·µ»ØµØÖ·同样地如果你使用动态分配内存警戒线低端地址警戒线启动代码写了一个正确的关于数据区的地址字节和一个类似的正确的关于软件堆栈的地址字节作为警戒线如果你使用了你自己的启动文件你将需要额外改造为新的启动文件如果你使用动态分配内存参考内存分配函数如果警戒线字节仍然保持正确的值那么函数检查通过那么警戒线字节将可能被破坏你的程序将可能运行不正常或偶然崩溃_StackOverflowed(char c)它调用了带一个参数的函数那么硬件堆栈有过溢出那么软件堆栈曾经溢出它是两个堆栈都可能溢出的在_StackOverflowed执行起作用时作为例子那么将不能返回_StackCheck函数库会用一个缺省的_StackOverflowed函数来跳转到0的位置你可能希望用一个函数来代替它以指示更多的错误条件注意自堆栈溢出指示故障程序以来macros.h.中这两个函数的原型在头文件七 访问AVR的低层硬件AVR系列使用高级语言编程时有很高的C语言密度由于AVR性能偶然情况下目标MCU的硬件特点在C语言中不能很好地使用头文件io*.h iom603.h等这些文件是从ATMEL官方发布的文件经过修改文件macros.h定义了许多有用的宏这个编译器的效率很高outsbi等注意尽管io*.h定义了它们的bit 的位置很多时候你将需要使用定义在macros.h文件中的BIT()宏avr.h:#define SRE0x80// 外部 RAM 使能... (你的C程序)MCUCR |= SRE;io8515.h#define SRE7... (你的C程序)#include <macros.h>MCUCR |= BIT(SRE);2bit很幸运而没有借助于汇编指令或其它非标准C结构a |b – 按位或这惯用于打开某些位例如这个运算在检查某些位是否置1时有用If ((PORTA & 0x81) == 0)// 检查位7和位0注意圆括号需要括在&运算符的周围这是C程序中很多错误的原因之一这个运算对一个位取反有用在下面的例子中PORTA ^= 0x80;// 翻转位7~a – 按位取反. 在表达式中这个运算执行一个取反与这个运算组合使用尤其有用PORTA &= ~0x80;// 关闭位7这个编译器对这些运算能产生最理想的机器指令sbic指令可以用在根据位的状态进行条件分枝的按位与运算中 程序存贮器和常量数据AVR是哈佛结构的MCUÕâÑùµÄÉè¼ÆÊÇÓÐһЩÓŵãµÄ·Ö¿ªµÄµØÖ·¿Õ¼äÔÊÐíAVR装置比传统结构访问更多的存贮器Atmega系列允许有超过64K字的程序存贮器和64K字节的数据存贮器而程序计数器仍保留在16位上C不是在这种机器上发明的C指针是任意一个数据指针或函数指针可是同是哈佛结构的AVR非标准C解决了这个问题注意对指针描述不管是限定指针变量自己还是指向项目的指针const int table[] = { 1, 2, 3 };const char *ptr1;char * const ptr2;const char * const ptr3;"table"是表格式样分配进程序存贮器针在程序存贮器最后在大多数的例子中"table" 和和"ptr1"是很典型的注意C标准不要求"const"数据是放入只读存贮器中除了正确访问就没有要紧的了在承认参数的C标准中使用const限定是非传统的这样做与标准C函数定义是有一定冲突的标准"strcpy"的原型是strcpy(char *dst, const char *src)È»¶øÔÚICCAVR下因此这些函数定义设有const限制注意只有常数变量以文件存贮类型放入FLASH中如果你使用有const限制的局部变量4Õâҳ˵Ã÷×Ö·û´®×îÀ§ÄѵÄÊÇ×Ö·û´®µÄ·ÖÅäºÍ´¦ÀíÈç¹û×Ö·û´®ÊÇ·ÖÅä½ø³ÌÐò´æÖüÆ÷ÖлòÕß×Ö·û´®Ò²±ØÐë±»·ÖÅäÔÚÊý¾Ý´æÖüÆ÷ÖÐ缺省的字符串分配这个缺省的方法是同时分配字符串在数据和程序存贮器中为了确保它们的值是正确的因此只有单一的字符串拷贝函数是必须的你能使用常量字符型数组来将字符串只分配进程序存贮器中const char hello[] = "Hello World";在这个例子中但不能用作标准C库中字符串函数的参数另外只分配全部字符串到FLASH存贮器中当对应"Project->Options->Target->Strings In FLASH Only"检查框被选中时这时称必须很小心地调用库函数字符串类型"const char *"是有效的除了新的"const char *"与字符串有关系外参考标准输入输出函数当选项2ʱ对const char*及const char ptr[ ]类型字符串当选项1时对const char*及const char ptr[ ]类型字符串5生成代码使用两个堆栈一个是用于以堆栈结构传递的参数硬件堆栈起初是用于存贮函数返回的地址通常也不调用象带有%f格式的printf()等库函数在绝大多数程序中再入式函数最多40个字节的硬件堆栈应该是足够的而软件堆栈是在它下面一定数量字节处分配数据区从0x60开始分配允许数据区和软件堆栈彼此相向生长那么堆栈是放在内部SRAM 的顶部参考程序和数据内存的使用两个堆栈中的任意一个都可能溢出你可以使用堆栈检查函数检测溢出情况 在线汇编除了在汇编文件中写汇编函数外在你的工程使用汇编源文件作为一个部件是良好的在线汇编的语法是可以被用来指定多个声明为了在汇编声明中访问一个C的变量如register unsigned char uc;asm("mov %uc,R0\n""sleep\n");任意一个C变量都可以被引用你必须使用寄存器存贮类来强制分配一个局部变量到CPU寄存器中使用在线汇编引用局部寄存器的能力是有限的就很可能没有寄存器可用你将从汇编程序得到一个错误所以你的在线汇编指令很可能失败使用LDI 指令需要使用R16~R31中的一个寄存器同样也没有引用上半部分的整数寄存器编译器将在线汇编的每行都分解成可读的ImageCraft汇编器允许标签放置在任意地方当汇编声明在函数外部时你不要理睬这个警告 I O寄存器IO寄存器可以被两条路线访问可以使用IN和OUT指令读写IO寄存器可以使用普通数据访问指令和地址模式数据内存地址例如注意注意不要不注意地改变CPU寄存器编译器自动生成低级指令象in sbrsIO地址register unsigned char uc;asm("in %uc,$3F");// 读 SREGasm("out $3F,%uc");// 打开全局中断位注意尽管io*.h定义了它们的bit 的位置很多时候你将需要使用定义在macros.h文件中的BIT()宏avr.h:#define SRE0x80// 外部 RAM 使能... (填充你的C程序)MCUCR |= SRE;io8515.h#define SRE7... (填充你的C程序)#include <macros.h>MCUCR |= BIT(SRE);8ÀýÈçÍⲿIO设备通常被映射成特殊的内存通常你可以使用在线汇编或单独的汇编文件来描述那些定位在特殊内存地址的数据已在C语言中提供这些能力假设有一个两字节的LCD 控制寄存器定位在0x1000地址并且有一个100字节的双口SRAM定位在0x2000的地址在一个汇编文件中输入以下内容extern unsigned int LCD_control_register, LCD_data_register;extern char dual_port_SRAM[100];注意并且使用两个冒号定义为全局变量在线汇编遵守同样的汇编语法规则在C文件中asm(".area memory(abs)"".org 0x1000""_LCD_control_register:: .blkw 1""_LCD_data_register:: .blkw 1");asm(".org 0x2000""_dual_port_SRAM:: .blkb 100");在C中你仍然要使用"extern"描述变量否则C 编译器不会真正知道在asm中的声明 C任务作为汇编界面的描述和调用规则在一些情况下例如实时操作系统RTOS 管理着寄存器的保存和恢复并作为任务切换处理的一部分为了禁止这种行为例如注意作为默认的情况它也没有必要为返回保存和恢复任意一个寄存器 中断操作C中断操作中断操作中C中可以使用你必须用一个附注在函数定义之前通知编译器这个函数是一个中断操作注意向量号是从1开始的这个附注有两个作用:对中断操作函数而且保存和恢复在函数中用过的全部寄存器例如...void timer_handler(){...}编译器生成的指令为rjmp _timer_handler; 对普通AVR MCU或者jmp _timer_handler;对Mega MCU上述指令定位在0x06Õë¶ÔÆÕͨװÖÃ字节地址Mega使用2个字作为中断向量如果你希望对多个中断入口使用同一个中断操作分别带有多个不同的向量号#pragma interrupt_handler timer_ovf:7 timer_ovf:8汇编中断操作你可以用汇编语言写中断操作无论如何要小心参考汇编界面C函数不做这些工作那么你必须自己定义向量用".org"来声明rjmp 或jmp指令的正确地址; 对全部除ATMega 以外的MCU.area vectors(abs);中断向量.org 0x6rjmp _timer; 对 ATMega MCU.area vectors(abs); 中断向量.org 0xCjmp _timer11ÔÚ\icc\examples.avr 目录12EEPROM在运行时可以使用库函数访问EEPROM_READ(int location, object)这个宏调用了EEPROMReadBytes 函数从EEPROM指定位置读取数据送给数据对象 例如"object"可以是任意程序变量包括结构和数组int i;EEPROM_WRITE(0x1, i);//写两个字节至0x1这些宏和函数可以用于任意AVR装置即使不需要高地址字节它们也是欠佳的如果它关系重大初始化EEPROMEEPROM可以在你的程序源文件中初始化这是可以用附注实现的例如为返回默认的"data."区域需要重设数据区名称初始化EEPROM数据至0地址是不可以使用的比如访问在另一个文件中的foo你不需要加入这个附注extern int foo;int i;EEPROM_READ((int)&foo, i);内部函数如果需要下列函数可以直接使用unsigned char EEPROMread(int location)从EEPROM指定位置读取一个字节int EEPROMwrite(int location, unsigned char byte)写一个字节到EEPROM指定位置 void EEPROMReadBytes(int location, void *ptr, int size) 从EEPROM指定位置处开始读取"size"个字节至由"ptr."指向的缓冲区写的内容由"ptr."指向的缓冲区提供访问SPI一个以查寻模式访问SPI的函数是提供的14全部范围内的跳转可以使用相对转移和调用指令(rjmp 和 rcall)Ïà¶ÔתÒƺ͵÷Óõķ¶Î§ÊÇÒÔ8K为分界的一个较远的跳转跳转到0x2100字节处实际上会跳转到地址0x100处只要目标装置的程序存贮器是8K的 C的运行结构17位表示指数1位表示符号而且将被包含在一个较小的空间中struct {unsigned a : 1, b : 1;};这个结构体的长度只有一个1 byte2名称C 语言中的名称在汇编文件中是以下划线为前坠的名称的有效长度为32个字符:可以定义成一个全局变量_foo::.word 1(在C 文件中)extern int foo;b)µÚ¶þ¸ö²ÎÊýÔòͨ¹ýR18/R19传递其余参数通过软件堆栈传递如char int¼´Ê¹º¯ÊýÔ-ÐÍÊÇ¿ÉÓõĶøµÚ¶þ¸ö²ÎÊýÊdz¤ÕûÐÍ»ò¸¡µãÊý¶ø¸ß°ë²¿·Öͨ¹ýÈí¼þ¶ÑÕ»´«µÝ¶ø³¤ÕûÐÍ»ò¸¡µãÊý·µ»ØÔòͨ¹ýR16/R17/R18/R19返回保护的寄存器在汇编函数中必须保护和恢复下列寄存器这是结构指针这些寄存器是调用保护寄存器d)¶ø²»±»±£»¤ºÍ»Ö¸´ÕâЩ¼Ä´æÆ÷µÄÄÚÈÝÔÚ±»º¯Êýµ÷Óúó¿ÉÒԸıäÔÚÖжϲÙ×÷ÖбØÐë±£»¤ºÍ»Ö¸´ËüËùʹÓõÄÈ«²¿¼Ä´æÆ÷ÄÇô±àÒëÆ÷ÓÐÄÜÁ¦×Ô¶¯Íê³ÉµÄ¶øËüÓÖµ÷ÓÃÁËÆÕͨµÄC函数普通C函数调用不保护它们中断处理或它的函数调用不能改变任意一个MCU寄存器 函数返回非整型值在调用函数前浮点数或结构值在调用任意浮点函数之前否则这和那些返回整型值的函数是有不同之处的传递结构值如果传递结构值而不是通过寄存器。
Icc AVR C编译器的使用
第十章 IccA VR C编译器的使用自ATMEL的AT90系列单片机诞生以来ATMEL公司推荐的第三方C编译器: Expanded 3rd Party Support ICCAVR/ICCtiny ImageCraft–Supports devices without SRAM–Embedded application builder–Global optimizer–ISP-support (STK200/300)-compiler CodeVision C–Includes advanced codeWizard关于几种C语言的比较,另见一文 免费提供30天的使用版软件,可生成烧录文件,而IAR免费提供的使用版软件,只生成调试文件,不能生成烧录文件;不断增加新功能模块,如单总线,SPI,UART,IIC总线,LCD,LED(本公司也在帮助改进,增加新功能)等;一运行光盘上的SETUP.EXE程序进行安装aÎҵĵçÄÔ打开光盘驱动器所对应的盘符c SETUP.EXE按照屏幕提示a¿ªÊ¼在对话框中填入 注意drive对应你的机器中的光盘驱动器盘符cÈ·¶¨其余同方法一注意按上述方法进行安装后对正式版用户还要进行第二步的注册´úÂëµÄѹ2ÔÚ±ê×¼°æÖÐÓÐһЩ¹¦ÄÜÏÞÖÆ缩2¿ÉÒÔÕâÑù×¢²áa IDEb Unlock Diskc Help Importing a License from a Floppy Disk²¢ÇÒ½øÐе¥»÷ICCAVR软件自动进行注册当你确定并再次重新启动ICCAVR后对不是首次安装或使用时间已超过30天的用户 对这类用户在程序启动时已不能进入IDE环境你应该选择按钮 这时会出现一个注册对话框Importing a License from aFloppy Diskc Unlock Diskµ¥»÷ÉÏÒ»²½ÖÐÌáµ½µÄ°´Å¥ICCAVR软件自动进行注册当你确定并再次重新启动ICCAVR后注意软盘在注册时应打开写保护b软盘成为一张空盘cÓ¦¸ÃÊ×ÏÈÔÚ菜单中选择一项然后再按上述方法进行安装注册 ICCAVR介绍1MCU ËüÓÐÒÔϼ¸¸öÖ÷ÒªÌصãIDE其可在WINDOWS9X/NT 下工作文件的编辑和工程的构筑也在这个环境中完成并且当你用鼠标单击编译错误时这个工程管理器还能直接产生您希望得到的可以直接使用的INTEL HEX格式文件用于下载程序到芯片中去支持长文件名本书并不介绍通用的C语言语法知识因此要求读者在阅读本书内容之前2IDE和编译器可以使用以下几种类型的文件.c 扩展名----表示是C语言源文件.s 扩展名----表示是汇编语言源文件.h 扩展名----表示是C语言的头文件.prj 扩展名----表示是工程文件.a 扩展名----库文件libcavr.a是一个包含了标准C的库和AVR 特殊程序调用的基本库链接器会将其链接到您的模块或文件中输出文件由编译器在编译时产生的汇编输出文件多个目标文件可以链接成一个可执行文件其中包含了程序的机器代码包含了EEPROM的初始化数据用于在ATMEL的A vrStudio环境下进行程序调试在这个文件中列举出了目标代码对应的最终地址它包含了您程序中有关符号及其所占内存大小的信息.noi NoICE 3.xx调试命令文件3编译附注#pragma interrupt_handler <func1>:<vector number> <func2>:<vector> ...这个附注必须在函数之前定义func2是中断操作函数并且保存和恢复函数所使用的全部寄存器#pragma ctask <func1> <func2>...这个附注指定了函数不生成挥发寄存器来保存和恢复代码#pragma text:<name>改变代码段名称#pragma data:<data>改变数据段名称这个附注在分配全局变量至EEPROM中时必须被使用#pragma abs_address:<address>函数与全局数据不使用浮动定位这在访问中断向量和其它硬件项目时特别有用使目标程序使用正常浮动定位你可以在你的源代码中使用 C ++ 的 // 类型的注释你可以使用0b<1|0>* 来指定二进制常数0b10101等于十进制数21¶ÁÕ߿ɲο¼ÔÚÏß»ã±à代码转换IAR或其它ANSI C编译系统的代码转换IAR C编译器作为应用于AVR的第一个C编译器当你从IAR编译系统转换到ImageCraft编译系统时IAR C中IO寄存器的定义与ICCAVR也是相同的ICCAVR使用pragma附注描述中断操作函数interrupt 关键字下面是一个对照#pragma interrupt_handler func:4 // 4 是这个中断的向量号ICCAVR 可以使多个中断向量共用一个中断处理函数interrupt [vector_name] func() // vec tor_name是某一个中断向量的名称以增加程序的可读性FLASH存贮器ICCAVR使用const关键字来达到相同的目的这仅影响手工写的汇编函数宏等而ICCAVR支持在线汇编 ICCAVR导游1Ê×ÏÈ´ÓProject菜单系统选择Open命令led¹¤³Ì¹ÜÀíÆ÷ÏÔʾÔÚÕâ¸ö¹¤³ÌÖÐÖ»ÓÐÒ»¸öÎļþled.cÔÚ"Target"标号下选择目标处理器IDE将调用编译器编译这个工程文件如果没有错误在这个例子中是\icc\examples.avr这个文件是INTEL H EX格式并且能下载这个程序进入你的目标系统如果你希望用支持COFF调试信息的工具来测试你的程序那么你需要从Project菜单中选择Options命令对一些常用的功能例如在工程窗口中双击文件名按这个方法打开led.cÀýÈç´ÓÒ»ÐÐÖÐɾ³ý·ÖºÅÏÖÔÚ´ÓProject菜单中选择Make Project命令并且开始编译这个文件单击状态窗口中错误信息行光标将移到编辑器中错误行的下面一行上并且浏览至你希望输出工程文件的目录例如那么输出文件名称为foo.hex或foo.cof等你可以开始写你的源代码(C或汇编格式)µ¥»÷¹¤¾ßÀ¸ÖÐ图标IDE输出与ATMEL 的AVR Studio完全兼容的COFF文件为更容易地使用这个开发工具2±àÒëÆ÷»á½«ÄãµÄ³ÌÐòÓëÆô¶¯´úÂëºÍ¿âº¯ÊýÁ´½Ó³ÉÒ»¸öÎļþÆô¶¯´úÂëµÄÓÃ;ÔÚÆô¶¯ÎļþÖкÜÏêϸµØ±»ÃèÊöÁËÆô¶¯´úÂë³õʼ»¯Õâ¸öÄ¿±êʹÆäÂú×ãËùÓеÄÒªÇóÄãµÄmain例程完成一些初始化后作为例子#include <io8515.h> /* 为使能够看清LED的变化图案对应LED熄灭*/while (1){/*LED向前步进 */for (i = 0; i < 8; i++)LED_On(i);/* LED向后步进 */for (i = 8; i > 0; i--)LED_On(i);/* LED跳跃*/for (i = 0; i < 8; i += 2)LED_On(i);for (i = 7; i > 0; i -= 2)LED_On(i);}}主个main例程是很简单的它运行在一个无限循环中LED是在LED_On例程中被改变的因为CPU运行很快因为延时的实际延时值不能被确定如果这个实际定时时间是重要的其它的例子但同样清楚地显示了如何用C写一个中断处理过程四编译一个单独的文件正常建立一个输出文件的次序是然而这时可以这样操作File Compile File...À´Ö´ÐÐ和中的任意一个文件应该是打开的编译一个文件为目标文件编译一个文件为输出文件注意2´Ó²Ëµ¥中选择命令在对话框中你可以指定工程的名称如果你使用一些已经建立的源文件Project AddFile(s)另外File NewÄã¿ÉÒÔÔڲ˵¥中选择或命令来保存文件AddFile(s)Ò²¿ÉÔÚµ±Ç°±à¼-´°¿ÚÖе¥»÷Êó±êÓÒ¼üÑ¡Ôñ将文件加入已打开的工程列表中但也可不作这样要求Project Options3¶øÇÒ¶¨ÒåËüÃǵıàÒëÑ¡Ïîµ±Äã´¦Àí¹¤³Ì¹¹ÖþʱÈç¹ûÒ»¸öÍ·Îļþ×÷ÁËÐÞ¸ÄIDE会自动重新编译已经改变的头文件C文件必须使用扩展名.sÄã¿ÉÒÔ½«ÈÎÒâÎļþ·ÅÔÚ¹¤³ÌÁбíÖй¤³Ì¹ÜÀíÆ÷ÔÚ¹¹Öþ¹¤³Ìʱ¶ÔÔ´ÎļþÒÔÍâµÄÎļþ²»Óè理睬可以在编译选项中设置有关参数使用默认的编译选项也可将默认编译选项装入现有工程中为避免你的工程目录混乱通常这个目录是你的工程目录的一个子目录编辑窗口编辑窗口是你与IDE交流信息的主要区域当编译存在错误时编辑器会自动将光标定位在错误行的位置对C源文件中缺少分号编辑器定位于其下面一行应用构筑向导应用构筑向导是用于创建外围设备初始化代码的一个图形界面Wizard Tools ApplicationBuilder应用构筑向导使用编译选项中指定的目标MCU来产生相应的选项和代码它的使用是很显而易见的内存IO端口SPI和模拟量比较器等外围设备如果你需要的话67×¢ÒâËü²»°üº¬ÈÎÒâÒ»¸öISP¹¦ÄÜ»òÐí¿ÉÒÔÏÔʾÄãµÄÄ¿±ê×°Öõĵ÷ÊÔÐÅÏ¢码文件五弹出菜单在ICCAVR环境中单击右键2新建一个文件ReopenÓйØÀúÊ·ÎļþÏÔʾµÄÓұߵÄ×Ӳ˵¥ÖÐ打开一个已以经存在的文件用于编辑Reload …form Disk´Ó´ÅÅÌÖÐÖØÐÂ×°Ôص±Ç°Îļþ从最后一次的备份文件中装载当前文件保存当前文件则将原文件以<file>.~<ext>形式保存将当前文件用另外一个名称来保存关闭当前文件系统会进行提示编译当前文件成目标文件其主要用于为创建新的启动文件或库产生目标文件编译当前文件成输出文件Save AllCloss AllͬÑùËü»áÌáʾÄã±£´æÒѾ-Ð޸ĵÄÎļþ打印当前文件退出ICCAVR的IDE环境Edit Menu 编辑菜单UndoRedoCutCopyPasteDeleteSelect AllBlock Indent对选择的整块内容左移4它有以下选项它有以下选项Find Again – 寻找下一个Add Bookmark – 添加书签Next Bookmark – 跳转到下一个签5ÏÔʾ״̬´°¿ÚProject Menu工程菜单New... – 创建一个新的工程文件Open All Files... – 打开工程的全部源文件Reopen... – 重新打开一个最近打开过的工程文件Rebuild All – 重新构筑全部文件Add File(s) – 添加一个文件到工程中Remove Selected Files – 从工程中删除选择的文件Close – 关闭工程Save As... – 将工程换一个名称存盘Tools Menu 工具菜单Environment Options – 打开环境和终端仿真器选项对话框Editor and Print Options –打开编辑和打印选项对话框AVR Calc – 打开A V R计算器定时器的定时常数 Application Builder –打开应用向导程序Configure Tools – 允许你添加自己的内容到工具菜单Run –以命令行方式运行一个程序8Paths在Paths页面中有Output Directory –输出文件的目录Compiler页面有宏之间用空格或分号分开name[:value] 或 name[=value]例如但意义相反Intel HEX或COFFÏó¼Ä´æÆ÷·ÖÅäËüµ÷ÓÃÁË´úÂëѹËõÓÅ»¯Target页面有包括ROMData Address – 指定数据起始地址 Use Long JMP/CALL 指定MCU是否支持长跳转和长调用IO Registers Offset Internal SRAM – 指定内部SRAM的偏移量而 Mega603 , IO寄存器覆盖在SRAM空间中Internal 对External SRAM – 指定你的目标系统的数据SRAM类型PRINTF Version – 选择PRINTF的版本Small 或 Basic: 只有 %c, %d, %x, %X, %u, and %s 格式支持Long: 支持 %ld, %lu, %lx, %lXFloating point: %f 支持AVR Studio Simulator IO – 如果选中Additional Libraries –使用标准库以外的附加库Strings in FLASH – 字符串只保存在FLASH存贮器中编译器使用的软件堆栈的大小不需地指定系统默认的启动文件在Paths页中指定Unused ROM Fill Pattern – 用一串十六进制数填充空余的ROM空间六启动文件这个链接器会自动将启动文件连接到您的程序之前启动文件根据目标MCU的不同在crtavr.o 和 crtatmega.o 中间任意选择一个它也是您的程序的起点12345Èç¹ûÄãµÄÖ÷º¯Êýmain( )一旦退出启动文件也定义了复位向量具体可参考中断操作部分cd \icc\libsrc.avr ; 进入你安装的编译器路径<edit crtavr.s> ; 编辑修改crtavr.s文件<open crtavr.s using the IDE> ; 用IDE打开crtavr.s文件<Choose "Compile File To->Object"> ;选择编译到目标文件你应该用"crtatmega" 代替"crtavr"word而非Mega芯片每一个中断入口地址使用一个字. 你也可以有多个启动文件注意2ȱʡ·¾¶Îªc:\icc\libsrc.avr\libsrc.zipÄã¿ÉÒÔ´Ó»¥Á¬ÍøÉÏÈÎÒâÏÂÔØÒ»¸öUNZIP程序进行解压缩密码显示在"About"对话框中unzip -s libsrc.zip; unzip 提示输入密码2AVR特殊函数----- ICCAVR有许多访问UART¶ÑÕ»¼ì²éº¯Êý¶Ô¼ì²â¶ÑÕ»ÊÇ·ñÒç³öºÜÓÐÓÃ3io*.h (io2313.h, io8515.h, iom603.h, ... 等.)这些文件中是从ATMEL官方公开的定义IO寄存器的源文件经过修改得到的PORTB = 1;uc = PORTA;4macros.h这个文件包含了许多有用的宏和定义如果你的程序使用了头文件所列出的函数在使用浮点数和长整型数的程序中必须用#include预编译指令包含这些包含了这些函数原形的头文件assert.h - assert(), 声明宏ctype.h – 字符类型函数float.h – 浮点数原形limits.h – 数据类型的大小和范围math.h – 浮点运算函数stdarg.h – 变量参数表.stddef.h – 标准定义stdio.h – 标准输入输出函数stdlib.h – 包含内存分配函数的标准库string.h – 字符串处理函数3ʹÓÃÕâЩº¯Êý֮ǰӦµ±ÓÃ"#include <ctype.h>"包含否则返回零int isalpha(int c)如果c是字母返回非零数值如FF, BELL, LF ..等否则返回零int isdigit(int c)如果c是数字返回非零数值否则返回零int islower(int c)如果c是小写字母返回非零数值否则返回零int ispunct(int c)如果c是一个可打印字符而不是空格否则返回零int isspace(int c)如果c是一个空格字符返回非零数值否则返回零int isupper(int c)如果c是大写字母返回非零数值否则返回零int tolower(int c)如果c是大写字母则返回c对应的小写字母如果c是小写字母则返回c对应的大写字母浮点运算库下列函数支持浮点数运算#incl ude <math.h>Æ䷶ΧÔÚ-之间float ceil(float x)返回对应x的一个整型数float cos(float x)返回以弧度形式表示的x的余弦值float cosh(float x)返回x的双曲余弦函数值float exp(float x)返回以e为底的x的幂即10xfloat 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两个部分2 n y y值被函数返回float fround(float x)返回最接近x的整型数float ldexp(float x, int exp)返回xÕûÊý²¿·Ö´æ·Åµ½pint指向的变量并且作为函数返回值返回返回x的平方根float sin(float x)返回以弧度形式表示的x的正弦值float sinh(float x)返回x的双曲正弦函数值float tan(float x)返回以弧度形式表示的x的正切值float tanh(float x)返回x的双曲正切函数值5MCU±ê×¼stdio.h的许多内容不可以使用同样使用之前应用"#include <stdio.h>"预处理最低层的IO程序是单字符的输入(getchar)和输出(putchar)程序例如用printf输出LCD为在ATMEL的AVR Studio模拟器使用标准IO函数注意单字符输出函数putchar是输出到UART装置没有修改'\n' 字符必须被映射为成对的回车和换行格式说明符是标准格式的一个子集同 %x%u - 输出无符号十进制整数%s – 输出一个以C中空字符NULL结束的字符串%c – 以 ASCII 字符形式输出取决于你的特别需要和代码的大小代码越大基本形: 只有 %c, %d, %x, %u, 和 %s 格式说明符是承认的长整形: 针对长整形数的修改 %ld, %lu, %lx被支持, 以适用于精度要求较高的领域浮点形: 全部格式包括%f 被支持你使用编译选项对话框来选择版本int putchar(int c)输出单个字符注意输出’\n’字符至程序终端窗口int sprintf(char *buf, char *fmt)按照格式说明符输出格式化文本frm字符串到一个缓冲区 支持功能"const char *" cprintf 和csprintf 是将FLASH中的格式字符串分别以prinf和sprinf形式输出标准库和内存分配函数标准库头文件<stdlib.h>定义了宏NULL和RAND_MAX和新定义的类型size_t ×¢ÒâÔÚÄãµ÷ÓÃÈÎÒâÄÚ´æ·ÖÅä³ÌÐòmalloc和realloc)之前int abs(int i) 返回i的绝对值int atoi(char *s)转换字符串s为整型数并返回它否则返回0double atof(const char *s)转换转换字符串s为双精度浮点数并返回它long atol(char *s)转换字符串s为长整型数并返回它否则返回0 void *calloc(size_t nelem, size_t size)分配"nelem"个数据项的内存连续空间如果分配成功返回分配内存单元的首地址 void exit(status) 终止程序运行它是担任用户main函数的返回点如果分配成功则返回内存区地址 void _NewHeap(void *start, void *end) 初始化内存分配程序的堆符号_bss_end定义为编译器用来存放全局变量和字符串的数据内存的结束这个结束值不能被放入堆栈中void *realloc(void *ptr, size_t size)重新分配ptr所指向内存区的大小为size字节返回指向该内存区的地址指针long strtol(char *s, char **endptr, int base)按照"base."的格式转换"s"中起始字符为长整型数* endptr将设定"s"中转换结束的位置其余同"strtol"7±àÒëÆ÷Ö§³ÖÏÂÁк¯Êý类型size_t 和下列字符串及字符阵列函数void *memchr(void *s, int c, size_t n)在字符串s中搜索n个字节长度寻找与c相同的字符否则返回NULLÈç¹ûÏàͬÔò·µ»Ø0Ôò·µ»Ø1Ôò·µ»Ø-1但拷贝区不可以重迭返回s1µ«¿½±´Çø¿ÉÒÔÖصü它返回s·µ»Øs1包括结束NULL字符如果没有匹配字符找到int strcmp(char *s1, char *s2)比较两个字符串如果s1>s2则返回1char *strcpy(char *s1, char *s2)拷贝字符串s2至字符串s1size_t strcspn(char *s1, char *s2)在字符串s1搜索与字符串s2匹配的第一个字符其返回s1中找到的匹配字符的索引不包括结束NULL字符不含结束NULL字符如果s2长度比n小返回s1µ«ÆäÖ»±È½ÏÇ°n个字符但其只拷贝前n个字符但它返回的是在s1匹配字符的地址指针char *strrchr(char *s, int c)在字符串s中搜索最后出现的c·ñÔò·µ»ØNULL°üÀ¨½áÊøNULL字符char *strstr(char *s1, char *s2)在字符串s1中找到与s2匹配的子字符串否则返回NULL这些函数除了它的操作对象是在FLASH中常数字符串外size_t cstrlen(const char *s)char *cstrcpy(char *dst, const char *src);int cstrcmp(const char *s1, char *s2);8Ëü¶¨ÒåÁ˲»È·¶¨µÄÀàÐÍva_list和三个宏分派指定的类型如int小的整型类型如"char"不能被支持printf()可以使用vfprintf()来实现#include <stdarg.h>int printf(char *fmt, ...){va_list ap;va_start(ap, fmt);vfprintf(fmt, ap);va_end(ap);}9ÄÚ´æͼÈçÏÂÄÇôÈí¼þ¶ÑÕ»µÄÄÚÈݽ«»á±»¸Ä±äÓ²¼þ¶ÑÕ»ÊÇÓÃ×÷º¯ÊýµÄ·µ»ØµØÖ·同样地如果你使用动态分配内存警戒线数据区低端地址警戒线启动代码写了一个正确的关于数据区的地址字节和一个类似的正确的关于软件堆栈的地址字节作为警戒线如果你使用了你自己的启动文件你将需要额外改造为新的启动文件如果你使用动态分配内存参考内存分配函数如果警戒线字节仍然保持正确的值那么函数检查通过那么警戒线字节将可能被破坏你的程序将可能运行不正常或偶然崩溃它调用了带一个参数的函数_StackOverflowed(char c)那么硬件堆栈有过溢出那么软件堆栈曾经溢出它是两个堆栈都可能溢出的在_StackOverflowed执行起作用时作为例子那么将不能返回_StackCheck函数库会用一个缺省的_StackOverflowed函数来跳转到0的位置你可能希望用一个函数来代替它以指示更多的错误条件注意自堆栈溢出指示故障程序以来这两个函数的原型在头文件macros.h.中访问A V R的低层硬件A V R系列使用高级语言编程时有很高的C语言密度由于AVR性能偶然情况下目标MCU的硬件特点在C语言中不能很好地使用头文件io*.h iom603.h等这些文件是从ATMEL官方发布的文件经过修改文件macros.h定义了许多有用的宏这个编译器的效率很高outsbi等注意尽管io*.h定义了它们的bit的位置很多时候你将需要使用定义在macros.h文件中的BIT()宏avr.h:#define SRE 0x80// 外部 RAM 使能... (你的C程序)MCUCR |= SRE;io8515.h#define SRE 7... (你的C程序)#include <macros.h>MCUCR |= BIT(SRE);2bit很幸运而没有借助于汇编指令或其它非标准C结构a |b – 按位或这惯用于打开某些位例如这个运算在检查某些位是否置1时有用If ((PORTA & 0x81) == 0) // 检查位7和位0注意圆括号需要括在&运算符的周围这是C程序中很多错误的原因之一这个运算对一个位取反有用在下面的例子中PORTA ^= 0x80; // 翻转位7~a – 按位取反. 在表达式中这个运算执行一个取反与这个运算组合使用尤其有用PORTA &= ~0x80;// 关闭位7这个编译器对这些运算能产生最理想的机器指令sbic指令可以用在根据位的状态进行条件分枝的按位与运算中程序存贮器和常量数据A V R是哈佛结构的MCUÕâÑùµÄÉè¼ÆÊÇÓÐһЩÓŵãµÄ·Ö¿ªµÄµØÖ·¿Õ¼äÔÊÐíA VR装置比传统结构访问更多的存贮器Atmega系列允许有超过64K字的程序存贮器和64K字节的数据存贮器而程序计数器仍保留在16位上C不是在这种机器上发明的C指针是任意一个数据指针或函数指针可是同是哈佛结构的AVR非标准C解决了这个问题注意对指针描述不管是限定指针变量自己还是指向项目的指针const int table[] = { 1, 2, 3 };const char *ptr1;char * const ptr2;const char * const ptr3;"table"是表格式样分配进程序存贮器"ptr2"是一个项目在程序存贮器而指向数据的指针在数据存贮器"ptr3"是项目在程序存贮器而指向数据的指针也在程序存贮器C 编译器生成LPM指令来访问程序存贮器而且在传统结构中因而无论如何例如带有const限定的第二个参数表示函数不能修改参数const限定词表示第二个参数指向程序存贮器是不合适的最后例如定义在函数体外的变量或有静态存贮类型限制的变量将不被放入FLASH中而可能导致不明确有结果字符串在哈佛结构的AVR中程序内存和数据内存分开给程序内存和数据内存的说明带来了一定的复杂性字符串这个编译器将带有const说明的表和项目放入程序存贮器中问题在于C中将字符串转换为char指针那么所有字符串库函数中的任意一个必须被复制成不同于指针的操作ImageCraft编译器提出了解决这个问题的两个方法所有涉及的字符串是拷贝进数据存贮器的在程序启动时字符串是由程序存贮器拷贝进数据存贮器中的编译器执行全局变量初始化也是这样处理的如果你希望节省空间例如hello可以在上下文中作为字符串使用Printf已被扩展成带%S格式字符来输出只存贮于FLASH中字符串新的字符串函数已加入了对只存贮于FLASH中字符串的支持你可以指挥编译器将字符串只放在FLASH中当这个选项是选中的并且你必须保证函数获得了合适的参数类型创建了cprintf 和csprintf函数承认字符串格式的类型注意只分配全部字符串到FLASH存贮器中应使用cprintf()²¢ÇÒ¼Ó%S参数应使用printf()²¢ÇÒ¼Ó%S参数堆栈生成代码使用两个堆栈一个是用于以堆栈结构传递的参数硬件堆栈起初是用于存贮函数返回的地址通常没有子程序调用那么默认的16字节应该在大多数的例子中能良好工作除了很繁重的递归调用程序硬件堆栈是从数据内存的顶部开始分配的硬件堆栈和数据内存的大小是受在编译器选项中的目标装置项设定限制的在IO空间后面是正确的如果你选择的目标装置带有32K或64K的外部SRAM¶øÇÒÏòµÍÄÚ´æµØÖ··½ÏòÉú³¤堆栈检查任意一个程序失败的重要原因是堆栈溢出到其它数据内存的范围并且当一个堆栈溢出时会偶然产生坏的事情6ÔÚÏß»ã±àÔÊÐíÄãд»ã±à´úÂë½øÄãµÄC文件中当然asm("<string>");多个汇编声明可以被符号\n分隔成新的一行String³ýÁ˶îÍâÔö¼ÓµÄASM关键词可使用%<变量名>格式如果你在汇编指令中需使用一个CPU寄存器register通常如果你在函数中描述了太多的寄存器变量在这种情况那时也不能控制寄存器变量的分配作为例子但这里没有请求使用在线汇编在线汇编可以被用在C函数的内部或外部不象AVR汇编器所以你可以在你的在线汇编代码中创建标签你可能得到一个警告7°üÀ¨×´Ì¬¼Ä´æÆ÷SREG IO地址在0x00和0x3f之间或者使用在0x20 和0x5F之间的数据内存地址两种方法在C中都可使用一个直接地址可以通过加指针类型符号直接访问SREG的数据内存在地址是0x5F:unsigned char c = *(volatile unsigned char *)0x5F; // 读SREG*(volatile unsigned char *)0x5F |= 0x80; // 打开全局断位注意注意不要不注意地改变CPU寄存器编译器自动生成低级指令象in sbrsIO地址register unsigned char uc;asm("in %uc,$3F");// 读 SREGasm("out $3F,%uc"); // 打开全局中断位注意尽管io*.h定义了它们的bit的位置很多时候你将需要使用定义在macros.h文件中的BIT()宏avr.h:#define SRE 0x80// 外部 RAM 使能... (填充你的C程序)MCUCR |= SRE;io8515.h#define SRE 7... (填充你的C程序)#include <macros.h>MCUCR |= BIT(SRE);8ÀýÈçÍⲿIO设备通常被映射成特殊的内存通常你可以使用在线汇编或单独的汇编文件来描述那些定位在特殊内存地址的数据已在C语言中提供这些能力假设有一个两字节的LCD 控制寄存器定位在0x1000地址并且有一个100字节的双口SRAM定位在0x2000的地址在一个汇编文件中输入以下内容extern unsigned int LCD_control_register, LCD_data_register;extern char dual_port_SRAM[100];注意并且使用两个冒号定义为全局变量在线汇编遵守同样的汇编语法规则在C文件中asm(".area memory(abs)"".org 0x1000""_LCD_control_register:: .blkw 1""_LCD_data_register:: .blkw 1");asm(".org 0x2000""_dual_port_SRAM:: .blkb 100");在C中你仍然要使用"extern"描述变量否则C编译器不会真正知道在asm中的声明C任务 作为汇编界面的描述和调用规则在一些情况下例如实时操作系统RTOS管理着寄存器的保存和恢复并作为任务切换处理的一部分为了禁止这种行为例如注意作为默认的情况它也没有必要为返回保存和恢复任意一个寄存器中断操作C中断操作中断操作中C中可以使用你必须用一个附注在函数定义之前通知编译器这个函数是一个中断操作注意向量号是从1开始的这个附注有两个作用:对中断操作函数而且保存和恢复在函数中用过的全部寄存器例如jmp _timer_handler ;对Mega MCU上述指令定位在0x06Õë¶ÔÆÕͨװÖÃ字节地址Mega 使用2个字作为中断向量如果你希望对多个中断入口使用同一个中断操作分别带有多个不同的向量号#pragma interrupt_handler timer_ovf:7 timer_ovf:8汇编中断操作你可以用汇编语言写中断操作无论如何要小心参考汇编界面C函数不做这些工作那么你必须自己定义向量用".org"来声明rjmp 或jmp指令的正确地址; 对全部除ATMega 以外的MCU.area vectors(abs) ;中断向量.org 0x6rjmp _timer; 对 ATMega MCU.area vectors(abs) ; 中断向量.org 0xCjmp _timer11ÔÚ\icc\examples.avr目录12ÔÚµ÷ÓÃÕâЩº¯Êý֮ǰ¼ÓÈë#include <eeprom.h>"object"可以是任意程序变量包括结构和数组int i;EEPROM_Read(0x1, i); // 读2个字节给iEEPROM_WRITE(int location, object)这个宏调用了EEPROMWriteBytes函数将数据对象写入到EEPROM的指定位置例如int i;EEPROM_WRITE(0x1, i); //写两个字节至0x1这些宏和函数可以用于任意AVR装置即使不需要高地址字节它们也是欠佳的如果它关系重大初始化EEPROMEEPROM可以在你的程序源文件中初始化这是可以用附注实现的例如为返回默认的"data."区域需要重设数据区名称初始化EEPROM数据至0地址是不可以使用的比如访问在另一个文件中的foo你不需要加入这个附注extern int foo;int i;EEPROM_READ((int)&foo, i);内部函数如果需要下列函数可以直接使用unsigned char EEPROMread(int location)从EEPROM指定位置读取一个字节int EEPROMwrite(int location, unsigned char byte)写一个字节到EEPROM指定位置 void EEPROMReadBytes(int location, void *ptr, int size) 从EEPROM指定位置处开始读取"size"个字节至由"ptr."指向的缓冲区写的内容由"ptr."指向的缓冲区提供访问SPI一个以查寻模式访问SPI的函数是提供的 14全部范围内的跳转可以使用相对转移和调用指令(rjmp 和 rcall)Ïà¶ÔתÒƺ͵÷Óõķ¶Î§ÊÇÒÔ8K为分界的一个较远的跳转跳转到0x2100字节处实际上会跳转到地址0x100处只要目标装置的程序存贮器是8K的 C的运行结构17位表示指数1位表示符号而且将被包含在一个较小的空间中struct {unsigned a : 1, b : 1;};这个结构体的长度只有一个1 byte2名称C 语言中的名称在汇编文件中是以下划线为前坠的名称的有效长度为32个字符:可以定义成一个全局变量_foo::.word 1(在C 文件中)extern int foo;b)µÚ¶þ¸ö²ÎÊýÔòͨ¹ýR18/R19传递其余参数通过软件堆栈传递如char int¼´Ê¹º¯ÊýÔ-ÐÍÊÇ¿ÉÓõĶøµÚ¶þ¸ö²ÎÊýÊdz¤ÕûÐÍ»ò¸¡µãÊý¶ø¸ß°ë²¿·Öͨ¹ýÈí¼þ¶ÑÕ»´«µÝ。
ImageCraft ICCAVR 的中文使用说明
#pragma ctask <func1> <func2>... 这个附注指定了函数不生成挥发寄存器来保存和恢复代码 它的典型应用是在 RTOS
实时操作系统中让 RTOS 核直接管理寄存器
#pragma text:<name> 改变代码段名称 使其与命令行选项相适应
#pragma data:<data> 改变数据段名称 使其与命令行选项相适应 这个附注在分配全局变量至 EEPROM
击鼠标右键选择编译选项
在工程窗口中双击文件名 IDE 将使用编辑器打开这个文件 按这个方法打开 led.c
作为试验可设置一些错误 例如从一行中删除分号
现在从 Project 菜单中选择 Make
Project 命令ห้องสมุดไป่ตู้IDE 首先自动保存已经改变的文件 并且开始编译这个文件 这时在状态
窗口中会显示错误信息 单击状态窗口中错误信息行 或单击其左边的错误符号 光标
ImageCraft ICCAVR 的中文使用说明
ImageCraft ICCAVR 的中文使用说明
翻译 詹卫前
一 ImageCraft 的 ICC AVR 编译器安装 1 运行光盘上的 SETUP.EXE 程序进行安装 方法一 a 打开 我的电脑 b 打开光盘驱动器所对应的盘符 c 双击光盘中文件 SETUP.EXE 的图标 d 按照屏幕提示 选定一个安装路径后进行安装 方法二 a 在 开始 菜单中选择运行项目 b 在 运行 对话框中填入 drive:\setup.exe 注意 drive 对应你的机器中的光盘驱动器盘符 c 按 确定 键开始安装 d 其余同方法一 注意 按上述方法进行安装后 得到的是一个只可以使用 30 天的未注册版 对正式版 用户还要进行第二步的注册 才可得到一个无时间限制的正式版 ICC AVR 正式版分标准版和专业版 在标准版中有一些功能限制 如 代码的 压缩 工程和文件的配置检查在标准版中不可以使用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ICCAVR中文使用说明(1)ImageCraft ICCAVR 的中文使用说明ICCAVR 介绍1 ImageCraft 的ICCAVR 介绍ImageCraft 的ICCAVR 是一种使用符合ANSI 标准的C 语言来开发微控制器MCU程序的一个工具它有以下几个主要特点ICCAVR 是一个综合了编辑器和工程管理器的集成工作环境IDE 其可在WINDOWS9X/NT 下工作源文件全部被组织到工程之中文件的编辑和工程的构筑也在这个环境中完成编译错误显示在状态窗口中并且当你用鼠标单击编译错误时光标会自动跳转到编辑窗口中引起错误的那一行这个工程管理器还能直接产生您希望得到的可以直接使用的INTEL HEX 格式文件INTEL HEX 格式文件可被大多数的编程器所支持用于下载程序到芯片中去ICCAVR 是一个32 位的程序支持长文件名出于篇幅考虑本说明书并不介绍通用的C 语言语法知识仅介绍使用ICC AVR 所必须具备的知识因此要求读者在阅读本说明书之前应对C 语言有了一定程度的理解2 ICCAVR 中的文件类型及其扩展名文件类型是由它们的扩展名决定的IDE 和编译器可以使用以下几种类型的文件输入文件.c 扩展名----表示是C 语言源文件.s 扩展名----表示是汇编语言源文件.h 扩展名----表示是C 语言的头文件.prj 扩展名----表示是工程文件这个文件保存由IDE 所创建和修改的一个工程的有关信息.a 扩展名----库文件它可以由几个库封装在一起libcavr.a 是一个包含了标准C 的库和AVR 特殊程序调用的基本库如果库被引用链接器会将其链接到您的模块或文件中您也可以创建或修改一个符合你需要的库输出文件.s 对应每个C 语言源文件由编译器在编译时产生的汇编输出文件.o 由汇编文件汇编产生的目标文件多个目标文件可以链接成一个可执行文件.hex INTEL HEX 格式文件其中包含了程序的机器代码.eep INTEL HEX 格式文件包含了EEPROM 的初始化数据.cof COFF 格式输出文件用于在ATMEL 的AvrStudio 环境下进行程序调试.lst 列表文件在这个文件中列举出了目标代码对应的最终地址.mp 内存映象文件它包含了您程序中有关符号及其所占内存大小的信息.cmd NoICE 2.xx 调试命令文件.noi NoICE 3.xx 调试命令文件.dbg ImageCraft 调试命令文件3 附注和扩充#pragma 编译附注这个编译器接受以下附注#pragma interrupt_handler <func1>:<vector number> <func2>:<vector> ...这个附注必须在函数之前定义它说明函数func1 func2 是中断操作函数所以编译器在中断操作函数中生成中断返回指令reti 来代替普通返回指令ret 并且保存和恢复函数所使用的全部寄存器同样编译器根据中断向量号vector number 生成中断向量地址#pragma ctask <func1> <func2>...这个附注指定了函数不生成挥发寄存器来保存和恢复代码它的典型应用是在RTOS实时操作系统中让RTOS 核直接管理寄存器#pragma text:<name>改变代码段名称使其与命令行选项相适应#pragma data:<data>改变数据段名称使其与命令行选项相适应这个附注在分配全局变量至EEPROM中时必须被使用读者可参考访问EEPROM 的例子#pragma abs_address:<address>函数与全局数据不使用浮动定位重定位而是从<address>开始分配绝对地址这在访问中断向量和其它硬件项目时特别有用#pragma end_abs_address结束绝对定位使目标程序使用正常浮动定位C++ 注释如果你选择了编译扩充(Project->Options->Compiler) 你可以在你的源代码中使用C ++ 的 // 类型的注释二进制常数如果你选择了编译扩充(Project->Options->Compiler) 你可以使用0b<1|0>* 来指定二进制常数例如0b10101 等于十进制数21在线汇编你可以使用asm("string")函数来指定在线汇编代码读者可参考在线汇编4 代码转换IAR 或其它ANSI C 编译系统的代码转换IAR C 编译器作为应用于AVR 的第一个C 编译器它有十分丰富的源代码当你从IAR编译系统转换到ImageCraft 编译系统时绝大多数符合ANSI C标准的程序代码不需要转换IAR C 中IO 寄存器的定义与ICCAVR 也是相同的中断操作描述ICCAVR 使用pragma 附注描述中断操作函数而IAR 引入了语法扩充interrupt 关键字下面是一个对照在ICCAVR 中#pragma interrupt_handler func:4 // 4 是这个中断的向量号func 为中断处理函数名称ICCAVR 可以使多个中断向量共用一个中断处理函数在IAR 中interrupt [vector_name] func() // vector_name 是某一个中断向量的名称IAR C 的中断向量地址使用中断名称来代替以增加程序的可读性扩充关键字IAR 引入flash 关键字将项目分配进入程序存贮空间FLASH 存贮器ICCAVR 使用const 关键字来达到相同的目的过程调用转换在两个编译系统之间函数参数传递使用的寄存器是不同的这仅影响手工写的汇编函数在线汇编宏等IAR 不支持在线汇编符号而ICCAVR 支持在线汇编ICCAVR中文使用说明(2)1 起步自你启动IDE 后首先从Project 菜单系统选择Open 命令进入\icc\examples.avr 目录并且选择并打开led 工程工程管理器显示在这个工程中只有一个文件 led.c 然后从Project 菜单中选择Options 命令打开工程编译选项在"Target"标号下选择目标处理器然后从Project 菜单中选择Make Project 命令IDE 将调用编译器编译这个工程文件并且在状态窗口中显示所有的信息如果没有错误在与源文件同一个目录在这个例子中是\icc\examples.avr 中输出一个文件 led.hex 这个文件是INTEL HEX 格式大多数能支持AVR MCU 的编程器和模拟器都支持这种格式并且能下载这个程序进入你的目标系统这样就完成了一个程序的构筑如果你希望用支持COFF 调试信息的工具来测试你的程序比如AVR Studio 那么你需要从Project 菜单中选择Options 命令在编译标签下选择COFF 输出文件格式对一些常用的功能你也可使用工具条或鼠标右键弹出菜单例如你可以在工程窗口单击鼠标右键选择编译选项在工程窗口中双击文件名IDE 将使用编辑器打开这个文件按这个方法打开led.c作为试验可设置一些错误例如从一行中删除分号现在从Project 菜单中选择Make Project 命令IDE 首先自动保存已经改变的文件并且开始编译这个文件这时在状态窗口中会显示错误信息单击状态窗口中错误信息行或单击其左边的错误符号光标将移到编辑器中错误行的下面一行上基本上所有C 编译器都是这样开始一个新的工程从Project 菜单中选择New 命令并且浏览至你希望输出工程文件的目录输出文件的名称取决于你的工程文件名称例如如果你创建一个名称为foo.prj 的工程那么输出文件名称为foo.hex 或foo.cof 等自从创建你自己的工程后你可以开始写你的源代码(C 或汇编格式) 并且将这个文件加入到工程文件排列中单击工具栏中Build 图标可以很容易地构筑这个工程IDE 输出与ATMEL 的AVR Studio 完全兼容的COFF 文件你可以使用ATMEL 的AVR Studio 来调试你的代码为更容易地使用这个开发工具你可以使用应用程序向导来生成一些使用有关硬件的初始化代码2 C 程序的剖析一个C 程序必须定义一个main 调用函数编译器会将你的程序与启动代码和库函数链接成一个可执行文件因此你也可以在你的目标系统中执行它启动代码的用途在启动文件中很详细地被描述了一个C 程序需要设定目标环境启动代码初始化这个目标使其满足所有的要求通常你的main 例程完成一些初始化后然后是无限循环地运行作为例子让我们看 \icc\examples 目录中的文件led.c#include <io8515.h>/* 为使能够看清LED 的变化图案延时程序需要有足够的延时时间*/void Delay(){unsigned char a, b;for (a = 1; a; a++)for (b = 1; b; b++);}void LED_On(int i){PORTB = ~BIT(i); /* 低电平输出使LED 点亮 */Delay();}void main()4{int i;DDRB = 0xFF; /*定义 B口输出*/PORTB = 0xFF; /* B 口全部为高电平对应LED 熄灭*/while (1){/*LED 向前步进 */for (i = 0; i < 8; i++)LED_On(i);/* LED 向后步进 */for (i = 8; i > 0; i--)LED_On(i);/* LED 跳跃*/for (i = 0; i < 8; i += 2)LED_On(i);for (i = 7; i > 0; i -= 2)LED_On(i);}}这个main 例程是很简单的在初始化一些IO 寄存器后之后它运行在一个无限循环中并且在这个循环中改变LED 的步进图案LED 是在LED_On 例程中被改变的在LED_On 例程中直接写正确的数值到IO 端口因为CPU 运行很快为能够看见图案变化LED_On 例程调用了延时例程因为延时的实际延时值不能被确定这一对嵌套循环只能给出延时的近似延时时间如果这个实际定时时间是重要的那么这个例程应该使用硬件定时器来完成延时其它的例子8515intr.c 程序很简单但同样清楚地显示了如何用C 写一个中断处理过程这两个例子可以作为你的程序的起点四ICCAVR 的IDE 环境1 编译一个单独的文件正常建立一个输出文件的次序是你首先应该建立一个工程文件并且定义属于这个工程的所有文件然而我们有时也需要将一个文件单独地编译为目标文件或最终的输出文件这时可以这样操作从IDE 菜单File 中选择Compile File... 命令来执行to Object 和to Output 中的任意一个当你调用这个命令时文件应该是打开的并且在编辑窗口中可以编辑的编译一个文件为目标文件to Object 对检查语法错误和编译一个新的启动文件是很有用的编译一个文件为输出文件to Output 对较小的并且是一个文件的程序较为有用注意这里使用默认的编译选项2 创建一个新的工程为创建一个新的工程从菜单Project 中选择New 命令IDE 会弹出一个对话框在对话框中你可以指定工程的名称这也是你的输出文件的名称如果你使用一些已经建立的源文件你可在菜单Project 中选择AddFile(s) 命令另外你可以在菜单File 中选择New 命令来建立一个新的源文件来输入你的代码你可以在菜单File 中选择Save 或Save As 命令来保存文件然后你可以象上面所述调用AddFile(s) 命令将文件加入到工程中也可在当前编辑窗口中单击鼠标右键选择Add to Project 将文件加入已打开的工程列表中通常你输出源文件在工程同一个目录中但也可不作这样要求工程的编译选项使用菜单中Project 中的Options 命令3 工程管理工程管理允许你将多个文件组织进同一个工程而且定义它们的编译选项这个特性允许你将工程分解成许多小的模块当你处理工程构筑时只有一个文件被修改和重新编译如果一个头文件作了修改当你编译包含这个头文件的源文件时IDE 会自动重新编译已经改变的头文件一个源文件可以写成C 或汇编格式的任意一种C 文件必须使用.c 扩展名汇编文件必须使用.s 扩展名你可以将任意文件放在工程列表中例如你可以将一个工程文档文件放在工程管理窗口中工程管理器在构筑工程时对源文件以外的文件不予理睬对目标器件不同的工程可以在编译选项中设置有关参数当你新建一个工程时使用默认的编译选项你可以将现有编译选项设置成默认选项也可将默认编译选项装入现有工程中默认编译选项保存在default.prj 文件中为避免你的工程目录混乱你可以指定输出文件和中间文件到一个指定的目录通常这个目录是你的工程目录的一个子目录4 编辑窗口编辑窗口是你与IDE 交流信息的主要区域在这个窗口中你可以修改相应的文件当编译存在错误时用鼠标单击有关错误信息时编辑器会自动将光标定位在错误行的位置注意对C 源文件中缺少分号的错误编辑器定位于其下面一行5 应用构筑向导应用构筑向导是用于创建外围设备初始化代码的一个图形界面你可以单击工具条中的Wizard 按钮或菜单Tools 中的ApplicationBuilder 命令来调用它应用构筑向导使用编译选项中指定的目标MCU来产生相应的选项和代码应用构筑向导显示目标MCU 的每一个外围设备子系统它的使用是很显而易见的在这里你可以设置MCU 的所具有的中断内存定时器IO 端口UART SPI 和模拟量比较器等外围设备并产生相应的代码如果你需要的话还可产生main( )函数6 状态窗口状态窗口显示IDE 的状态信息7 终端仿真IDE 有一个内置的终端仿真器注意它不包含任意一个ISP 在系统编程功能但它可以作为一个简单的终端或许可以显示你的目标装置的调试信息也可下载一个ASC 码文件从6.20 版本开始IDE 加入了对ISP 的支持五菜单解释1 弹出菜单在ICCAVR 环境中单击右键那么ICCAVR 会根据实际情况弹出相应的工具菜单2 File Menu 文件菜单New 新建一个文件你可在编辑窗口是输入文字或代码Reopen 重新打开历史文件有关历史文件显示的右边的子菜单中Open 打开一个已以经存在的文件用于编辑文件用浏览窗口选择Reload … form Disk 放弃全部的修改从磁盘中重新装载当前文件Reload ….from Back UP 从最后一次的备份文件中装载当前文件Save 保存当前文件如果环境设置中设置了保存备份文件则将原文件以<file>.~<ext>形式保存Save as 将当前文件用另外一个名称来保存Close 关闭当前文件如果文件有过修改系统会进行提示Compile File … to Object 编译当前文件成目标文件注意目标文件不可以直接用于对芯片编程或用于调试其主要用于语法检查为创建新的启动文件或库产生目标文件Compile File ... to Output 编译当前文件成输出文件其产生的输出文件可用于编程器和调试器Save All 保存所有打开的文件Closs All 关闭当前打开的所有文件同样它会提示你保存已经修改的文件Print 打印当前文件Exit 退出ICCAVR 的IDE 环境3 Edit Menu 编辑菜单Undo 撤消最后一次的修改Redo 撤消最后一次的UndoCut 剪切选择的内容到剪帖板Copy 拷贝选择的内容到剪帖板Paste 将剪帖板内容粘帖在当前光标的位置Delete 删除选择的内容Select All 选择全部内容Block Indent 对选择的整块内容右移Block Outdent 对选择的整块内容左移4 Search menu 寻找菜单Find …在编辑窗口中寻找一个文本它有以下选项Match Case –区分大小写Whole Word –全字匹配Up/Down –往上或往下Find in Files... –在当前打开的文件中或在当前工程的所有文件中或当前目录中的文件中寻找一段文本它有以下选项Case Sensitive –大小写敏感Whole Word - 全字匹配Regular Expression –寻找规则的表达式Replace... –在编辑器中替换文本Find Again –寻找下一个Goto Line Number –转到指定行号Add Bookmark –添加书签Delete Bookmark –删除书签Next Bookmark –跳转到下一个签Goto Bookmark –跳转到指定的书签5 View Menu 视图菜单Status Window –如果选中显示状态窗口Project Makefile –以只读方式打开makefile 文件Output Listing File –以只读方式打开列表文件6 Project Menu 工程菜单New... –创建一个新的工程文件Open –打开一个已经存在的工程文件Open All Files... –打开工程的全部源文件Close All Files –关闭全部打开的文件Reopen... –重新打开一个最近打开过的工程文件Make Project –解释和编译已经修改的文件为输出文件Rebuild All –重新构筑全部文件注意在版本升级后对原有工程最好全部重新构筑Add File(s) –添加一个文件到工程中这个文件可以是非源文件Remove Selected Files –从工程中删除选择的文件Option... –打开工程编译选项对话框Close –关闭工程Save As... –将工程换一个名称存盘7 Tools Menu 工具菜单Environment Options –打开环境和终端仿真器选项对话框Editor and Print Options –打开编辑和打印选项对话框AVR Calc –打开AVR 计算器可以计算UART 的波特率定时器的定时常数Application Builder –打开应用向导程序生成硬件的初始化代码Configure Tools –允许你添加自己的内容到工具菜单Run –以命令行方式运行一个程序8 Compiler Options 编译选项编译选项总共有三个页面Paths Compiler 和Target在Paths 页面中有Include Path(s) –你可以指定包含文件的路径Assembler Include Path(s) –指定汇编包含文件的路径Library Path –链接器所使用的库文件的路径Output Directory –输出文件的目录Compiler 页面有Strict ANSI C Checking –严格的ANSI C 语法检查Accept Extensions –接受C++类型语法扩充Macro Define(s) –定义宏宏之间用空格或分号分开宏定义形式如下name[:value] 或 name[=value]例如DEBUG:1;PRINT=printf等价于#define DEBUG 1#define PRINT printfMacro Undefine(s) –同上但意义相反Output File Format –输出文件格式COFF/HEX Intel HEX 或COFFOptimizations –代码优化Default –基本优化象寄存器分配共用相同的子例程等Maximize Code Size Reduction –只有专业版才可使用它调用了代码压缩优化去除了无用的碎片代码Target 页面有Device Configuration –选择目标MCUMemory Sizes –要选择"Custom" 时指定内存大小包括ROM SRAM 和EEPROMText Address –通常代码地址开始于中断向量区域后面Data Address –指定数据起始地址通常为0x60Use Long JMP/CALL –指定MCU 是否支持长跳转和长调用Enhanced Core –指定硬件支持增强核指令IO Registers Offset Internal SRAM –指定内部SRAM 的偏移量例如, 8515 的SRAM 起始于0x60, 在IO 寄存器空间后面延伸了512 字节而 Mega603 , IO 寄存器覆盖在SRAM 空间中因此SRAM 也是从0 开始的Internal 对External SRAM –指定你的目标系统的数据SRAM 类型PRINTF Version –选择PRINTF 的版本Small 或 Basic: 只有 %c, %d, %x, %X, %u, and %s 格式支持Long: 支持 %ld, %lu, %lx, %lXFloating point: %f 支持注意这个选项需要很大的内存AVR Studio Simulator IO –如果选中 AVR Studio 的终端模拟仿真被支持Additional Libraries –使用标准库以外的附加库Strings in FLASH –字符串只保存在FLASH存贮器中Return Stack Size –指定编译器使用的硬件堆栈的大小编译器使用的软件堆栈的大小不需地指定Non Default Startup –允许你指定一个启动文件的位置系统默认的启动文件在Paths 页中指定这样IDE 可以使用多个启动文件Unused ROM Fill Pattern –用一串十六进制数填充空余的ROM 空间ICCAVR中文使用说明(3)C 库函数与启动文件1 启动文件这个链接器会自动将启动文件连接到您的程序之前并将标准库libcavr.a 与你的程序相连接启动文件根据目标MCU 的不同在crtavr.o 和 crtatmega.o 中间任意选择一个启动文件定义了一个全局符号__start 它也是您的程序的起点启动文件的功能有1 初始化硬件和软件堆栈指针2 从idata 区拷贝初始化数据到直接寻址数据区data 区3 将bss 区全部初始化为零4 调用用户主例程main 函数5 定义一个退出点如果你的主函数main( )一旦退出它将进入这个退出点进行无限循环启动文件也定义了复位向量你不需要修改启动文件来使用别的中断具体可参考中断操作部分为修改和使用新的启动文件cd \icc\libsrc.avr ; 进入你安装的编译器路径<edit crtavr.s> ; 编辑修改crtavr.s 文件<open crtavr.s using the IDE> ; 用IDE 打开crtavr.s 文件<Choose "Compile File To->Object"> ;选择编译到目标文件创建一个新的crtavr.o copy crtavr.o ..\lib ; 拷贝到库目录如果您使用的目标MCU 是Mega 你应该用"crtatmega" 代替"crtavr" 注意Mega 的每个中断入口地址使用两个字word 而非Mega 芯片每一个中断入口地址使用一个字word .你也可以有多个启动文件你可以在工程选项对话框中很方便地直接指定一个启动文件加入您的工程中注意您必须指定启动文件的绝对路径或启动文件必须位于工程选项库路径所指定的目录中2 常用库介绍1 库源代码这个库源代码缺省路径为c:\icc\libsrc.avr\libsrc.zip 是一个密码保护的ZIP 压缩文件你可以从互连网上任意下载一个UNZIP 程序进行解压缩当本软件被开锁后密码显示在"About"对话框中例如unzip -s libsrc.zip; unzip 提示输入密码2 AVR 特殊函数----- ICCAVR 有许多访问UART EEPROM 和SPI 的函数堆栈检查函数对检测堆栈是否溢出很有用另外我们的互连网上有一个页专门存放用户写的源代码3 io*.h (io2313.h, io8515.h, iom603.h, ... 等.)这些文件中是从ATMEL 官方公开的定义IO 寄存器的源文件经过修改得到的应该用这些文件来代替老的avr.h 文件PORTB = 1;uc = PORTA;4 macros.h这个文件包含了许多有用的宏和定义5 其它头文件下列标准的C 头文件是被支持的如果你的程序使用了头文件所列出的函数那么包含头文件是一个好习惯在使用浮点数和长整型数的程序中必须用 #include 预编译指令包含这些包含了这些函数原形的头文件读者可参考返回非整型值的函数assert.h - assert(), 声明宏ctype.h –字符类型函数float.h –浮点数原形limits.h –数据类型的大小和范围math.h –浮点运算函数stdarg.h –变量参数表.stddef.h –标准定义stdio.h –标准输入输出IO 函数stdlib.h –包含内存分配函数的标准库string.h –字符串处理函数3 字符类型库下列函数按照输入的ACS II 字符集字符分类使用这些函数之前应当用"#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 对应的小写字母其它类型仍然返回cint toupper(int c)如果c 是小写字母则返回c 对应的大写字母其它类型仍然返回c4 浮点运算库下列函数支持浮点数运算使用这些函数之前必须用#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 的幂即exfloat exp10(float x)返回以10 为底的幂即10xfloat 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 e x pfloat 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 的双曲正切函数值5 标准输入输出库标准的文件输入输出是不能真正植入微控制器MCU 的标准stdio.h 的许多内容不可以使用不过有一些IO 函数是被支持的同样使用之前应用"#include <stdio.h>"预处理并且需要初始化输出端口最低层的IO 程序是单字符的输入(getchar)和输出(putchar)程序如果你针对不同的装置使用高层的IO 函数例如用 printf 输出LCD 你需要全部重新定义最底层的函数为在ATMEL 的AVR Studio 模拟器终端IO 窗口使用标准IO 函数应当在编译选项中选中相应的单选钮注意作为缺省单字符输出函数putchar 是输出到UART 装置没有修改无论如何为使输出能如期望的那样出现在程序终端窗口中'' 字符必须被映射为成对的回车和换行CR/LFint getchar()使用查寻方式从UART 返回一个字符int printf(char *fmt, ..)按照格式说明符输出格式化文本frm 字符串格式说明符是标准格式的一个子集%d--输出有符号十进制整数%o --输出无符号八进制整数%x - 输出无符号十六进制整数%X –除了大写字母使用'A'-'F'外同 %x%u - 输出无符号十进制整数%s –输出一个以C 中空字符NULL 结束的字符串%c –以 ASCII 字符形式输出只输出一个字符%f –以小数形式输出浮点数%S –输出在FLASH存贮器中的字符串常量printf 支持三个版本取决于你的特别需要和代码的大小越高的要求代码越大基本形: 只有 %c, %d, %x, %u, 和 %s 格式说明符是承认的长整形: 针对长整形数的修改 %ld, %lu, %lx 被支持, 以适用于精度要求较高的领域浮点形: 全部格式包括%f 被支持你使用编译选项对话框来选择版本代码大小的增加是值得关注的int putchar(int c)输出单个字符这个库程序使用了UART 以查寻方式输出单个字符注意输出’’字符至程序终端窗口int puts(char *s)输出以NL 结尾的字符串int sprintf(char *buf, char *fmt)按照格式说明符输出格式化文本frm 字符串到一个缓冲区格式说明符同printf( ) "const char *" 支持功能cprintf 和csprintf 是将FLASH中的格式字符串分别以prinf 和sprinf 形式输出6 标准库和内存分配函数标准库头文件<stdlib.h>定义了宏NULL 和RAND_MAX 和新定义的类型size_t 并且描述了下列函数注意在你调用任意内存分配程序比如.. calloc malloc 和realloc)之前必须调用_NewHeap 来初始化堆heapint abs(int i)返回i 的绝对值int atoi(char *s)转换字符串s 为整型数并返回它字符串s 起始必须是整型数形式字符否则返回0。