IntelHEX格式简介
如何读懂hex文件
如何读懂hex⽂件什么是Intel HEX ⽂件格式Intel HEX ⽂件是遵循Intel HEX ⽂件格式的ASCII ⽂本⽂件。
在Intel HEX ⽂件的每⼀⾏都包含了⼀个HEX 记录。
这些记录是由⼀些代表机器语⾔代码和常量的16进制数据组成的。
Intel HEX ⽂件常⽤来传输要存储在ROM 或者EPROM 中的程序和数据。
⼤部分的E PROM 编程器能使⽤Intel HEX ⽂件。
Intel HEX由任意数量的⼗六进制记录组成。
每个记录包含5个域,它们按以下格式排列:Start Code每个Intel HEX 记录都由冒号开头Byte count是数据长度域,它代表记录当中数据字节的数量Address是地址域,它代表记录当中数据的起始地址Record type是代表HEX记录类型的域,它可能是以下数据当中的⼀个:00-数据记录01-⽂件结束记录02-扩展段地址记录03-开始段地址记录04-扩展线性地址记录05-开始线性地址记录Data是数据域,⼀个记录可以有许多数据字节.记录当中数据字节的数量必须和数据长度域中指定的数字相符Checksum是校验和域,它表⽰这个记录的校验和.校验和的计算是通过将记录当中所有⼗六进制编码数字对的值相加,以256为模进⾏以下补⾜。
HEX⽂件以⾏为单位。
每⾏以字符‘:’ (0x3a)开头,以回车换⾏符0x0d, 0x0a为结束。
每⾏开始和结束之间的所有内容,都是以字符形式表现的。
例如数据如果是 0x1A ,那么转换到HEX格式的⾏⾥⾯就是0x31 0x41。
如果数据是16bit的,例如地址,则先显⽰⾼位,后显⽰底位。
例如 0x1234,转换成HEX格式⽂件后变成 0x31 0x32 0x33 0x34,显⽰出来以后就是1234。
将数据部分内容每2个字符看做⼀个HEX数据,例如::020*********FA , 我把它看做 0x02 0x00 0x00 0x04 0x00 0x00 0xFA第⼀个 0x02 为数据长度。
HEX格式介绍及分析程序
Intel HEX格式你熟悉吗?——HEX格式介绍及分析程序来源:21ic 作者:LPC900栏目:MCU技术INTEL HEX格式你熟悉吗?——HEX格式介绍及分析程序用Keil C51编程时,可以自动生成INTEL HEX格式的程序文件。
INTEL HEX文件通常由若干个记录组成,每个记录都具有如下的形式::ll AAAA ttdd...ddcc其中:开头的冒号“:”是记录起始标志。
“ll”是记录的有效数据长度。
“AAAA”是装入地址。
“tt”是记录类型。
00表示数据记录,01表示结束。
“dd...dd”是记录中的有效数据。
数据个数必须与“ll”一致。
“cc”校验和。
将它的值与记录中所有字节(冒号“:”除外)内容相加,其结果应为00,否则出错。
举例:某行记录的内容是“:05012000B5412B215543”,则数据长度ll是05H,装入地址是0120H,记录类型是数据记录,有效数据是B5H、41H、2BH、21H、55H,校验和为43H。
在文件的最后一行,总是“:00000001FF”,表示无任何有效数据,装入地址为0000H(没有用处),记录类型为01H,表示结束,校验和当然是FFH了。
以下是一个分析INTEL HEX记录的简单程序:/*INTEL HEX.h分析处理INTEL HEX格式记录的头文件*/#ifndef _INTEL_HEX_H_#define _INTEL_HEX_H_#include <ctype.h>#include <string.h>//定义INTEL HEX记录的结构struct{unsigned CHAR ll; //长度unsigned int AAAA; //地址unsigned CHAR tt; //记录类型,0-数据,1-终止CHAR dd[16]; //数据CHAR cc; //校验和}INTEL HEX;/*函数:AnalyseHEX()功能:分析一条HEX记录(把INTEL HEX记录的文本转换成INTEL HEX结构)参数:hex[]是记录的文本一行内容转换后的结果保存在INTEL HEX结构中返回:0-转换成功1-HEX记录文本中有错误*/bit AnalyseHEX(CHAR hex[]){unsigned CHAR i;unsigned CHAR j;unsigned CHAR t;unsigned CHAR n;unsigned CHAR cc;unsigned int x;//检查冒号if ( hex[0] != ':' ) return 1;//检查长度t = (toint(hex[1])<<4) + toint(hex[2]);if ( t > 16 ) return 1;n = 2 * t + 11;if ( n != strlen(hex) ) return 1;INTEL HEX.ll = t;cc = t;//提取地址t = (toint(hex[3])<<4) + toint(hex[4]);cc += t;x = (unsigned int)t;x <<= 8;t = (toint(hex[5])<<4) + toint(hex[6]);cc += t;x += (unsigned int)t;INTEL HEX.AAAA = x;//提取记录类型t = (toint(hex[7])<<4) + toint(hex[8]);if ( (t==0) || (t==1) ){cc += t;INTEL HEX.tt = t;}else{return 1;}//提取数据i = 9;if ( t == 0 ){j = 0;n = INTEL HEX.ll;do{t = (toint(hex[i++])<<4);t += toint(hex[i++]);cc += t;INTEL HEX.dd[j++] = t;} while ( --n != 0 );}//提取校验和t = (toint(hex[i++])<<4);t += toint(hex[i++]);cc += t;INTEL HEX.dd[j++] = t;//检查校验if ( cc == 0 )return 0;elsereturn 1;}#endif。
hex 格式解析
hex 格式解析HEX格式是一种常用的二进制文件格式,主要用于存储程序和数据。
它是一种文本文件,由一行行符合HEX文件格式的文本组成。
在这些文本中,每一行包含一个HEX记录。
这些记录由对应机器语言码和/或常量数据的十六进制编码字节组成。
HEX文件通常用于传输将被存储在ROM或EPROM中的程序和数据。
大多数EPROM编程器或仿真器使用HEX文件。
HEX文件格式主要有两种:Intel HEX和Motorola SREC(也称为Mot)。
Intel HEX文件由一行行符合Intel HEX文件格式的文本组成。
在Intel HEX文件中,每一行包含一个HEX记录。
这些记录由对应机器语言码和/或常量数据的十六进制编码字节组成。
Motorola SREC文件则是另一种HEX格式,它按照不同的编码方式组织数据。
要解析HEX文件,可以将其拆分成以下几个部分:1. 文件头:文件头包含文件类型、版本和起始地址等信息。
文件头通常位于文件的开头,用于指示文件的类型和结构。
2. 数据记录:数据记录是HEX文件中的基本单元,包含机器语言码和/或常量数据的十六进制编码字节。
每一行都是一个数据记录,它们按照顺序排列在文件中。
3. 数据记录之间的分隔符:HEX文件中的数据记录之间使用分隔符进行分隔。
常见的分隔符有:空格、制表符(TAB)、换行符(CR)等。
4. 文件尾:文件尾是HEX文件的最后一个部分,它表示文件的结束。
文件尾通常包含一个表示文件结束的特定字符或字节序列。
在解析HEX文件时,需要关注以下几个方面:1. 确定文件类型和格式:根据文件头信息,判断文件的类型和格式。
2. 提取数据记录:从文件中提取数据记录,解析记录中的机器语言码和常量数据。
3. 处理记录之间的分隔符:去除记录之间的分隔符,以便将数据记录合并为一个连续的数据流。
4. 检查文件尾:确认文件是否完整,以及文件尾是否正确。
5. 分析数据:根据解析出的数据记录,分析文件中的程序和数据。
HEX文件格式
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文件的解析和填充方法
4 Hex 文件解析的实现
图 1 中展示的 Hex 文件内容,PROM 从地址 0x8001000 至 0x803FFFFF,共计 4032Kbytes。 文件以 Record Type 0x04 为起始,以 Record Type 0x01 为结束,中间行穿插着 Record Type 0x04,分别记录了不同的 linear Address,如果上一个 Record 的结束地址与当前 Record 的起始地址不连续,则视 为 Block 中断。
容位于 MCU PROM 中的哪个位置; ● Record 的类型,表示第 5 个域中所含内容的意义,所
含的是一个基地址或数据; ● Record 的校验和,表示这个 Record 中所含数据的校
验和。
● RecordType 0x00,表示域 5 中的内容是数据。 ● RecordType 0x01,表示这是整个 hex 文件中最后一个 record。 ● RecordType 0x02,可同时用于 16 位和 32 位格式的 MCU,表示 16 位地址中的高 12 位,低 4 位是 0。 ● RecordType 0x03,可同时用于 16 位和 32 位格式的 MCU,是专门针对 8086 和 80186 这种架构的 MCU,DATA 中定义的 4 字节数据是 CS 和 IP 寄存器中的值。 ● RecordType 0x04,仅针对 32 位格式的 MCU,表示的 是 32 位地址的高 16 位基地址,低 16 位是 0x0000。 ● RecordType 0x05,这种 record type 仅针对 32 位格式 的 MCU,表示的是这个 hex 文件内容的起始执行地址。 根据 Record Type 对 Hex 文件中的每个 Record 进行相应 意义的解析,从而梳理出 Hex 文件的起始执行地址,每个 Block 的起始地址和长度。
hex、bin、elf、axf文件区别
hex,bin,axf,elf的区别一、HEX 和 BINHex文件,这里指的是Intel标准的十六进制文件,也就是机器代码的十六进制形式,并且是用一定文件格式的ASCII码来表示.具体格式介绍如下: Intel hex 文件格式Intel hex 文件常用来保存单片机或其他处理器的目标程序代码。
它保存物理程序存储区中的目标代码映象。
一般的编程器都支持这种格式。
Intel hex 文件全部由可打印的ASCII字符组成,如下例所示::2000000012014c75a800e4f508f509780a7a78e4f608dafcd283fcfded240af9a 7050dbd81:2000200000010ced2488ec34ff50edc283e4fcfded240af9e76d7013ed33e43c7 00d0dbd2a:2000400000010ced2488ec34ff50e50509e50970020508e50924a8e50834fd50a ee4f50874Intel hex 由一条或多条记录组成,每条记录都由一个冒号“:”打头,其格式如下::CCAAAARR...ZZ其中:CC本条记录中的数据字节数AAAA本条记录中的数据在存储区中的起始地址RR记录类型:00 数据记录 (data record)01 结束记录 (end record)02 段记录 (paragraph record)03 转移地址记录 (transfer address record)...数据域ZZ数据域校验和Intel hex文件记录中的数字都是16进制格式,两个16进制数字代表一个字节。
CC域是数据域中的实际字节数,地址、记录类型和校验和域没有计算在内。
校验和是取记录中从数据字节计数域(CC)到数据域(...)最后一个字节的所有字节总和的2的补码。
Bin文件是最纯粹的二进制机器代码,没有格式,或者说是"顺序格式"按assembly code顺序翻译成binary machine code.Bin是直接的内存映象的表示。
Intel的hex格式含义
Intel的hex格式含义Intel HEX file(文件名.hex)是具有约定格式的ASCII文本文件。
文件中每一行包含一个HEX 记录(record)。
记录由十六进制数组成,这些数字代表机器指令码或常量。
Intel HEX files 用来向ROM中传递代码和数据,即它和Bin文件类似,指导下载程序或仿真器将指令码和数据下载到ROM存储器特定的位置上。
Intel HEX file可以包含任意多行记录(record),每个record主要由5个部分(域)组成,每部分至少包含两个十六进制字符,即一个字节(8位),其具体形式为“:llaaaatt[dd...]cc ”其中:“:”表示record的开始“ll”表示record中数据位(dd)的长度(几个字节)“aaaa”表示record中的数据存储起始地址“tt”表示record类型,可以为00(数据record),01(文件结束record),02(扩展段地址record),04(扩展线性地址record)“dd”表示record数据的一位,一个record可能包含多个数据字节,数据字节的数量必须与ll中指定的相一致“cc”表示record的校验域,下面给出一个实例:10008000AF5F67F0602703E0322CFA92007780C361:1000900089001C6B7EA7CA9200FE10D2AA00477D81:0B00A00080FA92006F3600C3A00076CB:00000001FF第一行,":"符号表明记录的开始. 后面的两个字符表明记录的长度,这里是10h. 后面的四个字符给出调入的地址,这里是0080h. 后面的两个字符表明记录的类型;0 数据记录 1 记录文件结束 2 扩展段地址记录 3 开始段地址记录 4 扩展线性地址记录 5开始线性地址记录后面则是真正的数据记录, 最后两位是校验和检查,它加上前面所有的数据和为0.最后一行特殊,总是写成这个样子.扩展Intel Hex的格式(最大1M): 由于普通的Intel的Hex记录文件只能记录64K的地址范围, 所以大于64K的地址数据要靠扩展Intel Hex格式的文件来记录.对于扩展形式Hex文件,在每一个64K段的开始加上扩展的段地址规定,下面的数据地址均在这个段内,除非出现新的段地址定义.一个段地址定义的格式如下:起始符长度起始地址扩展段标示扩展段序号无用累加和: 02 0000 02 3000 EC段地址的标识符是第四组数据02,表示扩展地址段的定义,再后面的以为HEX数表示段的数目, 上面的定义为3,表示段地址是3,所以下面的数据地址是3 + XX(XX是64K段内的地址)目标文件.HEX的各部分具体含义.HEX是Intel的目标文件格式。
Intel HEX文件
+---------------------------------------------------------------+ | RECORD | RECLEN | LOAD | RECTYPE | INFO or DATA | CHKSUM | | MARK ':' | | OFFSET | '00' | | | +---------------------------------------------------------------+ | 1-byte | 1-byte | 2-byte | 1-byte | n-byte | 1-byte | +---------------------------------------------------------------+
2 -
BIN文件格式 对二进制文件而言,其实没有”格式”。 文件只是包括了纯粹的二进制数据。
3 -
HEX文件格式 HEX文件都是由记录(RECORD)组成的。 在HEX文件里面,每一行代表一个记录。
记录的基本格式为:
+---------------------------------------------------------------+ | RECORD | RECLEN | LOAD | RECTYPE | INFO or DATA | CHKSUM | | MARK ':' | | OFFSET | | | | +---------------------------------------------------------------+ | 1-byte | 1-byte | 2-byte | 1-byte | n-byte | 1-byte | +---------------------------------------------------------------+
Intel HEX 格式
HEX文件格式详解Hex文件是可以烧录到MCU中,被MCU执行的一种文件格式。
如果用记事本打开可发现,整个文件以行为单位,每行以冒号开头,内容全部为16进制码(以ASCII码形式显示)。
Hex文件可以按照如下的方式进行拆分来分析其中的内容:例如“:1000080080318B1E0828092820280B1D0C280D2854”可以被看作“0x10 0x00 0x08 0x00 0x80 0x31 0x8B 0x1E 0x08 0x28 0x09 0x28 0x20 0x28 0x0B 0x1D 0x0C 0x28 0x0D 0x28 0x54” 第一个字节0x10表示本行数据的长度;第二、三字节0x00 0x08表示本行数据的起始地址;第四字节0x00表示数据类型,数据类型有:0x00、0x01、0x02、0x03、0x04、0x05。
'00' Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录'01' End of File Record: 用来标识文件结束,放在文件的最后,标识HEX文件的结尾'02' Extended Segment Address Record: 用来标识扩展段地址的记录'03' Start Segment Address Record:开始段地址记录'04' Extended Linear Address Record: 用来标识扩展线性地址的记录'05' Start Linear Address Record:开始线性地址记录然后是数据,最后一个字节0x54为校验和。
校验和的算法为:计算0x54前所有16进制码的累加和(不计进位),检验和= 0x100 - 累加和在上面的后2种记录,都是用来提供地址信息的。
每次碰到这2个记录的时候,都可以根据记录计算出一个“基”地址。
十六进制文件格式
HEX格式内容含义HEX文件格式是我们经常遇到的一种文件格式,因为几乎所有的编程烧录文件都为HEX格式。
首先,HEX文件中是包含了地址信息的。
这和BIN文件不同,BIN文件中只包含了数据信息。
所以我们在烧写或者下载HEX文件的时候,一般不需要我们指定地址,但是在烧写BIN 文件的时候,用户是一定要指定地址信息的。
二、HEX文件都是由记录组成的。
它的每一行都是一个记录来的。
它是由任意数量的十六进制数组成。
每个记录包含五个域,它们以以下格式排列的::aabbbbcc[dd…]ee上面每一组不同的字母代表不同的一个域,每个字母代表一个十六进制的数字,每一个域至少由两个十六进制编码数字组成,每两个十六进制编码数字组成一个字节。
具体描述如下:1、每个HEX记录都由冒号开头;2、aa表示这个记录中的数据长度域,它代表记录当中数据字节[dd…]的字节数量。
3、bbbb是地址域,它代表记录当中数据的起始地址。
4、cc 是代表HEX记录类型的域,它可能是以下数据当中的一个:00 –数据记录01 –文件结束记录02 –扩展段地址记录04 –扩展线性地址记录5、dd 是数据域,它代表一个字节的数据,一个记录可以有许多数据字节。
记录当中数据字节的数量必须和数据长度域(aa)中指定的数字相符。
6、ee 是校验和域,它表示这个记录的校验和。
校验和的计算是通过将记录当中所有十六进制编码数字对的值相加,以256为模进行以下补足。
比如:前面AduC7026的LED实验中的HEX文件内容为::020*********F2 。
1:1000000018F09FE518F09FE518F09FE518F09FE5C0 。
2:1000100018F09FE50000A0E118F09FE518F09FE5BB:100020004000080074030800700308006C03080017:100030006803080000000000640308006003080073:1000400078009FE50110A0E3041480E50110A0E30F:10005000081480E5F410A0E30C1480E560009FE52F:10006000DBF021E300D0A0E1040040E2D7F021E37F:1000700000D0A0E1040040E2D1F021E300D0A0E1F3:10008000040040E2D2F021E300D0A0E1800040E291:10009000D3F021E300D0A0E1040040E210F021E31E:1000A00000D0A0E11C009FE5010010E318E09F05CF:1000B00018E09F1510FF2FE1FEFFFFEAFEE7C046A4:1000C0000000FFFF900401003D010800B800080097:1000D000BD0008000000000000000000000000005B:1000E00000000000AA2108480160012107480160C2:1000F0005522074802600748016000210648016058:10010000F4210648016070471004FFFF1404FFFF4C:100110001804FFFF0404FFFF0804FFFF0C04FFFFA7:1001200004E005490A1C0139002AFBD1011C0138F1:100130000029F6D17047C046E8030000664806C8AB:100140000B1C134305D000230B70491C9142FBD1BB:10015000F5E76248C01C0323984306C80B1C1343F1:1001600006D00378401C0B70491C9142F9D1F1E78D:1001700000B5FFF7B7FFF0235948016899430160C4:10018000584A59480168114301600F2457480168D3:10019000A1430160564C5748016821430160534810:1001A0000168994301605348016811430160524A54:1001B0004E48016891430160504A4E48016811431E:1001C00001604F4A49480168914301604D4A4948DE:1001D0000168114301604C4A4C4801689143016039:1001E0004B4A4C480168114301604B4A474801683B:1001F00091430160494A4748016811430160484AF8:100200004248016891430160464A424801681143EF:1002100001604549454801604548FFF781FF454970:10022000454801604248FFF77BFF3F494248016073:100230003F48FFF775FF41493F4801603C48FFF7E1:100240006FFF3F493C4801603948FFF769FF3D496E:100250003D4801603648FFF763FF3C493A4801607A:100260003348FFF75DFF3A49374801603048FFF7F0:1002700057FF2D49374801602D48FFF751FF2D49A1:10028000354801602A48FFF74BFF27493248016093:100290002748FFF745FF29492F4801602448FFF709:1002A0003FFF27492C4801602148FFF739FF2549C6:1002B0002A4801601E48FFF733FF244927480160A0:1002C0001B48FFF72DFF2249244801601848FFF71B:1002D00027FF9EE700BDC046D4000800DC000800F0:1002E00000F4FFFF0000000220F4FFFF0CF4FFFF0A:1002F0000000000150F4FFFF000F000000000004A8:1003000000F000000000000800000F0008F4FFFFEC:100310000000001040F4FFFF0000F000000000208B:100320000000000F000000400000020024F4FFFF66:100330002C0100000000010054F4FFFF0000040045:10034000000008000000100044F4FFFF000020003F:100350000000400028F4FFFF58F4FFFF48F4FFFFBF:10036000FEFFFFEAFEFFFFEAFEFFFFEAFEFFFFEAF5:08037000FEFFFFEAFEFFFFEAB9:00000001FF它的第二行为::1000000018F09FE518F09FE518F09FE518F09FE5C0容易知道:它的ee为:C0,计算过程如下:C0=0x01+ not(0x10+0x00+0x00+0x00+0x18+0xF0+…+0xE5)文件结束(EOF)记录Intel HEX文件必须以文件结束(EOF)记录结束.这个记录的记录类型域的值必须是01.EOF记录外观总是如下::00000001FF其中:00 是记录当中数据字节的数量。
Keil生成的Hex文件详解
Keil HEX文件是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。
在Intel HEX文件中,每一行包含一个HEX记录。
这些记录由对应机器语言码和/或常量数据的十六进制编码数字组成。
Intel HEX文件通常用于传输将被存于ROM或者EPROM中的程序和数据。
大多数EPROM编程器或模拟器使用Intel HEX文件。
记录格式Intel HEX由任意数量的十六进制记录组成。
每个记录包含5个域,它们按以下格式排列::llaaaatt[dd...]cc每一组字母对应一个不同的域,每一个字母对应一个十六进制编码的数字。
每一个域由至少两个十六进制编码数字组成,它们构成一个字节,就像以下描述的那样:: 每个Intel HEX记录都由冒号开头.ll 是数据长度域,它代表记录当中数据字节(dd)的数量.aaaa 是地址域,它代表记录当中数据的起始地址.tt 是代表HEX记录类型的域,它可能是以下数据当中的一个:00 –数据记录01 –文件结束记录02 –扩展段地址记录04 –扩展线性地址记录dd 是数据域,它代表一个字节的数据.一个记录可以有许多数据字节.记录当中数据字节的数量必须和数据长度域(ll)中指定的数字相符.cc 是校验和域,它表示这个记录的校验和.校验和的计算是通过将记录当中所有十六进制编码数字对的值相加,以256为模进行以下补足.数据记录Intel HEX文件由任意数量以回车换行符结束的数据记录组成.数据记录外观如下::10 2462 00 464C5549442050524F46494C4500464C 33其中:10 是这个记录当中数据字节的数量.2462 是数据将被下载到存储器当中的地址.00 是记录类型(数据记录)464C…464C是数据.33 是这个记录的校验和.扩展线性地址记录(HEX386)扩展线性地址记录也叫作32位地址记录或HEX386记录.这些记录包含数据地址的高16位.扩展线性地址记录总是有两个数据字节,外观如下::02000004FFFFFC其中:02 是这个记录当中数据字节的数量.0000 是地址域,对于扩展线性地址记录,这个域总是0000.04 是记录类型04(扩展线性地址记录)FFFF 是地址的高16位.FC 是这个记录的校验和,计算方法如下:01h + NOT(02h + 00h + 00h + 04h + FFh + FFh).当一个扩展线性地址记录被读取,存储于数据域的扩展线性地址被保存,它被应用于从Intel HEX文件读取来的随后的记录.线性地址保持有效,直到它被另外一个扩展地址记录所改变. 通过把记录当中的地址域与被移位的来自扩展线性地址记录的地址数据相加获得数据记录的绝对存储器地址.以下的例子演示了这个过程..来自数据记录地址域的地址2462扩展线性地址记录的数据域+ FFFF------------绝对存储器地址FFFF2462扩展段地址记录(HEX86)扩展段地址记录也叫HEX86记录,它包括4-19位数据地址段.扩展段地址记录总是有两个数据字节,外观如下::020*********EA其中:02 是记录当中数据字节的数量.0000 是地址域.对于扩展段地址记录,这个域总是0000.02 是记录类型02(扩展段地址记录)1200 是地址段.EA 是这个记录的校验和,计算方法如下:01h + NOT(02h + 00h + 00h + 02h + 12h + 00h).当一个扩展段地址记录被读取,存储于数据域的扩展段地址被保存,它被应用于从Intel HEX 文件读取来的随后的记录.段地址保持有效,直到它被另外一个扩展地址记录所改变.通过把记录当中的地址域与被移位的来自扩展段地址记录的地址数据相加获得数据记录的绝对存储器地址.以下的例子演示了这个过程..来自数据记录地址域的地址2462扩展段地址记录数据域+ 1200---------绝对存储器地址00014462文件结束(EOF)记录Intel HEX文件必须以文件结束(EOF)记录结束.这个记录的记录类型域的值必须是01.EOF记录外观总是如下::00000001FF其中:00 是记录当中数据字节的数量.0000 是数据被下载到存储器当中的地址.在文件结束记录当中地址是没有意义被忽略的.0000h是典型的地址.01 是记录类型01(文件结束记录)FF 是这个记录的校验和,计算方法如下:01h + NOT(00h + 00h + 00h + 01h).:02 0000 04 0800 F2:10 0000 00 7806002051040008690200086B020008 0D注意:地址是大开端,0800+0000 = 0x0800000078060020是MSP初始值,其实为0x20000678,是小开端。
Intel hex 文件格式
Intel hex文件格式
Intel hex文件常用来保存单片机或其他处理器的目标程序代码。
它保存物理程序存储区中的目标代码映象。
一般的编程器都支持这种格式。
Intel hex文件全部由可显示和打印的ASCII字符组成,如下例所示:
:1003FA0014300316E52264057005D206C20522E50B
:0F040A002264037005C206D20522C206C2052273
:00000001FF
Intel hex由一条或多条记录组成,每条记录都由一个冒号“:”打头,其格式如下:
:NNAAAARRDD…DDCC
:+数据字节计数域+地址域+记录类型域+数据域+校验域其中:NN为本条记录中的数据(DD…DD)字节数(十六进制,最大为FFH)
AAAA为本条记录中的数据在存储区中的起始地址(四位十六进制数,高字节在前)
RR为记录类型(一字节):
00数据记录(data record)
01结束记录(end record)
02段记录(paragraph record)
03转移地址记录(transfer address record)
DD…DD为数据域(共有NN字节)
CC为校验和(一字节)
Intel hex文件记录中的数字都是16进制格式,两个16进制数字代表一个字节。
校验和CC是取记录中从数据字节计数域(NN)到数据域(DD…DD)最后一个字节的所有字节总和的最低字节,再取反加1。
Intelhex文件格式
Intelhex文件格式Intel hex 文件格式Intel hex 文件常用来保存单片机或其他处理器的目标程序代码。
它保存物理程序存储区中的目标代码映象。
一般的编程器都支持这种格式。
Intel hex 文件全部由可打印的ASCII字符组成,如下例所示::2000000012014c75a800e4f508f509780a7a78e4f608dafcd2 83fcfded240af9a7050dbd81:2000200000010ced2488ec34ff50edc283e4fcfded240af9e76 d7013ed33e43c700d0dbd2a:2000400000010ced2488ec34ff50e50509e50970020508e50 924a8e50834fd50aee4f50874Intel hex 由一条或多条记录组成,每条记录都由一个冒号“:”打头,其格式如下::CCAAAARR...ZZ其中:CC本条记录中的数据字节数AAAA本条记录中的数据在存储区中的起始地址RR记录类型:00 数据记录 (data record)01 结束记录 (end record)02 段记录 (paragraph record)03 转移地址记录 (transfer address record)...数据域ZZ数据域校验和Intel hex文件记录中的数字都是16进制格式,两个16进制数字代表一个字节。
CC域是数据域中的实际字节数,地址、记录类型和校验和域没有计算在内。
校验和是取记录中从数据字节计数域(CC)到数据域(...)最后一个字节的所有字节总和的2的补码。
HEX文件格式分析
阿龙整理Intel HEX文件是用来保存单片机或其他处理器的目标程序代码的文件,它保存物理程序存储器中的目标代码的映像,以便编程器和仿真器调用.绝大多数编程器都支持Intel HEX格式。
下面是一个Intel HEX文件用记事本打开后看到的内容::020*********FA:1000000018F09FE518F09FE518F09FE518F09FE5C0:1000100018F09FE5805F20B9F0FF1FE518F09FE51D:10002000C000000040000000440000004800000044:100030004C00000000000000000000005000000024......:103020005C300000A8E60040000000005C300000BA:1030300000000140000000004830000000000000D7:103040001400004094E6000032FFF0FFE8030000A7:0C30500064000000FFFFFFFF010*******:00000001FFIntel HEX文件是文本行的ASCII文本文件,文件内容全部由可打印的ASCII字符组成,可以用记事本打开.Intel HEX由一条或多条记录组成,每行一个记录,每条记录都以冒号":"开始,以回车(0DH)和换行(0AH)结束.除":"外,每条记录有五个域,每一域由2N(N>=1)个HEX字符组成,格式如下:[LL][ZZZZ][TT][SS....SS][RR]其中:[LL]:表示该记录的实际数据的长度;[ZZZZ]:表示该记录所包含的数据在实际的存储区中的起始地址;[TT]:为该记录的类型;[SS....SS]:为该记录的实际数据,由2N(N>=1)个HEX字符组成,该域的长度应当与[LL]域所指出长度一致.[RR]:为该记录的数据校验和.例如对上面例子中的第一行::020*********FA用"["和"]"分开后如下: :[02][0000][04][0000][FA][02]:该记录的实际数据的长度[LL]为2个字节(4个HEX字符);[0000]:该记录所包含的数据在实际的存储区中的起始地址[ZZZZ]为0000H;[04]:该记录的类型[TT]为04——扩展线性地址;[0000]:该记录的实际数据[SS....SS];[FA]:该记录的数据校验和[RR];对上面例子中的倒数第三行:1030300000000140000000004830000000000000D7用"["和"]"分开后如下::[10][3030][00][00000140000000004830000000000000][D7][10]:该记录的实际数据的长度[LL]为16D(10H)个字节(20H个HEX字符);[3030]:该记录所包含的数据在实际的存储区中的起始地址[ZZZZ]为3030H;[00]:该记录的类型[TT]为00——数据(实际要烧写到存储器中的数据);[0000]:该记录的实际数据[SS....SS];[FA]:该记录的数据校验和[RR];常见的记录类型如下:00 :数据记录.表示该记录所包含的数据为实际要烧写到存储器中的数据。
hex文件详细介绍(Hexfiledetails)
hex文件详细介绍(Hex file details)Intel HEX file is an ASCII text file with lines of text in the HEX file format Intel. In the Intel HEX file, each line contains a HEX record. These records consist of sixteen hexadecimal encoding number corresponding to the machine language code and / or data. Intel HEX files are often used to transfer will be stored in a ROM or EPROM program and data. Most EPROM programmers or emulators using Intel HEX file.[editor this paragraph] record formatIntel HEX is composed of an arbitrary number of sixteen hexadecimal records. Each record contains 5 domains, are arranged in the following format:]cc: llaaaatt[dd...Each group of letters corresponds to a different domain, each letter corresponds to a sixteen hexadecimal encoding digital. Each domain consists of at least two encoding sixteen hexadecimal digits, they constitute a byte, as described below:Intel HEX: each record consists of a colon at the beginning.Ll is the length of the data domain, it represents a record of the number of data bytes (DD).AAAA is the address field, it represents the starting address of the data record.TT represents the HEX record type domain, it may be one of thefollowing data:00 - data recordThe 01 - end of file record02 - extended segment address record04 - extended linear address recordDD is the data domain, it represents a byte of data. A record may have many data bytes. Record the number of data bytes must be the length of the data domain (LL) in the specified number.CC is the checksum field, it represents the checksum of the record. The checksum is calculated by the recording of all sixteen hexadecimal encoding of the digital values, modulo 256 following up.[editor this paragraph] data recordIntel HEX file is composed of an arbitrary number to enter newline end data records. The appearance of data records are as follows:: 10246200464C5549442050524F46494C4500464C33Among them:10 is the number of data bytes in the record.The 2462 is that the data will be downloaded to the memory address.00 is the record type (data record)464C... 464C is the data.33 is the checksum of the record.[editor this paragraph] extended linear address record (HEX386)The extended linear address record is called 32 bit address records and HEX386 records. These records contain the address of data 16. The extended linear address record always has two data bytes, the appearance is as follows:: 02000004FFFFFCAmong them:02 is the number of data bytes in the record.0000 is the address field, for the extended linear address record, this field is always 0000.04 is the record type 04 (extended linear address record)FFFF is the address of the high 16 bits.FC is the checksum of the record and calculation methods areas follows:01h + NOT (02h + 00h + 00h + 04H + FFh + FFh).When an extended linear address record is read, the extended linear address stored in the data field is preserved,It is used to record from the subsequent Intel HEX file to read. The linear address remains effective until it is another extended address record change.Through the address field in the record and from the extended linear address record address data adding shifted data record absolute memory address.The following example illustrates this processFrom the data recording address domain address 2462Data domain + FFFF extended linear address record-Absolute memory address FFFF2462The extended segment address record (HEX86)The extended segment address record also called HEX86 records, which includes the 4-19 bit data address. The extended segment address record always has two data bytes, the appearance is as follows:: 020*********EAAmong them:02 is the number of data bytes in the record.0000 is the address field. For the extended segment address record, this field is always 0000.02 is the record type 02 (extended segment address record)The 1200 section is.EA is the checksum of the record and calculation methods are as follows:01h + NOT (02h + 00h + 00h + 02h + 12h + 00h).When an extended segment address record is read and stored in the data field of the extended segment address is saved, it is applied to the recording from a subsequent read HEX file to Intel. The segment address remains effective until it is another extended address record change.Through the address field in the record to be displaced from the extended segment address record sum address data to obtain data record absolute memory address.The following example illustrates this processFrom the data recording address domain address 2462Extended segment address record data field 1200-Absolute memory address 00014462End of file (EOF) recordsIntel HEX file to the end of file (EOF). The end of record to record the type of domain value must be 01.EOF record appearance always as follows:: 00000001FFAmong them:00 is the number of data bytes in the record.The 0000 is the data is downloaded to the memory address. At the end of the file record address is meaningless are ignored by the.0000h is typical of the address.01 is the record type 01 (end of file records)FF is the checksum of the record and calculation methods are as follows:01h + NOT (00h + 00h + 00h + 01h).Intel HEX file example:The following is a complete Intel HEX file example:: 10001300AC12AD13AE10AF1112002F8E0E8F0F2244: 10000300E50B250DF509E50A350CF5081200132259: 03000000020023D8: 0C002300787FE4F6D8FD7581130200031D: 10002F00EFF88DF0A4FFEDC5F0CEA42EFEEC88F016: 04003F00A42EFE22CB: 00000001FF[editor this paragraph of]HEX file and BIN file format differenceHEX file and BIN file is two file formats we often encounter.The following is a brief look at the difference between these two file formats:1HEX file includes address information, and the BIN file format includes only the data itselfWhen writing or download the HEX file, generally do not need to specify the address of the user, because the HEX file insideinformation is included. When writing BIN files, the user must need to specify the address information.2BIN file format of the binary file, no "format".The file includes only pure binary data.3HEX HEX file is a record (RECORD).In the HEX file, each line represents a record.The basic format for recording:+---------------------------------------------------------------+ | RECORD RECLEN LOAD RECTYPE | | | | INFO or DATA CHKSUM MARK | | | ':' | | OFFSET | | | |+---------------------------------------------------------------+ | | 1-byte 1-byte 2-byte 1-byte n-byte | | | | 1-byte |+---------------------------------------------------------------+Record types include:'00'Data Rrecord: used to record data, most recorded HEX files are'01' End of File Record: data are used to mark the end of file, placed at the end of the file, the end labeling HEX file record'02'Extended Segment Address Record: identifies the extended segment address'04' Extended Linear Address Record: identifies the extended linear address above after 2 records are used to provide the address information. Every time I metthese 2 records, can be calculated a "base" address on record. For the record, the address calculation time, is the "base" based.The specific format of data records:+---------------------------------------------------------------+ | RECORD RECLEN LOAD RECTYPE | | | | INFO or DATA CHKSUM | | | MARK ':' OFFSET'00'| | | | | |+---------------------------------------------------------------+ | | 1-byte 1-byte 2-byte 1-byte n-byte | | | | 1-byte |+---------------------------------------------------------------+See example:020*********FA: 10000400FF00A0E314209FE5001092E5011092E5A3: 00000001FFOn the top of the HEX file analysis:First record length is 02 LOAD, OFFSET 0000, RECTYPE is 04, the record for the extended segment address record. The data is 0000, the checksum for the FA. From the length of the record and data, we can calculate a base address, this address is 0X0000.Behind the data record to the address for the base address.Second the length of the record was 10 (16), LOAD OFFSET 0004, RECTYPE is 00, the record for a data record. The data forFF00A0E314209FE5001092E5011092E5, a total of 16 BYTE. The checksum of the record is A3. At the base of the site for the 0X0000, plus OFFSET, the record of the 16BYTE in the starting address of the data is 0x0000 + 0x0004 = 0x0004.Third record length is 00 LOAD, OFFSET 0000, TYPE = 01, the checksum for the FF. This is a END OF FILE RECORD, at the end of identification document.In this case, the actual data is only 16BYTE:FF00A0E314209FE5001092E5011092E5, the starting address is 0x44HEX file and BIN file size differenceHEX file is a binary value ASCII. For example, general 8-BIT binary value 0x3F, ASCII said to represent thecharacters'3'and'F' characters, each character requires a BYTE, so HEX files need to be > 2 times the space. For a BIN file, you see the size of the file can know the actual file size including data. The HEX data file, you see the size of the file is not the actual size. One is because the HEX file is used ASCII data to show that, two is because the HEX file itself also includes additional information.。
IntelHEX格式简介
IntelHEX格式简介什么是Intel HEX格式?Intel HEX文件是记录文本行的ASCII文本文件,在Intel HEX文件中,每一行是一个HEX记录由十六进制数组成的机器码或者数据常量,Intel HEX文件经常被用于将程序或数据传输存储到ROM.EPROM,大多数编程器和模拟器使用Intel HEX文件.记录格式一个Intel HEX文件可以包含任意多的十六进制记录,每条记录有五个域,下面是一个记录的格式.:llaaaatt[dd...]cc每一组字母是独立的一域,每一个字母是一个十六进制数字,每一域至少由两个十六进制数字组成,下面是字节的描述.:冒号是每一条Intel HEX记录的开始ll 是这条记录的长度域,他表示数据(dd)的字节数目.aaaa 是地址域,他表示数据的起始地址<如果是数据记录,这表示将要烧录的这条记录中的数据在EPROM 中的偏移地址,对于不支持扩展段地址和扩展线性地址的,如89C51,这就是此条记录的起始地址>tt 这个域表示这条HEX记录的类型,他有可能是下面这几种类型00 ----数据记录01 ----文件结束记录02 ----扩展段地址记录04 ----扩展线性地址记录dd 是数据域,表示一个字节的数据,一个记录可能有多个数据字节,字节数目可以查看ll域的说明cc 是效验和域,表示记录的效验和,计算方法是将本条记录冒号开始的所有字母对<不包括本效验字和冒号> 所表示的十六进制数字<一对字母表示一个十六进制数,这样的一个十六进制数为一个字节>都加起来然后模除256得到的余数最后求出余数的补码即是本效验字节cc.<例如::0300000002005E9Dcc=0x01+NOT((0x03+0x00+0x00+0x00+0x02+0x00+0x5E) %0x100)=0x01+0x 9C=0x9DC语言描述:UCHAR cc;cc=(UCHAR)~(0x03+0x00+0x00+0x00+0x02+0x00+0x5E);cc++;>数据记录Intel HEX文件由若干个数据记录组成,一个数据记录以一个回车和一个换行结束<回车为0x0d换行为0x0a>比如下面的一条数据记录:10246200464C5549442050524F46494C4500464C3310 是此行记录数据的字节数目2462 是数据在内存<将要烧写的eprom地址>中的起始地址00 是记录类型00(是一个数据记录)464C 到464C 是数据33 是此行记录的效验和扩展线性地址记录(HEX386)扩展线性地址记录也可称为32位地址记录和HEX386记录,这个纪录包含高16(16-31位)位数据地址,这种扩展的线性记录总是有两个字节数据,像下面这样::02000004FFFFFC02 是记录的数据字节数目0000 是地址域这在扩展地址记录中总是000004 是记录类型04(扩展地址记录)FFFF 是高16位地址FC 是记录效验和,计算方法如下:01h + NOT(02h + 00h + 00h + 04h + FFh + FFh)当一个扩展线性地址记录被读到后,扩展线性地址记录的数据区域将被保存并应用到后面从Intel HEX文件中读出的记录,这个扩展线性记录一直有效,直到读到下一个扩展线性记录.绝对内存地址= 数据记录中的地址+ 移位后的扩展线性地址下面举例说明这个过程从数据记录的地址域得到地址2462从扩展线性地址记录的地址域得到地址FFFF绝对内存地址FFFF2462扩展段地址记录(HEX86)扩展段地址记录也被称为HEX86记录, 包含4-19位的数据地址段, 这个扩展段地址记录总是有两字节数据,如下::020*********EA02 是记录中的数据字节数目0000 是地址域,在扩展段地址记录中,这个域总是000002 是记录类型02(扩展段地址的标示)1200 是该段的地址EA 是效验和计算如下:01h + NOT(02h + 00h + 00h + 02h + 12h + 00h).当扩展段地址记录被读后,扩展段地址将被存储并应用到以后从Intel HEX文件读出的记录,这个段地址一直有效直到读到下一个扩展段地址记录绝对内存地址= 数据记录中的地址+ 移位后的扩展段地址数据记录中的地址域移位后扩展段地址记录中的地址域下面举例说明这个过程从数据记录的地址域得到地址 2 4 6 2从扩展段地址记录的地址域得到地址 1 2 0 0绝对内存地址0 0 0 1 4 4 6 2文件结束记录(EOF)一个Intel HEX文件必须有一个文件结束记录,这个记录的类型域必须是01, 一个EOF记录总是这样::00000001FF00是记录中数据字节的数目0000这个地址对于EOF记录来说无任何意义01记录类型是01(文件结束记录标示)FF是效验和计算如下01h + NOT(00h + 00h + 00h + 01h).========================总结形如:BBAAAATTHHHH...HHHHCCBB: ByteAAAA:数据记录的开始地址,高位在前,地位在后因为这个格式只支持8bits,地址被倍乘所以,为了得到实际的PIC的地址,需要将地址除以2TT: Type00 数据记录01 记录结束04 扩展地址记录(表示32位地址的前缀,当然这种只能在INHX32) HHHH:一个字(Word)的数据记录,高Byte在前,低Byte在后TT之后,总共有BB/2 个字的数据CC: 一个Byte的CheckSum因为PIC16F873A只有4K的程序空间所以,不会有TT=04的Linear Address Record。
基础知识hex文件格式详解
基础知识hex文件格式详解hex文件格式总结•什么是hex文件?•文件格式•指令类型(Record type)•校验和o:04 02B0 00 92020008 AEo:04 0000 05 08000135 B9o:00 0000 01 FF•hex转bin文件什么是hex文件?hex是用于文件格式是intel规定的标准,总体来说,hex是文本文件,经常在微控制器的固件开发中看到hex的身影,例如基于STM32F103硬件,使用MDK开发的话,该软件就可以生成hex文件;如下图所示;这是一个简单的STM32标准外设库工程,代码里什么都没做,具体如下;#include 'stm32f10x.h'#include <stdio.h>/*** @brief Main program.* @param None* @retval None*/int main(void){/* Add your application code here*//* Infinite loop */while (1){}}最终,我们打开生成的hex文件,可以看到,这的确是一个文本文件,所以,直接将hex文件烧入MCU的Flash还是不行的,除非烧录软件可以把hex文件转成bin文件,然后再进行烧录;:020*********F2:10000000000400204901000899010008950100083A:10001000970100089101000881020008000000001B:100020000000000000000000000000009D0100082A:1000300093010008000000009B010008290200084D:100040006301000863010008630100086301000800:1000500063010008630100086301000863010008F0:1000600063010008630100086301000863010008E0:1000700063010008630100086301000863010008D0:10008000630100086301000863010008000000002C:1000900000000000000000000000000063010008F4:1000A00063010008630100086301000863010008A0:1000B0006301000863010008630100086301000890:1000C0006301000863010008630100086301000880:1000D0006301000863010008630100086301000870 :1000E0006301000863010008630100086301000860 :1000F0006301000863010008000000000000000028 :100100000000000000000000630100086301000817 :10011000630100086301000863010008630100082F :10012000630100086301000863010008630100081F :1001300063010008DFF80CD000F018F80048004711 :10014000A102000800040020064880470648004736 :10015000FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE777:10016000FEE7FEE72D02000835010008064C074DAA :1001700006E0E06840F0010394E807009847103477 :10018000AC42F6D3FFF7DAFFA4020008B40200087D :10019000FEE77047FEE7FEE77047704770470000D4 :1001A0000CB500211F4801910091026842F4803291 :1001B00002604FF4A063026802F400320092019AD8 :1001C000521C0192009A12B9019A9A42F3D1026824 :1001D000920324D50121009141684160416841604A :1001E00041684160416821F47C114160416841F4FB :1001F00098114160016841F08071016001688901D6 :10020000FCD5416821F003014160416841F00201E1 :1002100041604168C1F381010229FAD10CBD00910E :100220000CBD00000010024070470000104810B5DF :10023000016841F00101016041680E4A11404160CE :1002400001680D4A11400160016821F480210160BC :10025000416821F4FE0141604FF41F0181600021DB :10026000C162FFF79DFF05494FF00060086010BDB7 :10027000001002400000FFF8FFFFF6FE08ED00E06E :10028000FEE702E008C8121F08C1002AFAD1704731 :100290007047002001E001C1121F002AFBD1704706 :1002A000FEE70000B4020008000000200004000087:0402B00092020008AE:0400000508000135B9:00000001FF文件格式通过上面的文件,我们不难发现,hex文件每行都由:作为起始码,这是显而易见的,而后面这些乱七八糟的数据又代表什么呢?先看下面这张图;hexformat这个和一般的通讯协议类似,一帧数据往往包括起始码,数据长度,数据类型,数据,校验码等等,所以hex文件也不例外,这里它包含几个特点,下面参考了wiki;•起始码:每行数据作为一帧,并由:作为起始码;•字节长度:两个十六进制数字(一对十六进制数字),指示数据字段中的字节数(十六进制数字对)。
HEX文件格式
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也是如此。
S19与HEX文件格式解析
S19格式与HEX格式详解2019.03 S19 与 HEX文件中的所有字节都是可打印的 ASCII 字符,可用任何文本编辑器打开查看S19S-record格式文件是Freescale CodeWarrior编译器生成的后缀名为.S19的程序文件,是一段直接烧写进MCU的ASCII码,英文全称问Motorola format for EEPROM programming。
S19 格式是每一行为一个记录,每个记录由 6 个部分组成,除起始代码外,均用十六进制数大端格式表示:1.起始代码:一个大写字母“S”,表示一个新记录的开始。
2.记录类型:1 个十六进制位,取值 0~9,定义记录块的类型,详见下文。
3.字节数:2 个十六进制位,表示地址、数据、校验和的总字节数。
4.地址:4, 6 或 8 个十六进制位,具体的长度由记录类型决定,表示本条记录在内存中的起始地址。
5.实际数据:2n 个十六进制字符,n 为前面指定的字节数的值减去地址和校验和的长度。
6.校验和:2 个十六进制字符,为字节数、地址和实际数据的所有字节(两个十六进制位)的和对 0xFF 取模,再求反码得到。
一个完整的MOTOROLA S-Record格式数据包含如下区域:<type> <length> <address> <data> <checksum>各字段的意思分别如下:<type>:标示记录的类型,该字段占据1-byte。
它可以有如下数值:“S0”, “S1”, “S2”, “S3”, “S5”, “S7”, “S8” , “S9”“S0” -- 记录描述信息“S1”, “S2”, “S3” -- 记录存储的数据。
这三者的区别在于地址(address)的长度不同,S1为2-byte,S2为3-byte,以及S3为4-byte。
“S5” -- 包含了“S1”, “S2”, “S3”的信息。
Intel的hex格式含义
Intel的hex格式含义Intel的hex格式含义Intel HEX file(文件名.hex)是具有约定格式的ASCII文本文件。
文件中每一行包含一个HEX 记录(record)。
记录由十六进制数组成,这些数字代表机器指令码或常量。
Intel HEX files 用来向ROM中传递代码和数据,即它和Bin文件类似,指导下载程序或仿真器将指令码和数据下载到ROM存储器特定的位置上。
Intel HEX file可以包含任意多行记录(record),每个record主要由5个部分(域)组成,每部分至少包含两个十六进制字符,即一个字节(8位),其具体形式为“:llaaaatt[dd...]cc ”其中:“:”表示record的开始“ll”表示record中数据位(dd)的长度(几个字节)“aaaa”表示record中的数据存储起始地址“tt”表示record类型,可以为00(数据record),01(文件结束record),02(扩展段地址record),04(扩展线性地址record)“dd”表示record数据的一位,一个record可能包含多个数据字节,数据字节的数量必须与ll中指定的相一致“cc”表示record的校验域,下面给出一个实例:10008000AF5F67F0602703E0322CFA92007780C361:1000900089001C6B7EA7CA9200FE10D2AA00477D81:0B00A00080FA92006F3600C3A00076CB:00000001FF第一行,":"符号表明记录的开始. 后面的两个字符表明记录的长度,这里是10h. 后面的四个字符给出调入的地址,这里是0080h. 后面的两个字符表明记录的类型;0 数据记录 1 记录文件结束 2 扩展段地址记录 3 开始段地址记录4 扩展线性地址记录 5开始线性地址记录后面则是真正的数据记录, 最后两位是校验和检查,它加上前面所有的数据和为0.最后一行特殊,总是写成这个样子.扩展Intel Hex的格式(最大1M): 由于普通的Intel的Hex记录文件只能记录64K的地址范围, 所以大于64K的地址数据要靠扩展Intel Hex格式的文件来记录.对于扩展形式Hex文件,在每一个64K段的开始加上扩展的段地址规定,下面的数据地址均在这个段内,除非出现新的段地址定义.一个段地址定义的格式如下:起始符长度起始地址扩展段标示扩展段序号无用累加和: 02 0000 02 3000 EC段地址的标识符是第四组数据02,表示扩展地址段的定义,再后面的以为HEX数表示段的数目, 上面的定义为3,表示段地址是3,所以下面的数据地址是3 + XX(XX是64K段内的地址)目标文件.HEX的各部分具体含义.HEX是Intel的目标文件格式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
什么是Intel HEX格式?
Intel HEX文件是记录文本行的ASCII文本文件,在Intel HEX文件中,每一行是一个HEX记录
由十六进制数组成的机器码或者数据常量,Intel HEX文件经常被用于将程序或数据传输
存储到ROM.EPROM,大多数编程器和模拟器使用Intel HEX文件.
记录格式
一个Intel HEX文件可以包含任意多的十六进制记录,每条记录有五个域,下面是一个记录的格式.
:llaaaatt[dd...]cc
每一组字母是独立的一域,每一个字母是一个十六进制数字,每一域至少由两个十六进制数字组成,下面是字节的描述.
:冒号是每一条Intel HEX记录的开始
ll 是这条记录的长度域,他表示数据(dd)的字节数目.
aaaa 是地址域,他表示数据的起始地址
<如果是数据记录,这表示将要烧录的这条记录中的数据在EPROM中的偏移地址,
对于不支持扩展段地址和扩展线性地址的,如89C51,这就是此条记录的起始地址>
tt 这个域表示这条HEX记录的类型,他有可能是下面这几种类型
00 ----数据记录
01 ----文件结束记录
02 ----扩展段地址记录
04 ----扩展线性地址记录
dd 是数据域,表示一个字节的数据,一个记录可能有多个数据字节,字节数目可以
查看ll域的说明
cc 是效验和域,表示记录的效验和,计算方法是将本条记录冒号开始的所有字母对
<不包括本效验字和冒号> 所表示的十六进制数字
<一对字母表示一个十六进制数,这样的一个十六进制数为一个字节>
都加起来然后模除256得到的余数最后求出余数的补码即是本效验字节cc.
<例如:
:0300000002005E9D
cc=0x01+NOT((0x03+0x00+0x00+0x00+0x02+0x00+0x5E)%0x100)=0x01+0x 9C=0x9D
C语言描述:
UCHAR cc;
cc=(UCHAR)~(0x03+0x00+0x00+0x00+0x02+0x00+0x5E);
cc++;
>
数据记录
Intel HEX文件由若干个数据记录组成,一个数据记录以一个回车和一个换行结束
<回车为0x0d换行为0x0a>
比如下面的一条数据记录
:10246200464C5549442050524F46494C4500464C33
10 是此行记录数据的字节数目
2462 是数据在内存<将要烧写的eprom地址>中的起始地址
00 是记录类型00(是一个数据记录)
464C 到464C 是数据
33 是此行记录的效验和
扩展线性地址记录(HEX386)
扩展线性地址记录也可称为32位地址记录和HEX386记录,这个纪录包含高16(16-31位)位数据地址,这种扩展的线性记录总是有两个字节数据,像下面这样:
:02000004FFFFFC
02 是记录的数据字节数目
0000 是地址域这在扩展地址记录中总是0000
04 是记录类型04(扩展地址记录)
FFFF 是高16位地址
FC 是记录效验和,计算方法如下:
01h + NOT(02h + 00h + 00h + 04h + FFh + FFh)
当一个扩展线性地址记录被读到后,扩展线性地址记录的数据区域将被保存
并应用到后面从Intel HEX文件中读出的记录,这个扩展线性记录一直有效,
直到读到下一个扩展线性记录.
绝对内存地址= 数据记录中的地址+ 移位后的扩展线性地址
下面举例说明这个过程
从数据记录的地址域得到地址2462
从扩展线性地址记录的地址域得到地址FFFF
绝对内存地址FFFF2462
扩展段地址记录(HEX86)
扩展段地址记录也被称为HEX86记录, 包含4-19位的数据地址段,
这个扩展段地址记录总是有两字节数据,如下:
:020*********EA
02 是记录中的数据字节数目
0000 是地址域,在扩展段地址记录中,这个域总是0000
02 是记录类型02(扩展段地址的标示)
1200 是该段的地址
EA 是效验和
计算如下:
01h + NOT(02h + 00h + 00h + 02h + 12h + 00h).
当扩展段地址记录被读后,扩展段地址将被存储并应用到以后从Intel HEX文件读出的记录,这个段地址一直有效直到读到下一个扩展段地址记录
绝对内存地址= 数据记录中的地址+ 移位后的扩展段地址
数据记录中的地址域移位后扩展段地址记录中的地址域
下面举例说明这个过程
从数据记录的地址域得到地址 2 4 6 2
从扩展段地址记录的地址域得到地址 1 2 0 0
绝对内存地址0 0 0 1 4 4 6 2
文件结束记录(EOF)
一个Intel HEX文件必须有一个文件结束记录,这个记录的类型域必须是01, 一个EOF记录总是这样:
:00000001FF
00是记录中数据字节的数目
0000这个地址对于EOF记录来说无任何意义
01记录类型是01(文件结束记录标示)
FF是效验和计算如下
01h + NOT(00h + 00h + 00h + 01h).
========================
总结
形如
:BBAAAATTHHHH...HHHHCC
BB: Byte
AAAA:数据记录的开始地址,高位在前,地位在后
因为这个格式只支持8bits,地址被倍乘
所以,为了得到实际的PIC的地址,需要将地址除以2
TT: Type
00 数据记录
01 记录结束
04 扩展地址记录(表示32位地址的前缀,当然这种只能在INHX32) HHHH:一个字(Word)的数据记录,高Byte在前,低Byte在后
TT之后,总共有BB/2 个字的数据
CC: 一个Byte的CheckSum
因为PIC16F873A只有4K的程序空间
所以,不会有TT=04的Linear Address Record。