找回密码
 立即注册
查看: 1036|回复: 6

烧录到单片机的BIN、HEX和HEX386固件说明与合并

[复制链接]
  • TA的每日心情
    开心
    昨天 21:55
  • 签到天数: 133 天

    [LV.7]常住居民III

    13

    主题

    52

    回帖

    1374

    积分

    金牌会员

    积分
    1374
    发表于 2023-2-1 17:32:48 | 显示全部楼层 |阅读模式

        经常有初学者在问单片机固件与源程序的区别,这里简单讲一下。单片机是不认识源程序的。对于单片机而言,源程序最终都将由编译器汇编器转换为此单片机能认识的机器码,也就是常说的烧录固件。不同内核的固件不能混用,相同内核而不同型号也会因为外设的差异不一定能用。STC-ISP软件支持BIN和HEX格式。
        Bin格式文件是用于MCU烧写/下载/烧录的二进制(十六进制)形式数据,所有机器码依次存放在里面,文件中不包含写入地址、烧录配置、校验等信息,也就是MCU的flash ROM中烧写的内容完全就是Bin文件的内容。优点是普遍体积小,缺点却很多。于是就有了HEX格式的文件。
        Hex文件是以ASCII文本形式保存编译后的文件信息,里面包括了一些配置信息,虽然可以用记事本等软件打开,当然也跟源程序肯定不同。ISP软件会在下载到单片机时自动转换成十六进制然后自动下载进去。这里指的Hex文件是Intel标准的Hex文件。Hex文件主要分为HEX-80(也就是51单片机最常见的HEX格式)、HEX-386两种格式。HEX文件都是由若干条记录(Record)组成的,每一行代表一条记录,以回车结束一条记录。为大端方式存储(高字节先存)。记录的格式为:

              +-----------------------------------------------------------------------------------------+
              |记录标识符“:”| 记录长度 |   装入偏移   | 记录类型 | 信息或数据 |  校验和 |
              +-----------------------------------------------------------------------------------------+
              |      1字节      |    1字节    |     2字节      |    1字节   |      n字节    |  1字节   |
              +-----------------------------------------------------------------------------------------+

        每条记录都由固定的记录标识符“:”开始。记录长度为数据段的字节数。装入偏移也就是偏移地址,范围为0-64KB,在同一个区域内地址可以不连续但是要递增。记录类型包括:
    “00”,Data Record:数据记录,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: 开始线性地址记录*

        在I386里,上面的02、04记录都是用来提供地址信息的。每次碰到这2个记录的时候,都可以根据03或者05记录计算出一个基地址。对于后面的数据记录,都是以这些基地址加上装入偏移计算出地址的。据观察在C251里暂时没用到02、03、05记录,只用04记录就能扩展寻址范围。校验和的计算方法是将本条记录不包括本效验字节和冒号的一切字母所表示的十六进制数字(两个字母表示一个十六进制数,即一个字节)都加起来,然后模除256得到的余数,再将余数取补码就是本条记录的效验字和。
        举个HEX-80的例子:

    :030000000221D505        (首行)
    :00000001FF        (末行)

    分析:
    :03 0000 00  0221D5   05
        偏移 -  3字节指令 校验
    其中03表示该行(首行)数据部分长度为3字节。0000表示偏移为0,从0000地址开始存储。接下来的00表示这条记录为数据。然后是3个字节的数据(02 21 D5)。再就是校验05。下一行为最后一行,数据部分长度为0字节,偏移固定为0000。这条记录为数据。01为HEX文件结束。再就是校验FF。结束HEX文件。
        HEX-386时,大部分与HEX-80一样,但是多了扩展线性地址部分,从而把寻址能力提高到16MB。比如以STC32G12K128单片机为例,它的ROM大小为128KB,分为2个区域各64KB:即FF开头的区域(范围从FF:0000到FF:FFFF),以及FE开头的区域(范围从FE:0000到FE:FFFF)。
        举个HEX-386的例子:

    :02 0000 04 00FE FC        (FE:区域)(首行)
    ……
    :02 0000 04 00FF FB        (FF:区域)
    :03 0000 00 023C00 BF
    :10 3C00 00 75E90075930075940075910075920075 C3
    ……
    :00000001FF        (末行)

    分析:首行02表示该行数据部分长度为2字节(00FE);386格式时,首行只指明了写入区域,整体会比80格式至少多一行。0000为偏移,04表示该记录及之后的记录均为扩展线性地址记录(386格式),00FE表示写入区域00FE:,跟偏移合起来就是00FE:0000地址。校验FC。中间记录省略。
    然后是“:02 0000 04 00FF FB”,写入区域00FF:,跟偏移合起来就是00FF:0000地址。校验FB。
    之后的记录兼容80格式,10(十进制为16)字节数据长度。3C00的偏移(也位于FF:区域),就是00FF:3C00地址。00表示这条记录为数据,紧接着的“75E90075930075940075910075920075”为数据。校验C3。
    最后一行是HEX文件结束。
        由例子看出386格式是分别保存两段区域的数据,当然STC32G12K128单片机的FE:区域可以作为EEPROM使用(如需使用EEPROM就在ISP下载软件里设置EEPROM的大小)。如果没有超出FF:区域,即使在KEIL C251里设置了HEX-386格式,也会自动生成80格式;超出才会自动保存为386格式。
        再谈谈HEX文件的合并。80格式简单,让偏移依次增加就行,每行的校验要正确(有些软件不检查校验字节的话随意填也行),以结束行结束即可。两段386格式的HEX文件合并成一个:
    1.两个源程序要相同主时钟;如果最短的程序初始化了硬件,另一个就可不用再初始化;分别成功编译与运行、生成HEX386格式文件。两个源程序的中断向量只可取长者,ROM偏移地址不可重叠(如果是汇编编写就可以通过ORG指定地址)。
    2.以最长的固件为基础进行修改。依次按照FE:区域、FF:区域以及按地址顺序,把HEX记录留一部分空位,然后把短的固件记录插进来。确保FE:区域、FF:区域分别只有一个,记录结束行也只能有一个,放在最后。
    3.把两个固件相连。修改长源程序结束部分,之前如果是死循环就改为跳转到短固件的开头LJMP(02xxxx)所指地址(比如短固件的21D5或者225E地址的下一行(比如:0200000400FFFB之后的:03000000023C00BF,在此处插入短固件)以及长固件的后面部分。丢弃短固件的首行(如果也是386格式还要丢弃第二行,如果是80格式就不用。比如:0200000400FFFB以及:030000000221D505),注意记录先后。校验和也记得修改。
        以上合并说的比较抽象,不懂也没关系,自己拿一个超过64KB的固件研究下就好理解了;而且大部分人也不需要合并操作,了解HEX的格式就好。


    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    前天 13:09
  • 签到天数: 115 天

    [LV.6]常住居民II

    25

    主题

    304

    回帖

    1049

    积分

    荣誉版主

    Cyber Hamster

    积分
    1049
    发表于 2023-2-1 18:00:52 来自手机 | 显示全部楼层
    好耶
    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 21:55
  • 签到天数: 133 天

    [LV.7]常住居民III

    13

    主题

    52

    回帖

    1374

    积分

    金牌会员

    积分
    1374
     楼主| 发表于 2023-2-1 18:02:14 | 显示全部楼层

    谢谢捧场。大佬升级得真快。:lol
  • TA的每日心情
    慵懒
    昨天 01:41
  • 签到天数: 135 天

    [LV.7]常住居民III

    1

    主题

    106

    回帖

    1885

    积分

    金牌会员

    积分
    1885
    发表于 2023-2-1 18:04:40 | 显示全部楼层
    不错

    点评

    感谢支持。  发表于 2023-2-1 18:08
    回复 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9428

    回帖

    1万

    积分

    管理员

    积分
    14003
    发表于 2023-2-1 18:22:17 | 显示全部楼层
    直接从 汇编爱好者 再次升华 穿越成 骨灰级 STC32位8051 机器码专家了
    ===也就我老师那个年代必须机器码/磁带机
  • TA的每日心情
    开心
    昨天 21:55
  • 签到天数: 133 天

    [LV.7]常住居民III

    13

    主题

    52

    回帖

    1374

    积分

    金牌会员

    积分
    1374
     楼主| 发表于 2023-2-1 18:33:30 | 显示全部楼层
    神农鼎 发表于 2023-2-1 18:22
    直接从 汇编爱好者 再次升华 穿越成 骨灰级 STC32位8051 机器码专家了
    ===也就我老师那个年代必须机器码/磁 ...

    感谢大佬支持!后续我会继续努力提高。:handshake
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-15 07:17 , Processed in 0.066035 second(s), 52 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表