我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 561|回复: 3

单片机开发中 ECU HEX文件的解析

[复制链接]

该用户从未签到

4

主题

2

回帖

0

积分

一级逆天

积分
0

终身成就奖

发表于 2022-2-23 21:17:33 | 显示全部楼层 |阅读模式
单片机开发中 ECU HEX文件的解析

一、HEX文件说明
Hex文件是ASCII 文本文件,HEX文件包含单片机使用的程序和数据,可以被烧写到单片机MCU中,生成Hex文件的方式有许多种,技术人员可以通过不同的编译器(如CodeWarrior)将C程序或者汇编程序编译生成hex。

CodeWarrior工具
Hex文件可以通过记事本打开。在详细讲解格式之前,我们首先来看一个工具HexView(可在网上下载不同的版本,但是作者推荐使用vector的HexView工具,功能强大)。

HexView工具
1、行记录
HEX文件每行的ASCII数据作为一个记录-行记录,由16进制数据组成。并且每行数据包含5个不同的域。

Hex文件数据格式
(1):-- 每个行记录都以冒号作为开始;
(2)LL -- 表示当前行记录的数据长度(1个字节),表示当前行当中的数据域(D.D)字节长度,可为0x00;
(3)aaaa -- 地址域,根据TT域的不同分别代表不同含义,地址字节为2个字节,最大只能表示64K(2)的数据大小。;
(4)TT -- 当前行记录的类型(1个字节),可能的值为:0x00(数据记录)、0x01(HEX文件结束记录,在最后一行)、0x02(扩展段地址记录)、0x03(开始段地址记录)、0x04(扩展线性地址记录)、0x05(开始线性地址记录);
(5)DD -- 行记录的数据域,其字节长度域LL对应,可为空,长度不定;
(6)CC-- 校验和(1个字节),校验和= 0x100 - (累加和%100),其中累加和为LL、aaaa、TT、DD四个域的相加的结果;
2、行记录类型
下面将对TT的行数据类型进行详细解析:
(1)0x00-数据记录
:20000000005A000108FC06000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B,上面的数据的不同含义可转换为:(开始)20(数据长度为32个字节或64个字符)0000(偏移地址)00(记录类型)005A000108FC06000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF(数据域)8B(校验和),后面会举例详细讲解。
(2)0x01-结束记录
:00000001FF,数据的不同含义可转换为:(开始)00(数据长度为0)0000(偏移地址,无意义)01(记录类型)(无行数据)FF(校验和)。
每个文件的该记录是必然存在的。
(3)0x02-扩展段地址记录
:020000021200EA,数据的不同含义可转换为:(开始)02(数据长度)0000(偏移地址,无意义)02(记录类型)1200(数据域)EA(校验和)。
那么存储器的绝对存储器地址=0x1200<< 4 = 0x120000。可参考后面的详细讲解(与0x04类型相似)
(4)0x03-开始段地址记录
此记录类型使用很少,不做解释
(5)0x04-扩展线性地址记录:0200000408FCF6,数据的不同含义可转换为:(开始)02(数据长度)0000(地址域,无意义)04(记录类型)08FC(数据域)F6(校验和),这行的数据就是随后数据的基地址。
由于地址字节为2个字节,最大只能表示64K的数据大小。当一个HEX文件的数据超过64k(2^16)的时候,文件中就会出现多个扩展线性地址记录。后面会举例详细讲解。
(6)0x05-开始线性地址记录
:040000050800018965,数据的不同含义可转换为:(开始)04(数据长度)0000(地址域,无意义)05(记录类型)08000189(数据域)65(校验和)。
开始线性地址记录就是函数的入口地址。
3、校验和的计算
(1):00000001FF,累加和=0x00+0x00+0x00+0x00+0x01=0x01, 校验和= 0x100 - (0x01%100)= 0xFF。
(2):0200000408FCF6,累加和=0x02+0x00+0x00+0x04+0x08+0xFC=0x10A,校验和=0x100 - (0x10A%100)= 0x100-0x0A=0xF6。
4、数据文件解析示例

HEX数据文件前5行
请看下面的数据记录,取其前三行数据进行分析,
:0200000408FCF6 //数据记录的绝对存储器地址高16位为=0x08FC<<16=0x08FC0000
: 2000000005A000108FC06000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B
:20002000DEADBEEF0000000000000000000000000000000000000000000000000000000088
第一行记录类型为扩展线性地址记录,基地址是0x08FC,第二行是数据类型,里面的地址值是0x0000。那么数据05A000108FC06000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF(共32个字节)要写入FLASH中的地址为 (0x08FC<<16) + 0x0000,也就是写入FLASH的0x08FC0000这个地址;第三行的数据写入地址为0x08FC0020。
由于地址字节为2个字节,最大只能表示64K的数据大小。当一个HEX文件的数据超过64k(2^16)的时候,文件中就会出现多个扩展线性地址记录。
二、HEX文件的代码解析
前面已经详细描述了HEX文件的格式,下面将会从代码编写的角度,提出几个文件解析会遇到的难点或注意不到的问题
(1)HEX数据文件的Block非连续排列,例如HEX文件存在三个block,分别为block1、block2、block3。但是在文件中的排列并不一定是block1-block2-block3,而可能是block1-block3-block2;
(2)刷新到控制器的时候的顺序可能并不是按照block的顺序进行的,如HEX文件存在block1、block2、block3,那么控制器刷新的时候可能是按照block3-block1-block2进行的;
(3)HexView解析到的数据并不一定要全部刷入控制器中,如HEX文件存在block1、block2、block3,控制器只需要输入block2和block3即可。
回复

使用道具 举报

  • TA的每日心情
    开心
    2024-9-22 10:32
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    16

    主题

    577

    回帖

    262

    积分

    二级逆天

    积分
    262

    终身成就奖

    发表于 2022-2-23 21:25:49 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    6699

    回帖

    4

    积分

    二级逆天

    积分
    4

    社区居民终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    QQ
    发表于 2022-2-24 06:56:22 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    5

    主题

    3820

    回帖

    0

    积分

    PADS20220105初级班

    积分
    0

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    发表于 2022-2-24 08:20:30 | 显示全部楼层
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    论坛开启做任务可以
    额外奖励金币快速赚
    积分升级了


    Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

    本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

    平平安安
    TOP
    快速回复 返回顶部 返回列表