你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

.hex 文件详解 stm32

[复制链接]
aimejia 发布时间:2018-5-23 16:16
本帖最后由 aimejia 于 2018-5-23 16:20 编辑 3 Z* Z$ x9 }+ q  Y( b; j
' }: O" Y: Q( Z
我们先来详细分析“方法一”的操作:
' R8 G9 S3 J& i' E( A1 {8 H( f, L6 R
/ l- ^0 P3 \' W+ K* S1.我们设置编译 程序的编译器(如图),这个设置意思是把程序下载到flash 的 0x0800 0000开头的位置,然后编译程序:
! k/ B8 f4 C" v1 I9 t" O
1.jpg
+ z  ~% S! J) c( D: y" B3 C6 X/ E7 X2 }9 @6 I6 W9 _, }; R
2.编译完程序后,在工程目录的output文件夹中找到编译后生产的.hex文件;8 O: f# m. k! e! T6 |8 q6 p

2 m2 J/ G; c4 z& w  \$ i: B用 notepad++  或者 UltraEdit 打开 程序 的.hex文件   
! U. d2 E7 _! ]8 [& t; s) ~" Q9 J2 g) V: R. Z/ V7 B1 \
hex文件格式:" v4 h0 W" e# z# }5 K  x
- {  v; L# N8 S
(1)以行为单位,每行以冒号开头,内容全部为16进制码(以ASCII码形式显示)3 k1 L1 H6 X& }# b; }1 n
, g. y; v  W2 B# v; b
(2)在HEX文件里面,每一行代表一个记录。记录的基本格式为:
" r1 O/ e2 T: H1 Q1 R& I# r/ [1 b; U$ c
4.png
$ I  _7 r) j  Y/ k, ^( d+ b, _- j! d  c) P
第一个字节 表示本行数据的长度;7 b% J) F! `. b, |  [. }0 Z
: a2 C3 h& D8 v; u
第二、三字节表示本行数据的起始地址;
% J7 Z6 h- U4 \5 B# R& C. q3 @$ D  R) R/ _. |$ F$ F1 u
第四字节表示数据类型,数据类型有:0x00、0x01、0x02、0x03、0x04、0x05。6 o0 G, d: l. j, ^) e
; c7 c: x$ [9 q; t2 i4 N4 f+ Y& d4 @% ~$ u
'00' Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录( c2 g7 l! x2 P% a# k6 L, k* D

  ?, [$ `1 N* h9 z7 t8 T'01' End of File Record:用来标识文件结束,放在文件的最后,标识HEX文件的结尾, ?7 \* V: A1 x# {
7 B. C# T5 F# E. e3 @
'02' Extended Segment Address Record:用来标识扩展段地址的记录
& I& T$ X& C8 L) Y* Z7 \
; z# K3 X5 d0 B; L: p'03' Start Segment Address Record:开始段地址记录' r9 X1 t- z* M. L1 D: H/ Q

3 ^" h+ g, _! z& u6 e" Q5 e. r'04' Extended Linear Address Record:用来标识扩展线性地址的记录7 v$ J% q" ^* T$ M3 g) ^

+ Z, [: K8 p$ U+ o'05' Start Linear Address Record:开始线性地址记录
3 H* k! N# j9 R4 ~0 |6 Y) M7 S' M% ?; _2 y5 Z( I
然后是数据,最后一个字节 为校验和。8 v* M# h) b- j

- Q" z8 v4 z, x6 h; I, n校验和的算法为:计算校验和前所有16进制码的累加和(不计进位),检验和 = 0x100 - 累加和) q6 q/ ]* e' e& g
9 I; t* y" [" v
打开.hex内容如下:(中间部分数据略去)& L3 m; ~8 A6 E3 N& ?
  1. [plain] view plaincopy
    1 V+ g( I  n, W' P2 S% \
  2. 2 [' `" c" G' y, S8 R& u% y
  3. <strong>:020000040800F2  
    0 m/ s8 L1 n6 U
  4. :10000000B80B00207D250008850300088703000841</strong>  
    * [0 b( G& P, Y2 n7 U
  5. :100010009B0300089F030008A303000800000000E2  . B1 j7 ]0 k/ e8 d- o. L. f
  6. :10002000000000000000000000000000A70300081E  7 L' u! [* A5 z& p; K0 ?
  7. :10003000A903000800000000AB030008AD0300089E  
    / [. C% y# ]7 c! a. Q' o
  8. 。  4 x$ Z3 T  O. K2 ]
  9. 。  % }7 Z" i3 ~. B* c: e
  10. 。  
    4 E& S5 B0 H/ ^9 F, i3 W" q9 H
  11. :102B40000400000000000000000000000000000081  
    8 V6 J6 m+ X0 v. E+ p* p8 \( Q7 W
  12. :102B50000000000000000000000000000000000075  
    5 C0 y" a( }% ^, A* M& n- M6 l0 P' `6 E
  13. :102B6000010203040102030406070809020406081F  
    - \' V  N) M+ S7 q' F7 ~
  14. :102B700000366E01000000000000000001020304A6  : A3 |5 h  e* I
  15. :042B80000607080933  
    6 Z" E! V+ R9 ^6 Y! U2 l& r' ^, [
  16. <strong>:0400000508000121CD  
    6 I  Z: r5 |0 \, _2 \
  17. :00000001FF</strong>  
复制代码
先分析第一条语句---- “:02 0000  04 0800  F2”) w8 k( u9 b( }; U) _* J
  V$ X, q, |, r  j
5.png ! ]# D, ?, B% b3 X4 {) Y& l- l
5 [$ ]; @0 t! N  B
在上面的数据类型后2种记录(04,05)都是用来提供地址信息的。每次碰到这2个记录的时候,都可以根据记录计算出一个“基”地址。对于后面的数据记录,计算地址的时候,都是以这些“基”地址为基础的。以我们的语句为例:" E! ?- }% G/ _3 E2 ]( e
第1条记录的长度为02,LOAD OFFSET为0000,RECTYPE为04,说明该记录为扩展段地址记录。数据为0800,校验和为F2。从这个记录的长度和数据,我们可以计算出一个基地址,这个地址为(0x0800 << 16) = 0x0800 0000 ,后面的数据记录都以这个地址为基地址。# K/ |. ~# ^% p

) f0 K" U& r' p第二条语句----“ :10000000B80B00207D250008850300088703000841”
& Z7 Y* v' S7 }% Y0 M7 {  P9 l5 k5 L
6.png
9 Y. S" j8 R4 y; u2 V
9 p8 k* C  F8 l8 P第2条记录的长度为10(0x10=16字节),LOAD OFFSET为0000,RECTYPE为00('00' Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录),数据为B80B00207D2500088503000887030008  校验码为41;此时基地址为:0x0800 0000  加上偏移地址:0x0000   这条记录的16个字节的数据的起始地址为:0x0800000 + 0x0000 =0x0800 0000* B9 Z8 D' W* A0 e1 \* v* N$ k# x
第3条语句----“:0400000508000121CD”
4 s+ [2 O9 E* }
- q6 A- x2 j! O5 i( n$ m' u4 X 7.png
) f- K" @# Z) l) t, Z, ^. c
" Z3 j7 ?0 L5 z0 [- J1 P  F5 T记录的长度为04,LOAD OFFSET为0000,RECTYPE为05 ,此时,EIP寄存器里存放的地址:0x0800 0121; 即IP指向下一个要执行的指令所在地址,我们来看一下IAP工程list目录下的.map文件,其中第393行处如图:
  F, l' l7 m9 F) J) {; j* G* w3 @; m8 h% ?$ B. I( o7 w& _! \
2.jpg
: v6 b" C- N  I' G. ^
6 C" _3 L! \9 g+ r4 l9 [2 aEIP是32位机的指令寄存器, IP是指令寄存器,存放当前指令的下一条指令的地址。CPU该执行哪条指令就是通过IP来指示的; B$ o" V0 I; V3 P: r8 G) r4 O

4 R; _8 x7 C! e. d8 [# b 3.jpg
: g  e& @7 y7 R# \/ D9 z* A/ G* b0 T# O/ p0 ]9 g
第4条语句---“:00000001FF”  (每一个.hex文件的最后一行都是固定为这个内容)6 z% E1 g' Y8 }% f

' u9 S8 N7 u5 x9 d, n 8.png 7 v9 n- e& z' x% F3 w' y0 [$ m
* n* m# F3 O* K. W! o
(每一个.hex文件的最后一行都是固定为这个内容)* b% B" s, l' g8 q0 E( L, Y" }4 d
记录的长度为00,LOAD OFFSET为0000,RECTYPE为01  (01' End of File Record:用来标识文件结束,放在文件的最后,标识HEX文件的结尾)( l! _+ h, s2 E$ n- L1 p- D

8 X1 A. |3 }' B8 R; t/ R+ A: a6 `! g+ u, B8 N& i) L6 H

% m  H% M0 a8 \; ?2 ~' ~6 v( L+ c8 I7 D0 D: o; K

; {' j& S/ u3 Q; S5 g" `6 d转载自yx4 g5 Z# {( C. Q  I8 Y. r! Y- t

* G3 u" E: ?6 N5 v& t& p" t% l+ R9 N7 _  e% I+ z) X! y
赞 收藏 2 评论2 发布时间:2018-5-23 16:16

举报

2个回答
xiajintaord 回答时间:2018-5-24 09:25:19
厉害厉害,但是有什么实际的用处吗?难道可以反推出代码
Veiko 回答时间:2020-11-12 15:40:03
谢谢分享, 关于05记录【开始线性地址记录】的说明对我帮助很大, 这样看来我们如果自已做这bin文件转hex的时候这条记录可以不用加了对吧, 一个是现在的ARM内核MCU用不到, 二一个是自已转换好像也没有参考数据
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版