admin 管理员组

文章数量: 887039


2024年1月24日发(作者:springcloud是分布式框架吗)

ImageCraft ICCAVR的中文使用说明ImageCraft ICCAVR的中文使用说明翻译 詹卫前一运行光盘上的程序进行安装 aÎҵĵçÄÔ打开光盘驱动器所对应的盘符 按照屏幕提示a¿ªÊ¼在对话框中填入          注意drive对应你的机器中的光盘驱动器盘符 cÈ·¶¨其余同方法一注意按上述方法进行安装后 用户还要进行第二步的注册在标准版中有一些功能限制压缩2¿ÉÒÔÕâÑù×¢²áabcIDEUnlock DiskImporting a License from a Floppy Disk对正式版代码的Help²¢ÇÒ½øÐе¥»÷ ICCAVR软件自动进行注册当你确定并再次重新启动ICCAVR后 对不是首次安装或使用时间已超过30天的用户 对这类用户在程序启动时已不能进入IDE环境你应该选择按钮 这时会出现一个注册对话框a Floppy DiskcUnlock Diskµ¥»÷ÉÏÒ»²½ÖÐÌáµ½µÄ°´Å¥ ICCAVR软件自动进行注册当你确定并再次重新启动ICCAVR后 注意 软盘在注册时应打开写保护软盘成为一张空盘Importing a License from应该首先在菜单中选择广州市天河双龙电子有限公司 选择双龙电子 选择未来科技1

ImageCraft ICCAVR的中文使用说明Your License to a Floppy Disk½«ÄãµÄ×¢²áÎļþ´«Ë͵½Ò»ÕÅÈíÅÌÉ϶þ ImageCraft 的ICCAVR介绍 ImageCraft 的ICCAVR是一种使用符合ANSI标准的C语言来开发微控制器程序的一个工具ICCAVR是一个综合了编辑器和工程管理器的集成工作环境源文件全部被组织到工程之中编译错误显示在状态窗口中光标会自动跳转到编辑窗口中引起错误的那一行INTEL HEX格式文件可被大多数的编程器所支持ICCAVR是一个32位的程序出于篇幅考虑必须具备的知识ICCAVR中的文件类型及其扩展名文件类型是由它们的扩展名决定的输入文件仅介绍使用ICC AVR所应对C语言有了一定程度的理解这个文件保存由IDE所创建和修改的一个工程的有关信息它可以由几个库封装在一起如果库被引用您也可以创建或修改一个符合你需要的库.s 对应每个C语言源文件.o 由汇编文件汇编产生的目标文件.hex INTEL HEX格式文件.eep INTEL HEX格式文件.cof COFF 格式输出文件.lst 列表文件.mp 内存映象文件.cmd NoICE 调试命令文件.dbg ImageCraft 调试命令文件附注和扩充#pragma

Õâ¸ö±àÒëÆ÷½ÓÊÜÒÔϸ½×¢广州市天河双龙电子有限公司 选择双龙电子 选择未来科技2

ImageCraft ICCAVR的中文使用说明 这个附注必须在函数之前定义所使用的全部寄存器func2是中断操作函数并且保存和恢复函数#pragma ctask ... 这个附注指定了函数不生成挥发寄存器来保存和恢复代码#pragma text: 改变代码段名称#pragma data: 改变数据段名称中时必须被使用#pragma abs_address:

函数与全局数据不使用浮动定位在访问中断向量和其它硬件项目时特别有用使目标程序使用正常浮动定位你可以在你的源代码中使用C ++的 // 类型的注释你可以使用0b<1|0>* 来指定二进制常数0b10101等于十进制数21¶ÁÕ߿ɲο¼ÔÚÏß»ã±à代码转换 IAR或其它ANSI C编译系统的代码转换 IAR C编译器作为应用于AVR的第一个C编译器编译系统转换到ImageCraft编译系统时IAR C中IO寄存器的定义与ICCAVR也是相同的ICCAVR使用pragma附注描述中断操作函数interrupt关键字下面是一个对照 #pragma interrupt_handler func:4// 4 是这个中断的向量号ICCAVR可以使多个中断向量共用一个中断处理函数 interrupt [vector_name] func() // vector_name是某一个中断向量的名称以增加程序的可读性FLASH存贮器const关键字来达到相同的目的这仅影响手工写的汇编函数宏等而ICCAVR支持在线汇编ICCAVR使用这个附注在分配全局变量至EEPROM这当你从IAR广州市天河双龙电子有限公司 选择双龙电子 选择未来科技3

ImageCraft ICCAVR的中文使用说明三起步 自你启动IDE后进入目录并且选择并打开工程然后从Project菜单中选择Options命令打开工程编译选项然后从Project菜单中选择Make Project命令并且在状态窗口中显示所有的信息在与源文件同一个目录中输出一个文件 ´ó¶àÊýÄÜÖ§³ÖAVR MCU的编程器和模拟器都支持这种格式这样就完成了一个程序的构筑比如AVR StudioÔÚ±àÒë±êÇ©ÏÂÑ¡ÔñCOFF输出文件格式你也可使用工具条或鼠标右键弹出菜单你可以在工程窗口单击鼠标右键选择编译选项IDE将使用编辑器打开这个文件作为试验可设置一些错误IDE首先自动保存已经改变的文件这时在状态窗口中会显示错误信息或单击其左边的错误符号基本上所有C编译器都是这样开始一个新的工程 从Project菜单中选择New命令输出文件的名称取决于你的工程文件名称如果你创建一个名称为的工程 自从创建你自己的工程后文件加入到工程文件排列中Studio来调试你的代码你可以使用应用程序向导来生成一些使用有关硬件的初始化代码C程序的剖析 一个C程序必须定义一个main调用函数可执行因此你也可以在你的目标系统中执行它一个C程序需要设定目标环境 通常们看 iccexamples目录中的文件led.c然后是无限循环地运行让我并且将这个¿ÉÒÔºÜÈÝÒ׵ع¹ÖþÕâ¸ö¹¤³ÌÄã¿ÉÒÔʹÓÃATMEL的AVRBuildÑÓʱ³ÌÐòÐèÒªÓÐ×ã¹»µÄÑÓʱʱ¼ä*/void Delay(){unsigned char a, b;广州市天河双龙电子有限公司 选择双龙电子 选择未来科技4

ImageCraft ICCAVR的中文使用说明 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;PORTB = 0xFF;/*定义 B口输出*//* B口全部为高电平在初始化一些IO寄存器后之后并且在这个循环中改变LED的步进图案在LED_On例程中直接写正确的数值到IO端口变化LED_On例程调用了延时例程环只能给出延时的近似延时时间使用硬件定时器来完成延时8515intr.c程序很简单这两个例子可以作为你的程序的起点为能够看见图案这一对嵌套循那么这个例程应该ICCAVR的IDE环境1ÄãÊ×ÏÈÓ¦¸Ã½¨Á¢Ò»¸ö¹¤³ÌÎļþ²¢ÇÒ¶¨ÒåÊôÓÚÕâ¸ö广州市天河双龙电子有限公司 选择双龙电子 选择未来科技5

ImageCraft ICCAVR的中文使用说明工程的所有文件我们有时也需要将一个文件单独地编译为目标文件或最终的输出文件从IDE菜单中选择命令to Objectto Outputµ±Äãµ÷ÓÃÕâ¸öÃüÁîʱ²¢ÇÒÔÚ±à¼-´°¿ÚÖпÉÒÔ±à¼-µÄto Object对检查语法错误和编译一个新的启动文件是很有用的to Output对较小的并且是一个文件的程序较为有用这里使用默认的编译选项创建一个新的工程 为创建一个新的工程ProjectNewIDE会弹出一个对话框这也是你的输出文件的名称你可在菜单中选择命令你可以在菜单中选择命令来建立一个新的源文件来输入你的代码FileSave Save AsÈ»ºóÄã¿ÉÒÔÏóÉÏÃæËùÊöµ÷ÓÃ命令将文件加入到工程中Add to Projectͨ³£ÄãÊä³öÔ´ÎļþÔÚ¹¤³Ìͬһ¸öĿ¼ÖÐ 工程的编译选项使用菜单中中的命令工程管理  工程管理允许你将多个文件组织进同一个工程这个特性允许你将工程分解成许多小的模块只有一个文件被修改和重新编译当你编译包含这个头文件的源文件时 一个源文件可以写成C或汇编格式的任意一种±àÎļþ±ØÐëʹÓÃ扩展名工程文档文件放在工程管理窗口中.c»ã例如你可以将一个 对目标器件不同的工程当你新建一个工程时你可以将现有编译选项设置成默认选项默认编译选项保存在文件中你可以指定输出文件和中间文件到一个指定的目录4ÔÚÕâ¸ö´°¿ÚÖÐÄã¿ÉÒÔÐÞ¸ÄÏàÓ¦µÄÎļþ×¢Òâ5ÖеÄ按钮或菜单中的Äã¿ÉÒÔµ¥»÷¹¤¾ßÌõ命令来调用它ÓÃÊó±êµ¥»÷ÓйشíÎóÐÅϢʱµÄ´íÎó 应用构筑向导显示目标MCU的每一个外围设备子系统在这里你可以设置MCU的所具有的中断定时器²¢²úÉúÏàÓ¦µÄ´úÂë状态窗口 状态窗口显示IDE的状态信息UART»¹¿É²úÉúmain( )函数广州市天河双龙电子有限公司 选择双龙电子 选择未来科技6

ImageCraft ICCAVR的中文使用说明7×¢ÒâËü²»°üº¬ÈÎÒâÒ»¸öISP»òÐí¿ÉÒÔÏÔʾÄãµÄÄ¿±ê×°Öõĵ÷ÊÔÐÅÏ¢码文件IDE加入了对ISP的支持¹¦ÄÜ 单解释菜 1ÄÇÃI´CCAVR会根据实际情况弹出相应的工具菜单File Menu 文件菜单 New Äã¿ÉÔÚ±à¼-´°¿ÚÊÇÊäÈëÎÄ×Ö»ò´úÂë重新打开历史文件 OpenÎļþÓÃä¯ÀÀ´°¿ÚÑ¡Ôñ放弃全部的修改 Reload….from Back UP SaveÈç¹û»·¾³ÉèÖÃÖÐÉèÖÃÁ˱£´æ±¸·ÝÎļþ Save as CloseÈç¹ûÎļþÓйýÐÞ¸Ä Compile File …to Object

ÓÃÓÚ¶ÔоƬ±à³Ì»òÓÃÓÚµ÷ÊÔÓï·¨¼ì²éCompile File ... to Output³ÌÆ÷ºÍµ÷ÊÔÆ÷保存所有打开的文件关闭当前打开的所有文件PrintExit 3撤消最后一次的修改撤消最后一次的Undo剪切选择的内容到剪帖板拷贝选择的内容到剪帖板将剪帖板内容粘帖在当前光标的位置删除选择的内容选择全部内容对选择的整块内容右移 Block Outdent

Search menu 寻找菜单Find…在编辑窗口中寻找一个文本 Match Case – 区分大小写 Whole Word – 全字匹配广州市天河双龙电子有限公司 选择双龙电子 选择未来科技7×¢ÒâÄ¿±êÎļþ²»¿ÉÒÔÖ±½ÓÆä²úÉúµÄÊä³öÎļþ¿ÉÓÃÓÚ±à

ImageCraft ICCAVR的中文使用说明 Up/Down –往上或往下 Find –在当前打开的文件中或在当前工程的所有文件中或当前目录中的文件中寻找一段文本 Case Sensitive –大小写敏感 Whole Word - 全字匹配 Regular Expression – 寻找规则的表达式 – 在编辑器中替换文本Goto Line Number – 转到指定行号Delete Bookmark – 删除书签Goto Bookmark – 跳转到指定的书签View Menu视图菜单 Status Window – 如果选中 Project Makefile – 以只读方式打开makefile 文件 Output Listing File – 以只读方式打开列表文件 6 Open –打开一个已经存在的工程文件 Close All Files – 关闭全部打开的文件 Make Project –解释和编译已经修改的文件为输出文件注意在版本升级后对原有工程最好全部重新构筑这个文件可以是非源文件 – 打开工程编译选项对话框 7¿ÉÒÔ¼ÆUARTËã的波特率生成硬件的初始化代码Compiler Options 编译选项 编译选项总共有三个页面 在Paths页面中有Compiler和TargetOutput Directory –输出文件的目录广州市天河双龙电子有限公司 选择双龙电子 选择未来科技8

ImageCraft ICCAVR的中文使用说明 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, %lX Floating point: %f 支持AVR Studio Simulator IO – 如果选中Additional Libraries –使用标准库以外的附加库Strings in FLASH – 字符串只保存在FLASH存贮器中编译器使用的软件堆栈的大小不需地指定系统默认的启动文件在Paths页中指定Unused ROM Fill Pattern – 用一串十六进制数填充空余的ROM空间C库函数与启动文件 1²¢½«±ê×¼¿âlibcavr.a与你的程序广州市天河双龙电子有限公司 选择双龙电子 选择未来科技9

ImageCraft ICCAVR的中文使用说明相连接启动文件定义了一个全局符号__startÆô¶¯ÎļþµÄ¹¦ÄÜÓÐ初始化硬件和软件堆栈指针从idata区拷贝初始化数据到直接寻址数据区data区将bss区全部初始化为零调用用户主例程main函数定义一个退出点它将进入这个退出点进行无限循环你不需要修改启动文件来使用别的中断 为修改和使用新的启动文件创建一个新的crtavr.o copy crtavr.o ..lib; 拷贝到库目录如果您使用的目标MCU是Mega注意Mega的每个中断入口地址使用两个字wordÄã¿ÉÒÔÔÚ¹¤³ÌÑ¡Ïî¶Ô»°¿òÖкܷ½±ãµØÖ±½ÓÖ¸¶¨Ò»¸öÆô¶¯Îļþ¼ÓÈëÄúµÄ¹¤³ÌÖÐÄú±ØÐëÖ¸¶¨Æô¶¯ÎļþµÄ¾ø¶Ô·¾¶»òÆô¶¯Îļþ±ØÐëλÓÚ¹¤³ÌÑ¡Ïî¿â·¾¶ËùÖ¸¶¨µÄĿ¼ÖÐ常用库介绍 1库源代码这个库源代码是一个密码保护的ZIP压缩文件当本软件被开锁后例如EEPROM和SPI的函数另外我们的互连网上有一个页专门存放用户写的源代码应该用这些文件来代替老的avr.h文件 5其它头文件广州市天河双龙电子有限公司 选择双龙电子 选择未来科技10

ImageCraft ICCAVR的中文使用说明 下列标准的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 广州市天河双龙电子有限公司 选择双龙电子 选择未来科技11

ImageCraft ICCAVR的中文使用说明float asin(float x) 以弧度形式返回x的反正弦值float acos(float x) 以弧度形式返回x的反余弦值float atan(float x) 以弧度形式返回x的反正切值float atan2(float x, float y) 返回y/x的反正切 ̄+小数部分四舍五入即exfloat exp10(float x) 返回以10为底的幂的范围为0.51尾数¶øn值存放到pexp指向的变量中即x=yy2 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的正弦值广州市天河双龙电子有限公司 选择双龙电子 选择未来科技12小数部分应

ImageCraft ICCAVR的中文使用说明float sinh(float x) 返回x的双曲正弦函数值float tan(float x) 返回以弧度形式表示的x的正切值float tanh(float x)返回x的双曲正切函数值5可以使用MCU±ê×¼stdio.h的许多内容不同样使用之前应用"#include "预处理最低层的IO程序是单字符的输入(getchar)和输出(putchar)程序例如用 printf输出LCD使用标准IO函数 为在ATMEL的AVR Studio模拟器注意行单字符输出函数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形式输出广州市天河双龙电子有限公司 选择双龙电子 选择未来科技13

ImageCraft ICCAVR的中文使用说明6并且描述了下列函数±ØÐëµ÷ÓÃ_NewHeap来初始化堆heap比如.. calloc×Ö·û´®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"中起始字符为长整型数定"s"中转换结束的位置其余同"strtol"7±àÒëÆ÷Ö§³ÖÏÂÁк¯Êý型size_t和下列字符串及字符阵列函数* endptr将设类广州市天河双龙电子有限公司 选择双龙电子 选择未来科技14

ImageCraft ICCAVR的中文使用说明 在字符串s中搜索n个字节长度寻找与c相同的字符否则返回NULLÈç¹ûÏàͬÔò·µ»Ø0Ôò·µ»Ø-1但拷贝区不可以重迭返回s1它返回s·µ»Øs1包括结束NULL字符如果没有匹配字符找到int strcmp(char *s1, char *s2) 比较两个字符串char *strcpy(char *s1, char *s2) 拷贝字符串s2至字符串s1size_t strcspn(char *s1, char *s2) 在字符串s1搜索与字符串s2匹配的第一个字符找到的匹配字符的索引不包括结束NULL字符不含结束NULL字符返回s1µ«ÆäÖ»±È½ÏÇ°n个字符但其只拷贝前n个字符但它返回的是在s1匹配字符的地址指针char *strrchr(char *s, int c) 在字符串s中搜索最后出现的c如果s2长度比n小其返回s1中如果s1>s2则返回1µ«¿½±´Çø¿ÉÒÔÖصüÔò·µ»Ø1·ñÔò·µ»ØNULL°üÀ¨½áÊøNULL字符char *strstr(char *s1, char *s2) 在字符串s1中找到与s2匹配的子字符串否则返回NULL广州市天河双龙电子有限公司 选择双龙电子 选择未来科技15

ImageCraft ICCAVR的中文使用说明 这些函数除了它的操作对象是在FLASH中常数字符串外 size_t cstrlen(const char *s)char *cstrcpy(char *dst, const char *src);int cstrcmp(const char *s1, char *s2);8Ëü¶¨ÒåÁ˲»È·¶¨µÄÀàÐÍva_list和三个宏分派指定的类型小的整型类型如"char"不能被支持如intprintf()可以使用vfprintf()来实现#include int printf(char *fmt, ...){va_list ap;va_start(ap, fmt);vfprintf(fmt, ap);va_end(ap);}9ÄÚ´æͼÈçÏÂÄÇôÈí¼þ¶ÑÕ»µÄÄÚÈݽ«»á±»¸Ä±äÕ»ÊÇÓÃ×÷º¯ÊýµÄ·µ»ØµØÖ· 同样地使用动态分配内存 高端地址 硬件堆栈区 警戒线 软件堆栈区Ó²¼þ¶Ñ如果你 警戒线 数据区 低端地址

警戒线广州市天河双龙电子有限公司 选择双龙电子 选择未来科技16

ImageCraft ICCAVR的中文使用说明 启动代码写了一个正确的关于数据区的地址字节和一个类似的正确的关于软件堆栈的地址字节作为警戒线如果你使用了你自己的启动文件你将需要额外改造为新的启动文件如果你使用动态分配内存参考内存分配函数如果警戒线字节仍然保持正确的值那么函数检查通过那么警戒线字节将可能被破坏你的程序将可能运行不正常或偶然崩溃它调用了带一个参数的函数_StackOverflowed(char c)那么硬件堆栈有过溢出那么软件堆栈曾经溢出它是两个堆栈都可能溢出的在_StackOverflowed执行起作用时作为例子那么将不能返回_StackCheck函数库会用一个缺省的_StackOverflowed函数来跳转到0的位置 你可能希望用一个函数来代替它以指示更多的错误条件注意自堆栈溢出指示故障程序以来这两个函数的原型在头文macros.h.件中七 问AVR的低层硬件访 AVR系列使用高级语言编程时有很高的C语言密度由于AVR性能下目标MCU的硬件特点在C语言中不能很好地使用偶然情况 头文件io*.hiom603.h等这些文件是从ATMEL官方发布的文件经过修改文件macros.h定义了许多有用的宏 这个编译器的效率很高outsbi等 注意尽管io*.h定义了它们的bit的位置很多时候你将需要使用定义在macros.h文件中的BIT()宏 avr.h: #define SRE ... (你的C程序) MCUCR |= SRE; io8515.h广州市天河双龙电子有限公司 选择双龙电子 选择未来科技170x80// 外部 RAM 使能

ImageCraft ICCAVR的中文使用说明 #define SRE ... (你的C程序)7 #include MCUCR |= BIT(SRE);2bit很幸运而没有借助于汇编指令或其它非标准C结构a | b – 按位或位这惯用于打开某些例如这个运算在检查某些位是否置1时有用 If ((PORTA & 0x81) == 0)// 检查位7和位0 注意圆括号需要括在&运算符的周围序中很多错误的原因之一这个运算对一个位取反有用在下面的例子中 PORTA ^= 0x80;// 翻转位7这是C程~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"是表格式样分配进程序存贮器广州市天河双龙电子有限公司 选择双龙电子 选择未来科技18

ImageCraft ICCAVR的中文使用说明针在程序存贮器最后在大多数的例子中"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广州市天河双龙电子有限公司 选择双龙电子 选择未来科技19

ImageCraft ICCAVR的中文使用说明生成代码使用两个堆栈一个是用于以堆栈结构传递的参数 硬件堆栈起初是用于存贮函数返回的地址通常也不调用象带有%f格式的printf()等库函数在绝大多数程序中再入式函数最多40个字节的硬件堆栈应该是足够的而软件堆栈是在它下面一定数量字节处分配数据区从0x60开始分配允许数据区和软件堆栈彼此相向生长那么堆栈是放在内部SRAM的顶部参考程序和数据内存的使用两个堆栈中的任意你可以使用堆栈检查函数一个都可能溢出检测溢出情况在线汇编  除了在汇编文件中写汇编函数外在你的工程使用汇编源文件作为一个部件是良好的在线汇编的语法是可以被用来指定多个声明为了在汇编声明中访问一个C的变量如 register unsigned char uc; asm("mov %uc,R0n" "sleepn"); 任意一个C变量都可以被引用你必须使用寄存器存贮类来强制分配一个局部变量到CPU寄存器中使用在线汇编引用局部寄存器的能力是有限的就很可能没有寄存器可用你将从汇编程序得到一个错误所以你的在线汇编指令很可能失败使用LDI指令需要使用R16~R31中的一个寄存器同样也没有引用上半部分的整数寄存器编译器将在线汇编的每行都分解成可读的ImageCraft汇编器允许标签放置在任意地方当汇编声明在函数外部时你不要理睬这个警告IO寄存器  IO寄存器可以被两条路线访问可以使用IN和OUT指令读写IO寄存器可以使用普通数据访问指令和地址模式 数据内存地址例如广州市天河双龙电子有限公司 选择双龙电子 选择未来科技20

ImageCraft ICCAVR的中文使用说明注意注意不要不注意地改变CPU寄存器编译器自动生成低级指令象insbrs IO地址 register unsigned char uc; asm("in %uc,$3F");// 读 SREG asm("out $3F,%uc");// 打开全局中断位 注意尽管io*.h定义了它们的bit的位置很多时候你将需要使用定义在macros.h文件中的BIT()宏 avr.h: #define SRE0x80// 外部 RAM 使能 ... (填充你的C程序) MCUCR |= SRE; io8515.h #define SRE7 ... (填充你的C程序) #include 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];广州市天河双龙电子有限公司 选择双龙电子 选择未来科技21

ImageCraft ICCAVR的中文使用说明注意并且使用两个冒号定义为全局变量 在线汇编遵守同样的汇编语法规则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"描述变量编译器不会真正知道在asm中的声明C任务     作为汇编界面的描述和调用规则在一些情况下例如管理着寄存器的保存和恢复并作为任务切换处理的一部分 为了禁止这种行为例如在C文件中否则C实时操作系统RTOS注意作为默认的情况它也没有必要为返回保存和恢复任意一个寄存器 中断操作 C中断操作 中断操作中C中可以使用在函数定义之前通知编译器这个函数是一个中断操作你必须用一个附注注意向量号是从1开始的有两个作用: 对中断操作函数过的全部寄存器 例如这个附注而且保存和恢复在函数中用广州市天河双龙电子有限公司 选择双龙电子 选择未来科技22

ImageCraft ICCAVR的中文使用说明 ... void timer_handler() { ... } 编译器生成的指令为 rjmp _timer_handler 或者 jmp _timer_handler; 对普通AVR MCU;对Mega MCU字节地址 上述指令定位在0x06Õë¶ÔÆÕͨװÖÃMega使用2个字作为中断向量 如果你希望对多个中断入口使用同一个中断操作分别带有多个不同的向量号 #pragma interrupt_handler timer_ovf:7 timer_ovf:8 汇编中断操作 你可以用汇编语言写中断操作无论如何要小心参考汇编界面C函数不做这些工作那么你必须自己定义向量用".org"来声明rjmp 或jmp指令的正确地址 ; 对全部除ATMega 以外的MCU .area vectors(abs) .org 0x6 rjmp _timer ; 对 ATMega MCU .area vectors(abs) .org 0xCjmp _timer11ÔÚ目录12广州市天河双龙电子有限公司 选择双龙电子 选择未来科技23;中断向量; 中断向量

ImageCraft ICCAVR的中文使用说明 EEPROM在运行时可以使用库函数访问EEPROM_READ(int location, object)    这个宏调用了EEPROMReadBytes 函数从EEPROM指定位置读取数据送给数据对象例如"object"可以是任意程序变量包括结构和数组int i;EEPROM_WRITE(0x1, i);//写两个字节至0x1这些宏和函数可以用于任意AVR装置即使不需要高地址字节它们也是欠佳的初始化EEPROM EEPROM可以在你的程序源文件中初始化这是可以用附注实现的例如如果它关系重大为返回默认的"data."区域需要重设数据区名称初始化EEPROM数据至0地址是不可以使用的比如访问在另一个文件中的foo你不需要加入这个附注 extern int foo; int i;广州市天河双龙电子有限公司 选择双龙电子 选择未来科技24

ImageCraft ICCAVR的中文使用说明 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;广州市天河双龙电子有限公司 选择双龙电子 选择未来科技25

ImageCraft ICCAVR的中文使用说明 };这个结构体的长度只有一个1 byte2名称 C 语言中的名称在汇编文件中是以下划线为前坠的名称的有效长度为32个字符一个全局变量 _foo:: .word 1 (在C 文件中) extern int foo; b):可以定义成如charµÚ¶þ¸ö²ÎÊýÔòͨ¹ýR18/R19传递其余参数通过软件堆栈传递int¼´Ê¹º¯ÊýÔ-ÐÍÊÇ¿ÉÓõĶøµÚ¶þ¸ö²ÎÊýÊdz¤ÕûÐÍ»ò¸¡µãÊý¶ø¸ß°ë²¿·Öͨ¹ýÈí¼þ¶ÑÕ»´«µÝ¶ø³¤ÕûÐÍ»ò¸¡µãÊý·µ»ØÔòͨ¹ýR16/R17/R18/R19返回保护的寄存器 在汇编函数中必须保护和恢复下列寄存器这是结构指针这些寄存器是调用保护寄存器 d)¶ø²»±»±£»¤ºÍ»Ö¸´ÕâЩ¼Ä´æÆ÷µÄÄÚÈÝÔÚ±»º¯Êýµ÷Óúó¿ÉÒԸıäÔÚÖжϲÙ×÷ÖбØÐë±£»¤ºÍ»Ö¸´ËüËùʹÓõÄÈ«²¿¼Ä´æÆ÷ÄÇô±àÒëÆ÷ÓÐÄÜÁ¦×Ô¶¯Íê³ÉµÄ¶øËüÓÖµ÷ÓÃÁËÆÕͨµÄC函数普通C函数调用不保护它们中断处理或它的函数调用不能改变任意一个MCU寄存器 函数返回非整型值 在调用函数前浮点数或结构值在调用任意浮点函数之前否则这和那些返回整型值的函数是有不同之处的 传递结构值 如果传递结构值而不是通过寄存器广州市天河双龙电子有限公司 选择双龙电子 选择未来科技26

ImageCraft ICCAVR的中文使用说明传递结构的地址) 和传递任意数据项目的地址是相同的, 都是通过一个2字节的指针这个调用函数分配一个临时贮藏库当这个函数返回时程序和数据区的使用 程序存贮器 程序存贮器是被用于保存你的程序代码全局变量HEX文件这个文件可以被编程器用来对芯片编程编译器不能使用任意64K字节以上的程序存贮器如在Mega103装置中你需要在设定RAMPZ寄存器后直接调用ELPM指令仅指内部SRAM¶ÑÕ»½á¹¹ºÍ¶¯Ì¬ÄÚ´æ·ÖÅäµÄ¶ÑËüÃDz»²úÉúÊä³öÎļþµ«ÔÚ³ÌÐòÔËÐÐʱʹÓà 硬件堆栈 软件堆栈 堆 全局变量和字符串 CPU和IO寄存器 内存图的底部是地址0´Ó0x60往上放置全局变量和字符串0x60±àÒëÆ÷在高端地址在它的下面是向下生长的软件堆栈要确保硬件堆栈不生长进软件堆栈否则将导致意外的结果外部SRAMÄÇô¶ÑÕ»ÊÇ·ÅÖÃÔÚÄÚ²¿的顶部并且是朝低端内存地址向下生长这样分配的原因是在多数场合访问内部SRAM比访问外部SRAM的速度要快SRAM广州市天河双龙电子有限公司 选择双龙电子 选择未来科技27

ImageCraft ICCAVR的中文使用说明5区域按照内存地址增高的顺序被编译器使用这个区的每个字包括了函数入口的地址所有间接的函数索引必须通过间接的额外对准这是自动完成的举例如下使用库函数xicall调用这个函数text – 这个区域包括程序代码静态变量和字符串并且是在启动时被拷贝进数据区的按ANSI C定义这些变量在启动时将初始化为0EEPROM数据是写进扩展名为.eep的输出文件九程序级的调试的编译选项中必须将使用户可在ATMEL的AVRStudio中进行源那么在ICCAVR一项打钩ICCAVR汇编参考 1 ( ‘_’ | [a-z] ) [ [a-z] | [0-9] | ‘_’ ] * 在ICC中汇编名称必须由下划线或字母开始名称和符号是同名词数字或下划线组成广州市天河双龙电子有限公司 选择双龙电子 选择未来科技28

ImageCraft ICCAVR的中文使用说明地址的标号名称中的任意一个也可显式地被其它模块使用示局部符号如果在一个文件一个符号没有被定义而直接使用了而且它的值由链接器决定那么这个数是一个十六进制数 例如:100x10$100xBAD 0xBEEF 0xC0DE -20 3汇编文件格式 汇编文件必须是一个ASCII文件而且区分大小写符号表而且要遵守一定的规则 [label: [:]] [command] [operands] [;comments] label表示标号两个符号表示全局符号command 表示操作码operands 表示操作数 [ ] 表示为可选项 comments表示注释而在汇编文件中用分号

ϵͳ»ã±àʱ¶Ô×¢ÊͲ¿·Ö²»½øÐд¦Àí±êºÅµÄÖµÊdzÌÐòÖÐijһµãµÄPC计数它在其它模块中也是显式的伪指令或宏在这个文档例外的是而且只支持长调用或跳转指令xjmp应用于Mega芯片一个例如直接地址是一个最简单的表达式器的值中不描述AVR指令它可解释为rjmp 或jmp中的任意广州市天河双龙电子有限公司 选择双龙电子 选择未来科技29

ImageCraft ICCAVR的中文使用说明 asymbol是一个简单表达式有例子为通常一个表达式描述当前程序计数器PC值 name | #name 圆括号用于分组表达式的基本规则是 lds R10,foo+bar 如果foo和bar两个全都是外部符号 5运算符 下面列出了各种运算符和它们的优先级用于重定位符号计算运算符 功能 类型 优先级* 乘法 二进制 10/ 除法 二进制 10% 取模 二进制 10<< 左移 二进制 5>> 右移 二进制 5^ 按位异或XOR二进制 4& 按位与AND二进制 4| 按位或 二进制 4- 负号 一元运算符 11~ 取补运算 一元运算符 11< 取低字节 一元运算符 11> 取高字节 一元运算符 11 6圆点或程序计数器 如果圆点出现在表达式中2Á´½ÓÆ÷½«ËùÓÐʹÓÃͬһÃû³ÆµÄÇøÓò¼¯ºÏÖÁÒ»Æð 属性有两类绝对定位区域 rel

连接定位 ovr

¶øÖض¨Î»ÇøÓòµÄÆðʼµØÁ´½ÓÆ÷Á¬½ÓÕâ¸öÇøÓòµ½ÁíÒ»表达式不能随意使用例如只有加号可以Ö·ÊÇÓÉËÍÃüÁîÑ¡Ïî¸øÁ´½ÓÆ÷À´Ö¸¶¨µÄ广州市天河双龙电子有限公司 选择双龙电子 选择未来科技30

ImageCraft ICCAVR的中文使用说明个同名区域后面区域file1.o:.area text

10 text

对每一个文件链接器都是从同一地址开始安排20 text

ʵ¼ÊÉÏÈÃÎÒÃǼÙÉètext区域的起始地址设置为0将从0开始而text_3从30地址开始那么text_1和text_2将分别地从0 和10开始所以它将同样从0地址开始不同的模块中.area foo(abs).area foo(abs,con).area foo(abs,ovr).area foo(rel).area foo(rel,con).area foo(rel,ovr).asciistrings? ÎÞÂÛÄÄÒ»¸ö¶¼Òª¸½ÉÏÒ»¶Ô·Ö½ç·ûתÒå×Ö·û¶¼ÊÇ´Ó·´Ð±Ïß 开ÄÇôtext_1即使它们用在ÈÎÒâ¿É´òÓ¡×Ö·û¶¼ÊÇÓÐЧµÄ始的它使0正确地嵌入字符串的内部广州市天河双龙电子有限公司 选择双龙电子 选择未来科技31

ImageCraft ICCAVR的中文使用说明

asciz “230456” [,]* .word [,]* .long [,]* 这些伪指令是定义常数(4byte)字常数(2byte)和双字长数Õâ¸ö¸ñʽÓÃÓÚAVR微控制器(MCU)¶øÁíÍâÁ½¸ö¿ÉÒÔÓÃÓÚÖض¨Î»±í´ïʽָÁîºóÃæµÄÊý·Ö±ðÊÇÖ¸±£ÁôµÄ×Ö½Ú 定义一个文本替代符是用"value."定义的 .define quot R15 movquot, 如寄存器符号或标号它 .else .endif 上述三个伪指令定义了一个条件汇编语句Èç¹ûÌõ¼þ为假的指令条件语句最多可以嵌套10层.if condlds R10,s R10,如果cond不等于

定义一个宏调用时相应的宏参数非0则执行.else 和.endif之间如果cond等于0除了另外一个宏声明外在宏内部表达式@digit(digit由0~9的数字代替)是宏被例如广州市天河双龙电子有限公司 选择双龙电子 选择未来科技32

ImageCraft ICCAVR的中文使用说明 .endmacro调用宏foo需要两参数后面跟上相应的参数同时用相应的宏参数来扩展@digit 例如:foobar,x 调用宏foo = 定义一个符号等于常数值如果当前目录该文件不存在 如:.include “registers.h” 设定程序计数器PC的值为"value."Òâ"value"是字节地址×¢使其在当前或其它模块中都是显式的否则广州市天河双龙电子有限公司 选择双龙电子 选择未来科技33


本文标签: 使用 文件 函数 程序