Arduino中Hex文件的生成及保存
- 格式:doc
- 大小:15.50 KB
- 文档页数:2
1. 关于hex文件的产生方法:在STVD下如何产生HEX文件,在STVD的Project -> Setting -> Post-Build Commands 栏内添加: chex -fi -o $(OutputPath)$(T argetSName).hex $(OutputPath)$(TargetSName).sm82. 将memory models选择mods或modsl应用注意:使用的是STVD自动生成的stm8_interrupt_vector.c文件时,在使用modsl模式编译时,必须将extern void _stext(); /* startup routine */ 这句改为extern @near void _stext(); /* startup routine */ 需要增加@near 关键字。
程序大于32k后,要把const数据,main还有中断函数等定位到32k(地址64k)以内,不然程序会跑飞,而且编译链接的时候也不会报错。
3. 仿真调试利用STM8小板上的3个LED灯,了解仿真环境。
利用建好的环境,修改main.c文件,修改后的如下#i nclude "STM8S207R.h"void main(void){_asm("sim");PD_DDR |= 0x0D;PD_CR1 |= 0x0D;PD_CR2 = 0x00;_asm("nop");PD_ODR |=0x01;_asm("nop");PD_ODR |=0x04;_asm("nop");PD_ODR |=0x08;_asm("nop");PD_ODR &=~0x0D;_asm("nop");_asm("rim");while(1);}把 STM8S207R.h 文件放在建好的工程目录下,与main.c文件在用一个目录下。
五、应用软件调试程
1、建立一个新工程单击Project菜单,在弹出的下拉菜单中选中New Project 选项
2、然后选择你要保存的路径,输入工程文件的名字,比如保存到C51目录里,工程文件的名字为C51,然后点击保存.
3、这时会弹出一个对话框,要求你选择单片机的型号.我这里用Atmel 的89c52,选择89c52之后,右边一栏是对这个单片机的基本的说明,然后点击确定.
4、单击“File”菜单,再在下拉菜单中单击“New”选项然后把上面的程序复制到这个新建文件里,以1fengzhong.ASM为扩展名保存。
5、然后单击“Add File to Group ‘Source Group 1’”
6、选中1fengzhong.asm,然后单击“Add”在“Source Group 1”文件夹中多了一个子项“1fengzhong.asm”
7、单击“Project”菜单,再在下拉菜单中单击“option for target“target1”选项,在弹出的对话框中单击“OUT PUT”选项,在create executable和create hex 这两个选项中打勾。
8、译成功退出KEILC。
9、运行STC,单击Open File选项,找到用Keil C 生成的“1fengzhong.hex”文件,串口选用COM1,其他设置默认。
10、连接好小信号系统板与电脑之间的连线,接好小信号系统板的电源(5V)此时不通电。
11、单击STC的“Download”键,然后接通小信号系统板电源。
Intel HEX文件是记录文本行的ASCII文本文件,在Intel HEX文件中,每一行是一个HEX记录,由十六进制数组成的机器码或者数据常量。
Intel HEX文件经常被用于将程序或数据传输存储到ROM、EPROM,大多数编程器和模拟器使用Int el HEX文件。
很多编译器的支持生成HEX格式的烧录文件,尤其是Keil c。
但是编程器能够下载的往往是BIN格式,因此HEX转BIN是每个编程器都必须支持的功能。
HEX格式文件以行为单位,每行由“:”(0x3a)开始,以回车键结束(0x0d, 0x0a)。
行内的数据都是由两个字符表示一个16进制字节,比如”01”就表示数0 x01;”0a”,就表示0x0a。
对于16位的地址,则高位在前低位在后,比如地址0x010a,在HEX格式文件中就表示为字符串”010a”。
下面为HEX文件中的一行::10000000FF0462FF051EFF0A93FF0572FF0A93FFBC“:”表示一行的开始。
“:”后的第1,2个字符“10”表示本行包含的数据的长度,这里就是0x10即16个。
第3,4,5,6个字符“0000”表示数据存储的起始地址,这里表示从0x0000地址开始存储16个数据,其中高位地址在前,低位地址在后。
第7,8个字符“00”表示数据的类型。
该类型总共有以下几种:00 ----数据记录01 ----文件结束记录02 ----扩展段地址记录04 ----扩展线性地址记录这里就是0x00即为普通数据记录。
自后的32个字符就是本行包含的数据,每两个字符表示一个字节数据,总共有16个字节数据跟行首的记录的长度相一致。
最后两个字符表示校验码。
每个HEX格式的最后一行都是固定为::00000001FF以上的信息其实就足够进行HEX转BIN格式的程序的编写。
首先我们只处理数据类型为0x00及0x01的情况。
0x02表示对应的存储地址超过了64K,由于我的编程器只针对64K以下的单片机,因此在次不处理,0x04也是如此。
hex,bin,axf,elf的区别一、HEX 和 BINhex 文件常用来保存单片机 ARM或其他处理器的目标程序代码。
它保存物理程序存储区中的目标代码映象。
一般的编程器都支持这种格式。
hex 文件全部由可打印的ASCII字符组成,如下例所示::2000000012014c75a800e4f508f509780a7a78e4f608dafcd283fcfded240af9a 7050dbd81:2000200000010ced2488ec34ff50edc283e4fcfded240af9e76d7013ed33e43c7 00d0dbd2a:2000400000010ced2488ec34ff50e50509e50970020508e50924a8e50834fd50a ee4f50874hex 由一条或多条记录组成,每条记录都由一个冒号“:”打头,其格式如下::CCAAAARR...ZZ其中:CC本条记录中的数据字节数AAAA本条记录中的数据在存储区中的起始地址RR记录类型:00 数据记录 (data record)01 结束记录 (end record)02 段记录 (paragraph record)03 转移地址记录 (transfer address record)...数据域ZZ数据域校验和hex文件记录中的数字都是16进制格式,两个16进制数字代表一个字节。
C C域是数据域中的实际字节数,地址、记录类型和校验和域没有计算在内。
校验和是取记录中从数据字节计数域(CC)到数据域(...)最后一个字节的所有字节总和的2的补码。
Bin文件是最纯粹的二进制机器代码,没有格式,或者说是"顺序格式"按assembly code顺序翻译成binary machine code.Bin是直接的内存映象的表示。
简单介绍一下这2种文件格式的区别:1 - HEX文件是包括地址信息的,而BIN文件格式只包括了数据本身在烧写或下载HEX文件的时候,一般都不需要用户指定地址,因为HEX文件内部的信息已经包括了地址。
IAR A VR怎么生成HEX文件啊IAR同时输出多个文件的说明,在IAR225E(30天限时版)中通过。
操作步骤:1、在Project->Options->XLINK->Include中观察该Project使用了哪个XCL文件。
2、在该XLC文件中加入以下两行:-Ointel-extended,(CODE)=.hex-Ointel-extended,(XDA TA)=.eep3、在Project->Options->XLINK->Output->Format->Other中选择UBROF6格式输出。
以下为MAP文件的部分内容,生成了与Project名称相同的三个文件:test.dbg:兼容于A VR STUDIO的调试文件(也可以任意指定文件名)test.hex:INTEL HEX格式的程序代码文件test.eep:INTEL HEX格式的EEPROM初始化数据文件。
############################################################################## ### ## IAR Universal Linker V4.53F/WIN ## ## Link time = 20/Jan/2001 14:49:35 ## Target CPU = A90 ## List file = "D:\IAR Systems\user_A vr\Debug\List\test.map" ## Output file 1 = "D:\IAR Systems\user_A vr\Debug\Exe\test.dbg" ## Format: ubrof6 ## UBROF version 6.0.0 ## Output file 2 = "D:\IAR Systems\user_A vr\Debug\Exe\test.hex" ## Format: intel-extended, variant: -y(CODE) ## Output file 3 = "D:\IAR Systems\user_A vr\Debug\Exe\test.eep" ## Format: intel-extended, variant: -y(XDA TA) #注意:1、可以修改IAR Embedded Workbench安装位置中所有cfg?s.xcl cfg?l.xcl cfg?t.xcl文件,这样就不需每次修改了,对Project->Options->XLINK->Output->Format中其余两个选项没有影响。
前两天做s3c2440的nandfalsh实验时,有些问题(函数的指定地址存放)没有弄懂,今天花了一天的时间,算是把这个问题给解决掉了,为了更加深入的了解以及以后的复习之用,决定把他总结以下。
首先,先认识一个问题,就是为什么能够指定地址存放?这个就涉及到生成hex镜像文件(不是bin文件),hex文件中包含了下载的地址(后面会详细解释),当下载软件如j-link,j-tag或是usb下载会根据hex文件中的地址信息将代码下到指定的地址单元中去。
这里需要注意的是由于nandflash是不参与cpu编址的,它的地址是相对自己而言,所以如果要在nandflash中下载到指定地址,需要通过u-boot来实现。
并且u-boot 必须支持这个功能,而其他的存储器是没这个问题,因为它们参与cpu的统一编址。
好,现在问题来了,hex中的地址怎么来的呢?这个就是ads link器功劳了,我们指导ads连接器在配置的时候有三种模式,第一种模式很少用,一般我们是使用第二种而第三种,第二种是用的最多的,是生成简单的链接文件,不能对函数实现指定地址存放,第三种是生成复杂的链接文件,可以实现函数的指定地址存放,这是通过scatter文件实现的(后面会详细介绍)下面就看一下hex文件全称Intel HEX ntel HEX文件是由一行行符合Intel HEX 文件格式的文本所构成的ASCII文本文件。
在Intel HEX文件中,每一行包含一个HEX记录。
这些记录由对应机器语言码和/或常量数据的十六进制编码数字组成。
Intel HEX文件通常用于传输将被存于ROM或者EPROM中的程序和数据。
大多数EPROM编程器或模拟器使用Intel HEX文件。
记录格式Intel HEX由任意数量的十六进制记录组成。
每个记录包含5个域,它们按以下格式排列::llaaaatt[dd...]cc每一组字母对应一个不同的域,每一个字母对应一个十六进制编码的数字。
Arduino编译总结⾸先导⼊到单⽚机的是⼆进制⽂件,之所以要编译为HEX⽂件,是因为hex⽂件带校验,在传输制、存储过程中有错误的话,容易提前发现,⽽⼆进制⽂件就不能,假如在存储中由于某⼀位或⼏位数受损,那么下载时照样按受损的⽂件导⼊到单⽚机。
⼆进制:bin ⼋进制:oct ⼗进制:dec ⼗六进制:hexArduino构建过程总述为了⽣成可在Arduino板⼦上运⾏的程序,需要经过以下⼏个步骤:1. Arduino IDE对代码进⾏转换,确保⽣成正确的C/C++代码(两种常⽤的编程语⾔)。
2. 通过编译器(avr-gcc)将上⼀步⽣成的可读代码,编译成机器能识别的指令(或称之为⽬标⽂件)。
3. 通过链接器,将上⼀步产⽣的⽬标⽂件与标准Arduino库⽂件(提供基础函数,如digitalWrite()或Serial.print())共同链接,⽣成⼀个Intel Hex⽂件,该⽂件中的指定内容将写⼊到Arduino板上的可编程内存中。
4. 将上⼀步产⽣的HEX⽂件上传⾄Arduino板:可以使⽤USB或串⼝,通过板上已有的bootloader传输到Arduino板,也可以通过其它编程器直接烧写。
多⽂件程序⼀个Arduino程序可以包含多个⽂件(IDE中的多个标签页,⼀个标签页代表⼀个⽂件)。
单击IDE顶部滚动条的右向箭头即可管理各⽂件。
⽂件标签页的扩展名有4种类型:⽆扩展名、.c、.cpp或.h(若是其它扩展名,将被转换为下划线)。
程序编译完后,所有⽆扩展名的⽂件标签页将被合并在⼀起,⽣成“主程序⽂件”。
.c或.cpp扩展名的⽂件将被单独编译。
为了打开.h标签页,必须#include该⽂件(使⽤双引号""⽽⾮尖括号< >)。
主程序⽂件的处理在传给avr-gcc编译器之前,Arduino IDE将对主程序⽂件(IDE中所有⽆扩展名的标签页合并结果)进⾏转换操作:1. 在主程序⽂件的头部,加⼊#include "WProgram.h"(0023版本)或#include "Arduino.h"(1.0版本)。
单⽚机烧录⽤的hex⽂件,⽂件格式解析(转载)含有单⽚机的电⼦产品在量产的时候会⽤到.hex⽂件或者.bin。
hex是⼗六进制的,包含地址信息和数据信息,⽽bin⽂件是⼆进制的,只有数据⽽不包含地址。
任何⽂件都有⼀定的格式规范,hex⽂件同样具有完整的格式规范。
今天和⼤家分享⼀下,hex是如何解析的。
⼀、hex⽂件解析hex⽂件可以通过UltraEdit、Notepad++、记事本等⼯具打开,⽤Notepad++打开之后会看到如下数据内容。
使⽤Notepad++打开后会不同含义的数据其颜⾊不同。
每⾏数据都会有⼀个冒号开始,后⾯的数据由:数据长度、地址、标识符、有效数据、校验数据等构成。
以上图的第⼀⾏为例,进⾏解析:第1个字节10,表⽰该⾏具有0x10个数据,即16个字节的数据;第2、3个字节C000,表⽰该⾏的起始地址为0xC000;第4个字节00,表⽰该⾏记录的是数据;第5-20个字节,表⽰的是有效数据;第21个字节73,表⽰前⾯数据的校验数据,校验⽅法:0x100-前⾯字节累加和;其中,第4个字节具有5种类型:00-05,含义如下:字段含义00表⽰后⾯记录的是数据01表⽰⽂件结束02表⽰扩展段地址03表⽰开始段地址04表⽰扩展线性地址05表⽰开始线性地址单⽚机的hex⽂件以00居多,都⽤来表⽰数据。
hex⽂件的结束部分如下图所⽰。
最后⼀⾏的01表⽰⽂件结束了,最后的FF表⽰校验数据,由0x100-0x01=0xFF得来。
⼆、扩展地址细⼼的同学可能发现了,上⾯的地址都是两个字节,范围从0x000-0xFFFF,如果地址是0x17FFFF该怎么办呢?这就要⽤到扩展字段了,举例如下:第⼀⾏中,第⼀个字节为0x02,表⽰只有两个字节的数据,⽽扩展段的标识符为0x04表⽰后⾯的数据0x0800为扩展线性地址,基地址的计算⽅法为:(0x0800<<16)=0x08000000,在0x04标识段出现之前,下⾯的数据都是这个基地址。
第八节:把.hex机器码下载到单片机的操作流程。
烧录程序也叫下载程序。
下载程序的本质是什么?把单片机当做一个存储器,每一条程序指令都对应一个唯一的存储地址,把这些指令一条条存储到指定的存储地址中,这就是下载程序的本质。
对于STC89C52RC单片机,在下载程序时需要上位机界面软件和一根USB转串口线。
上位机界面软件负责把指定.hex格式的机器码文件打开,.hex格式的机器码文件里面记录着每条程序指令对应的地址信息,在下载过程中,上位机界面软件根据.hex 记录的指令内容和对应的地址信息,经过USB转串口线,跟单片机的内置引导程序进行串口通讯,从而把.hex记录的信息传输到单片机内部的flash 存储器中,实现了程序的下载。
在讲操作流程之前,请读者先把以下一个LED灯闪烁的代码编译成.hex格式的文件,这个.hex文件保存在D盘的”stc89c52rc”文件夹里。
1.#include "REG52.H"2.3.void delay_long(unsigned int uiDelayLong); //延时函数4.5.sbit led_dr=P3^5;6.7.void main()8.{9. while(1)10. {11. led_dr=1; //LED亮12. delay_long(100); //延时50000个空指令的时间13. led_dr=0; //LED亮14. delay_long(100); //延时50000个空指令的时间15. }16.}17.18.void delay_long(unsigned int uiDelayLong) //延时函数19.{20. unsigned int i;21. unsigned int j;22. for(i=0;i<uiDelayLong;i++)23. {24. for(j=0;j<500;j++); //内嵌循环的空指令数量25. }26.}27.复制代码下面详细讲解把.hex机器码下载到单片机的操作流程。
如何输出HEX文件?方法一最好用)在配置文件后面加入以下代码,便可输出HEX文件,A90文件与HEX文件一样,SLISP都能识别.如图Override default 目录下的那个文件中最后面加入以下代码// Output File-Ointel-extended,(XDATA)=.eep //产生eeprom文件-Ointel-extended,(CODE)=.A90 //产生烧写文件-Ointel-extended,(CODE)=.hex //产生烧写文件或者不在配置文件后面加,直接在如下图的地方加入命令方法二)Output 选择zax-i这个方法会出现一点小问题,如果有__eeprom 则会出下面的错误提示,__flash 没事。
Error[e133]: The output format intel-standard cannot handle multiple address spaces. Use format variants (-y -O) to specify which address space is wanted (.hex 和.eep不能同时放到一个文件中,如果没有.eep文件生成就不会报错,可以正常使用了)中断向量的使用IAR中定义中断函数的格式是/////////////////////////////////#pragma vector=中断向量__interrupt void 中断服务程序(void){//中断处理程序}/////////////////////////////////////中断的初始化要另外加入代码,可在主程序内加入。
如下是各个中断函数的定义。
//中断定义#include <iom16.h>#pragma vector=INT0_vect__interrupt void INT0_Server(void){}#pragma vector=INT1_vect__interrupt void INT1_Server(void){}#pragma vector=TIMER2_COMP_vect__interrupt void TIMER2_COMP_Server(void){}#pragma vector=TIMER2_OVF_vect__interrupt void TIMER2_OVF_Server(void){}#pragma vector=TIMER1_CAPT_vect__interrupt void TIMER1_CAPT_Server(void){}#pragma vector=TIMER1_COMPA_vect__interrupt void TIMER1_COMPA_Server(void){}#pragma vector=TIMER1_COMPB_vect__interrupt void TIMER1_COMPB_Server(void){}#pragma vector=TIMER1_OVF_vect__interrupt void TIMER1_OVF_Server(void){}#pragma vector=TIMER0_OVF_vect__interrupt void TIMER0_OVF_Server(void) {}#pragma vector=SPI_STC_vect__interrupt void SPI_STC_Server(void){}#pragma vector=USART_RXC_vect__interrupt void USART_RXC_Server(void) {}#pragma vector=USART_UDRE_vect__interrupt void USART_UDRE_Server(void) {}#pragma vector=USART_TXC_vect__interrupt void USART_TXC_Server(void) {}#pragma vector=ADC_vect__interrupt void ADC_Server(void){}#pragma vector=EE_RDY_vect__interrupt void EE_RDY_Server(void){}#pragma vector=ANA_COMP_vect__interrupt void ANA_COMP_Server(void) {}#pragma vector=TWI_vect__interrupt void TWI_Server(void){}#pragma vector=INT2_vect__interrupt void INT2_Server(void){}#pragma vector=TIMER0_COMP_vect__interrupt void TIMER0_COMP_Server(void) {}#pragma vector=SPM_RDY_vect__interrupt void SPM_RDY_Server(void){}如何把常数字符串定义在flash 空间?法一:unsigned char __flash temptab[] = {1,2,3,4,5};法二:__flash unsigned char temptab[] = {1,2,3,4,5};法三:#pragma type_attribute=__flashunsigned char temptab[]={1,2,3,4,5};法四:const unsigned char temptab[]={1,2,3,4,5};注:第三种方式用#pragma说明后,下面的定义的变量将都在FLASH空间了,用于定义一批FLASH变量,但实际上一般只能作为常量使用了.心得1图中CSTACK的大小调整大小可在编译后的632 bytes of DATA memory (+ 22 absolute ) 中看到。
Arduino中hex文件的保存及应用
arduino在编译、链接、下载之后,hex文件自动删除了,造成软件仿真(如用proteus仿真)及其他单片机板应用的不便。
以下是自己实践的小结,与大家分享。
一:Hex文件的提取
1:在arduino工具的File->preferences中找到preferences.txt文件。
2:用记事本打开preferences.txt,选择hex文件存放的路径,在最后行加入build.path=d:\arduino\MyHexDir,
3:关闭arduino。
4:关闭preferences.txt ,关闭时对话框显示是否保存,选择保存。
Note:1:hex文件存放的路径可以由自己来定。
2:以上操作时不连接arduino硬件。
二:仿真时单片机晶振频率的选择
在arduino软件包的hardware\arduino\bootloaders\atmega路径下有一个makefile的文件,用记事本打开,可以看到相应的arduino板对应用到的bootloader 程序和晶振频率。
在用proteus仿真时,选择相对应的单片机,配置晶振。
单片机应该与arduino 在编译时选择的board上的一致。
三:往其他单片机板上烧录
编译得到的Hex文件往其他的单片机板上烧录时也是一样要选择相对应的单片机和晶振频率。
三:Hex文件的保存
建立保存路径后,每次编译的文件都会存在此路径下,所以程序实验OK后,就应该将相应的Hex文件保存到其他地方,以免在编译其他的程序时被覆盖。