单片机hex和bin文件的区别
HEX文件和BIN文件格式的区别

HEX⽂件和BIN⽂件格式的区别在单⽚机开发中HEX⽂件和BIN⽂件是⾮常常见的烧写⽂件格式,以常⽤开发环境Keil为例,分别创建HEX和BIN⽂件,⽐如:1、创建HEX:在Keil⾥⾯可以通过勾选【魔法棒>Output>Creat HEX File】让⼯程输出HEX⽂件。
2、创建BIN:在Keil中在【魔法棒>User>After Build/Rebuild】标签下勾选Run #1,同时在其对应的User Command ⽂本框中输⼊fromelf --bin --output=@L.bin !L编译后就会输出BIN⽂件。
⾔归正传,先简单描述下HEX(左边)和BIN(右边)⽂件的区别:1、HEX⽂件HEX⽂件中同时包含的数据和地址信息,所以在烧写或下载HEX⽂件的时候,⼀般都不需要⽤户指定地址。
2、BIN⽂件BIN⽂件只有纯粹的数据(代码)信息,并不包含地址,所以烧写BIN时就需要指定烧写地址,⼀般可以在烧写⼯具上修改。
下⾯看⼀个Keil下⽣成的HEX和BIN⽂件的部分代码:HEX⽂件内容都是ASCII编码得到的,可以⽤本本编辑器直接打开,BIN⽂件不能⽤编辑器直接查看,可以把它转换成16进制然后显⽰(如在notepad++下装⼀个插件就好:):很直观的可以看到BIN⽂件只是HEX⽂件中的数据区域。
HEX格式解读: HEX⽂件每⼀⾏代表⼀个记录(RECORD),其基本格式如下 RECORD MARK 冒号(:) 表⽰起始标志 LOAD RECLEN 数据长度 即INFO or DATA 段的数据长度 OFFSET 地址偏移 指定相对基地址的偏移量 RECTYP 记录类型 记录类型:“00”数据记录 “01”⽂件结束记录 '02'扩展段地址记录 '03'起始段地址记录 '04'扩展线性地址记录 '05'开始线性地址记录 INFO or DATA 数据信息 校验值⾸先要注意的时,1-byte中的byte在HEX⽂件中因为经过ASCII编码的所以⽤两个字符表⽰⼀个16进制即⼀个字节,,在BIN⽂件中则是直接⽤⼀个字节表⽰这两字符,上⾯的图很直观下⾯以HEX⽂件第⼀⾏为例,它的含义主要有,02表⽰数据段“6000”长度为2,0000表⽰偏移地址,04表⽰记录类型为扩展线性地址的记录,6000表⽰线性地址的基地址并且表⽰的时[16-31]区域即⾼位地址,[0-15]区域即低位默认为0。
单片机各种烧写文件格式简介

各种烧写文件格式简介-ELF Hex Bin一,ELFExecutable and linking format(ELF)文件是x86 Linux系统下的一种常用目标文件(object file)格式,有三种主要类型:Executable and linking format(ELF)文件是x86 Linux系统下的一种常用目标文件(object file)格式,有三种主要类型:(1)适于连接的可重定位文件(relocatable file),可与其它目标文件一起创建可执行文件和共享目标文件。
(2)适于执行的可执行文件(executable file),用于提供程序的进程映像,加载的内存执行。
(3)共享目标文件(shared object file),连接器可将它与其它可重定位文件和共享目标文件连接成其它的目标文件,动态连接器又可将它与可执行文件和其它共享目标文件结合起来创建一个进程映像。
ELF文件格式比较复杂。
二,hex什么是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+0x9C=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三,binbin文件就是直接的二进制文件,内部没有地址标记。
Hex文件转换为Bin文件

Hex⽂件转换为Bin⽂件单⽚机程序的可执⾏⽂件有的是Hex格式,有的是Bin⽂件格式。
有时需要将Hex⽂件转换为Bin⽂件(如在线升级时)。
本⽂描述了⼀种在Qt Creator环境下将Hex⽂件转换为Bin⽂件的⼀种⽅法,仅供参考。
Hex⽂件是以记录的形式记录每⼀块数据,每条记录包含了地址和数据,以ASCII字符形式保存。
基本格式如下RECORD MARK:每条记录的起始标记,ASCII字符为‘:’,即0x3ALOAD RECLEN:表⽰数据的长度OFFSET:该条记录的偏移地址RECTYP:该条记录的类型关于详细的Hex⽂件的解析,请参考Hexfrmt.pdf⽂件Bin⽂件以⼆进制的形式保存着数据,该数据可直接存储在Flash中。
Hex转Bin⽂件的原理:从Hex⽂件中提取数据记录(RECTYP为0),其它舍弃。
//ASCII转⼗六进制函数char ASCII_TO_HEX(char asc){char chRet;if('0' <= asc && asc<='9' ){chRet = asc - '0';}else if('a' <= asc && asc<='f'){chRet = asc-'a' + 0xa;}else if('A' <= asc && asc<='F'){chRet = asc-'A' + 0xA;}return chRet;}QString hexFileName = QFileDialog::getOpenFileName(this,"Choose hex file","../",tr("Document(*.hex)"));if(!hexFileName.isEmpty()){QFile file(hexFileName);if(file.open(QIODevice::ReadOnly)){QTextStream in(&file);QString line;QString binFileName = QFileDialog::getSaveFileName(this,tr("Binary File Name"), "../df60.bin",tr("Document(*.bin")); QFile outFile(binFileName);if(!outFile.open(QFile::ReadWrite )){return;}QDataStream out(&outFile);while(!in.atEnd()){line = in.readLine();QByteArray br;QString newLine;br.append(line);if(0x30 == br.at(8)) //Data record{char sizeHigh, sizeLow;sizeHigh = ASCII_TO_HEX(br.at(1));sizeLow = ASCII_TO_HEX(br.at(2));int size = (sizeHigh<<4) | sizeLow;int i=0;while(size--){char dataHigh = ASCII_TO_HEX(br.at(9+i));char dataLow = ASCII_TO_HEX(br.at(10+i));char dataByte = (dataHigh<<4) | dataLow;QString strHex = QString("%1").arg((dataHigh<<4) | dataLow,2,16,QLatin1Char('0'));newLine += strHex.toUpper()+" ";if(-1 == out.writeRawData(&dataByte,1)){qDebug()<<"Error: fail to write bin file";}i += 2;}ui->textBrowser_2->insertPlainText(newLine+"\n"); }}outFile.close();file.close();}}。
stm32编译的二进制程序的格式

stm32编译的二进制程序的格式在STM32编译的二进制程序格式方面,主要参考内容如下:1. ELF(Executable and Linkable Format)格式:ELF是一种可执行文件格式,用于将编译后的程序转换为二进制文件。
它定义了如何组织和加载可执行文件的各个部分,包括代码段、数据段、符号表等。
ELF格式具有良好的可扩展性和灵活性,可以适应不同的硬件和目标平台。
2. HEX(Intel Hex)格式:HEX格式是一种常用的非执行文件格式,用于表示二进制数据。
它将数据以十六进制的形式表示,并在文件中以行为单位进行存储。
每行包含数据的起始地址、数据长度、数据本身和校验和等信息。
HEX格式通常用于将二进制程序下载到STM32芯片中。
3. BIN(Binary)格式:BIN格式是一种简单的二进制文件格式,直接将二进制数据以字节序列的形式存储在文件中。
它没有头部信息,也没有指示地址和长度的字段,只包含纯粹的二进制数据。
BIN格式适用于将程序直接烧录到STM32芯片的存储器中。
4. SREC(Motorola S-record)格式:SREC格式是一种用于表示二进制数据的文件格式,广泛应用于早期的Motorola微处理器和微控制器。
它将数据以ASCII字符的形式表示,并在文件中以行为单位进行存储。
每行包含数据的类型、起始地址、长度、数据本身和校验和等信息。
SREC格式通常用于将二进制程序下载到STM32芯片中。
除了这些常见的二进制程序格式,STM32编译还可以生成其他格式的输出文件,例如:5. IHEX(Intel Hex Extended)格式:IHEX格式是对HEX格式的扩展,增加了附加数据和可执行代码等内容。
它可以更好地支持STM32芯片的特殊功能,如EEPROM和Flash的编程。
6. AOut(Assembler Output)格式:AOut格式是汇编器的输出格式,包含有关汇编指令和数据的详细信息。
单片机烧录用的hex文件,文件格式解析(转载)

单⽚机烧录⽤的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标识段出现之前,下⾯的数据都是这个基地址。
有关IAP使用HEX或BIN文件格式的探讨

有关IAP使用HEX或BIN文件格式的探讨BIN优点,下载时二进制传输效率高,一个起始地址和长度(均可事先知道)搞定.因起始地址和长度在下载一开始就可以知道,所以只需要擦除实际代码大小的FLASH,避免大FLASH空间小代码时擦除FLASH的时间和FLASH损耗.缺点:当代码分段在不同地址时,如果中间有大片空地址,则需要填充,并被编程序到FLASH里.比如一段代码在0x0800 2000~0x0800 2F00,下一段代码在0x0800 4000~0x0800 4F00,那么BIN文件中0x0800 2F00到0x0800 4000这段未用的地址空间也需要填充数据(因BIN不含有地址,只能连续),这些无用的数据也需要传给MCU并被编程到FLASH.当这段空地址很大时,浪费的效率就很可观了.HEX优点,每个记录带有地址,按每个记录地址一个记录一个记录的编程.不方便整页整页的编程(不方便不是不可能,而是有点麻烦,因为有可能下一个记录的地址和这个记录地址中间有空闲地址).即使FLASH 中间有空闲未用地址空间也不需关注.缺点:ASCII码传输效率比BIN低一倍,由于并不知道总代码大小,需要擦除整个用户FLASH空间.所以HEX格式和BIN格式各有优劣.大家觉得用哪个格式好,抛砖引玉,讨论一下.我有个疑问,按照intel hex格式说明,普通数据记录最长可以有0xff个字节,实际上查看生成的HEX文件发现绝大部分是32个ASCII字节长度(16个实际2进制数据),有少量长度小于32个字节的普通数据记录.为什么没看到普通数据记录数据长度大于16字节的?hex格式是intel在很久很久很久以前的格式,那时候还没有现在的UE/WinHex等Hex Editor软件hex格式其中的一个目的是打印下来看的现在hex是在发挥余热,并且为了能继续跟上时代,还做了扩展,加segment段地址,这样寻址范围从16位到了32位bin有个最大的缺陷,就是没有起始地址以及范围的信息比如STM32的程序起始地址是0x08000000,难道在前面要填写这么多个空数据来保证地址正确bin不是一个严格意义上的文件格式,是没有文件格式的文件格式。
hex和bin文件的由来

hex和bin文件的由来与计算机编程和嵌入式系统开发有关。
hex文件是以ASCII文本形式保存编译后的二进制文件信息。
它不仅保存了Bin文件的内容,还包含了一些配置信息。
hex文件使用“:”开始,之后是地址域、数据类型、数据域和校验和。
hex文件可以由下载器(如jlink)烧写到MCU的ROM中。
而Bin文件是MCU固件烧写的最终形式,也就是说MCU的ROM中烧写的内容完全就是Bin文件的内容。
hex文件可以说是MCU固件的中间形式,由下载器的软件根据hex文件生成Bin文件再烧写到MCU的ROM 中。
以上信息仅供参考,如需了解更多信息,建议查阅计算机编程和嵌入式系统开发的相关书籍或咨询专业人士。
单片机下载文件:HEX文件和BIN文件的区别

单片机下载文件:HEX文件和BIN文件的区别单片机程序写好之后,我们都要把程序下载到单片机的内存中,单片机才会按照程序员的逻辑执行命令实现功能。
之前也讲过下载单片机的几种方式,比如ISP下载,JTAG下载,下载文件的格式最常见的是hex文件,这个格式大家都是知道的,还有一种bin文件是单片机的下载文件。
下面介绍这两种格式的区别。
HEX文件和BIN文件是我们经常碰到的2种文件格式。
下面简单介绍一下这2种文件格式的区别:1. hex文件包含地址信息。
在用ISP 方式烧写程序时,我们都有这样的经验:1)选择单片机型号;2)选择串口号;3)设置波特率(或者默认);4)选择下载的文件;5)点击下载按钮下载。
如下图所示。
经过这几步后,程序下载工作就完成了,在以上的步骤中我们并没有选择要把程序下载到单片机的哪块内存中,即不需要设置地址。
因为HEX文件内部的信息已经包括了地址。
而烧写BIN文件的时候,用户是一定需要指定地址信息的。
单片机多下载hex文件。
2. BIN文件格式只包括了数据本身,没有包含地址bin文件本身只是数据,没有包含地址信息,所以在下载bin文件时需要选择内存的起始地址和终止地址,即要把bin文件下载到指定的内存空间。
通常需要指定程序内存地址的芯片为ARM芯片和DSP 芯片。
3、HEX文件和BIN文件大小不一样对于bin文件,通过右键属性查看到的文件的大小就是数据的实际大小。
而对HEX文件而言,你看到的文件大小并不是实际的数据的大小。
一是因为HEX文件是用ASCII来表示数据,二是因为HEX文件本身还包括别的附加信息。
hex文件的大小该怎么看呢?之前我推送过查看方法,忘记的同学可以点下面的链接查看:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机hex和bin文件的区别
ex文件是可以烧写到单片机中,被单片机执行的一种文件格式,生成Hex文件的方式由很多种,可以通过不同的编译器将C程序或者汇编程序编译生成hex。
Hex文件如果用特殊的程序来查看(一般记事本就可以实现)。
打开后可发现,真个文件以行为单位,每行以冒号开头,内容全部为16进制码。
Hex文件可以按照如下的方式进行拆分来分析其中的内容:
例如:
:020*********FA , 我把它看做0x02 0x00 0x00 0x04 0x00 0x00 0xFA
第一个0x02 为数据长度。
紧跟着后面的0x00 0x00 为地址。
再后面的0x04为数据类型,类型共分以下几类:
‘00’ Data Record
‘01’ End of File Record。