number007cool 发表于 2011-8-18 14:35:04

有谁自己写过烧写hex文件的上位机程序软件,对hex内部数据格式组成比较熟悉的?

为什么有的编译器生成的hex文件一开始就是:020000040100F9,
(02表示数据只有2个字节,0000表示地址,04,说明该记录为扩展段地址记录,0100是数据,f9是校验码)
只有在原有的地址位(2byte)用完,即有效数据位达到64k后,才会出现020000040100F9这种类型的数据啊。
在hex文件最开始的地方是不会出现扩展段地址记录的?!
下面是一个hex文件开头的几行:
:020000040100F9
:100000007CA09FE52F0AB0E10AA6A0012AA6A001C4
:10001000FF1BBAE8FF03ABE80CF0A0E10080A0E30F
:1000200090909FE5FF00B9E8FF00A8E83F00B9E81D
:100030003F00A8E80107A0E3DFF021E300D0A0E142
:10004000010B40E2D1F021E300D0A0E1010B40E23E
:1000500052F021E300D0A0E1020A40E2D7F021E310
如有大侠曾经写过烧录软件,或者对hex文件内部格式比较熟悉,不妨赐教!

dr2001 发表于 2011-8-18 14:38:40

HEX文件格式请Google。
剩下的就没问题了。

cheungman 发表于 2011-8-18 15:19:16

这个嘛, google找资料研究一下hex格式即可. 网上搜到的一些hex to bin软件, 很多都是只支持64K的.

当一个扩展线性地址记录被读到后,扩展线性地址记录的数据区域将被保存
并应用到后面从Intel HEX文件中读出的记录,这个扩展线性记录一直有效,
直到读到下一个扩展线性记录.

绝对内存地址 = 数据记录中的地址 + 移位后的扩展线性地址

:020000040100F9                                    //04表示线性扩展地址, 扩展线性记录起始, 地址是0x0100
:100000007CA09FE52F0AB0E10AA6A0012AA6A001C4      //此时的地址就是0x 0100 0000
:10001000FF1BBAE8FF03ABE80CF0A0E10080A0E30F      //此时的地址就是0x 0100 0010
:1000200090909FE5FF00B9E8FF00A8E83F00B9E81D      //此时的地址就是0x 0100 0020
:020000040100F9                                    //04表示线性扩展地址, 扩展线性记录结束

number007cool 发表于 2011-8-18 15:24:29

回复【2楼】cheungman
-----------------------------------------------------------------------

多谢!

HadesHe 发表于 2011-8-18 19:06:59

回复【楼主位】number007cool
-----------------------------------------------------------------------

你想要修改它?不难的...

number007cool 发表于 2011-8-18 19:22:27

回复【4楼】HadesHe
-----------------------------------------------------------------------

我要提取它里面的数据,然后写入flash

cheungman 发表于 2011-8-18 21:48:29

回复【5楼】number007cool
回复【4楼】hadeshe   
-----------------------------------------------------------------------
我要提取它里面的数据,然后写入flash
-----------------------------------------------------------------------

如此说来, 楼主是想做IAP.

flor 发表于 2011-8-18 21:56:24

百度或Google吧,都忘了

wuxi_stl 发表于 2011-8-18 22:40:11

写BIN文件,要简单些

number007cool 发表于 2011-8-18 23:09:14

回复【8楼】wuxi_stl
-----------------------------------------------------------------------

但是上位机那边似乎打开bin文件有点困难?
如果有好的建议,不妨提示下!
现在上位机打开hex文件是以打开写字板的方式操作的。

number007cool 发表于 2011-8-18 23:11:33

回复【6楼】cheungman
-----------------------------------------------------------------------

是的。
现在遇到了一个很麻烦的问题。
就是应用程序下载成功后不知道怎样从boot程序跳转到下载后的应用程序区。
不知阁下是否有所高见,谢谢!

cheungman 发表于 2011-8-18 23:32:19

#define USER_APP_ADDR    0x0800                //定义用户程序位于0x0800起始的地址上
(*((void(*)(void))USER_APP_ADDR))();         //进入更新后的用户程序

number007cool 发表于 2011-8-19 08:41:35

回复【11楼】cheungman
-----------------------------------------------------------------------

这种方法不行,我试过无数次,不能正确跳转到制定flash区段正确执行。
说明一下,我用的是ARM7TDMI核,用EBI总线对RAM和外部外接FLAHS统一编址。软件环境是:iar 4.3
我还有另外的两个帖子,你可以看下!希望给点好的建议!
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4955814&bbs_page_no=1&search_mode=3&search_text=number007cool&bbs_id=9999

http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4968750&bbs_page_no=1&search_mode=3&search_text=number007cool&bbs_id=9999
貌似还要重新出事化堆栈之类的.......................................

number007cool 发表于 2011-8-19 08:49:49

回复【11楼】cheungman
-----------------------------------------------------------------------

你这段c程序的反汇编代码如下:
MOV R0,0X0800
BXR0

cheungman 发表于 2011-8-19 09:21:21

这代码我曾在PIC上用过, 是没问题, 并且用asm指令: goto 0x0800也可以.
ARM7TDMI核未研究过, 暂无好的建议给你, 抱歉.

number007cool 发表于 2011-8-19 10:52:01

回复【14楼】cheungman
-----------------------------------------------------------------------

恩,还是要多谢你!
搞了这么久,就剩这一步了,真不希望功亏一篑啊。

shuxmpx123 发表于 2014-3-14 23:22:32

cheungman 发表于 2011-8-18 15:19
这个嘛, google找资料研究一下hex格式即可. 网上搜到的一些hex to bin软件, 很多都是只支持64K的.

当一个 ...

你好,请问 Hex文件结束的时候
:107FD0001AFF0101102D0102030404000900060725
:087FE000080902040608000074
:04000005080021517D
:00000001FF
这个 05类型的数据起到什么作用呢, 网上查到解释是
'05' Start Linear Address Record:开始线性地址记录
但是我理解不了,比如我写烧录软件,这条数据要怎么处理?

justdomyself 发表于 2014-3-15 08:27:12

shuxmpx123 发表于 2014-3-14 23:22
你好,请问 Hex文件结束的时候
:107FD0001AFF0101102D0102030404000900060725
:087FE0000809020406080000 ...

你直接用bin文件就什么问题都没有了

cheungman 发表于 2014-3-15 09:27:53

shuxmpx123 发表于 2014-3-14 23:22
你好,请问 Hex文件结束的时候
:107FD0001AFF0101102D0102030404000900060725
:087FE0000809020406080000 ...

"05"未深入了解, 看了以前代码也未做处理, 好多年前做过的项目, 已经忘记得差不多, 抱歉...

shuxmpx123 发表于 2014-3-15 10:55:49

cheungman 发表于 2014-3-15 09:27
"05"未深入了解, 看了以前代码也未做处理, 好多年前做过的项目, 已经忘记得差不多, 抱歉... ...

谢谢,已经帮到我了,我也不做处理就好了~

江湖中已没了哥 发表于 2014-3-30 18:16:44

前段时间刚刚写过bootloader,对于hex文件中的扩展地址,其实你可以不用它,一般来说程序是存放在flash的连续地址上,所以,你在IAP中,将接收到的数据按照字节大小顺序写到flash就不会出错。扩展地址,可以直接忽略。唯一我觉得扩展地址的作用的是校验flash的地址和本行hex文件地址是否相同?但是有了前面顺序写flash的理论,这个校验我觉得也可以不写,直接用hex文件最后一字节的校验位进行校验和的校验就行了!
页: [1]
查看完整版本: 有谁自己写过烧写hex文件的上位机程序软件,对hex内部数据格式组成比较熟悉的?