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

【经验分享】stm32 IAP + APP ==>双剑合一

[复制链接]
STMCU小助手 发布时间:2022-5-23 22:00
扩展-IAP主要用于产品出厂后应用程序的更新作用,考虑到出厂时要先烧写IAP  再烧写APP应用程序要烧写2次增加工人劳动力基础上写了“STM32 IAP+APP ==>双剑合一”链接稍后发,希望通过IAP程序的hex 文件 和 APP的hex文件 合成一个hex  或者把合成的hex文件转成.bin 文件 减少“体力”)
* M* T; W7 h. |1 W  d/ S; b# l5 L( S% A; Y0 p) N( N. x
& l/ a0 C6 p! ^
一、简单框架介绍
, U( i- G5 ]) d6 P0 |2 @# J9 u' Z2 b' k) y2 K/ M
1、stm32内部flash起始地址:0x0800 0000 -- 0x0802 0000 ,其中 从 0x0800 0000开始位置存放IAP 升级程序,  从0x 0800 3000开始的位置存放APP应用程序[ 而APP中的中断向量表放在0x0800 3000地方,更重要的是中断向量表的第1项存放的是栈顶地址,第二项放的是”复位中断“ ]
/ w" X, R8 r; j8 M1 W7 W8 O! Q
5 L( G1 A. @7 v DCVYNM()T8R0O8}Q0`[8$HH.png + H7 B$ w& u/ M8 C

. `* i- M' T4 H% o二、IAP +APP 结合的方法

! Q6 p7 j. ]4 X: h2 @+ L+ J9 B* l+ }1 ]3 _2 h! p
IAP 和APP 的hex 文件合成1个hex 文件的方法有2种:* `/ {- M3 m9 }7 U# Z" g! Q

- q# ]8 o3 w! m  E(1)  "简单1+1"    6 y' m, [6 U  v: @* w- E
8 Q- L2 G8 U7 Y
(2) IAP 先烧写进flash 的 0x0800 0000 开始位置,  APP烧写到 flash  的0x 0800 3000开始的地方; 之后通过我上一篇博文的 IAP程序的文件读出功能读取flash 上的数据读到一个.bin文件上;" `. L' Q1 Y/ V5 g( U
! Q' C: }9 _. D
0 o; @) w* {9 z  K
我们先来详细分析“方法一”的操作:
& q5 ^) `" W" G3 r0 Z4 A
2 j& Y6 x6 Q5 [1 c, o8 N8 @1.我们设置编译IAP程序的编译器(如图),这个设置意思是把IAP程序下载到flash 的 0x0800 0000开头的位置,然后编译程序
  Q8 P# w5 r* D5 ?
: a7 x5 t+ z! {% {& l! r- c @N}([G413H[IPV9@~R5(F%O.png 2 D6 k$ j  E5 C
# E5 i: Z9 y; W* x
2.编译完程序后,在工程目录的output文件夹中找到编译后生产的.hex文件;0 ]( J& u1 w  q; l# B! O, G

3 y; r' C) r& `" b用 notepad++  或者 UltraEdit 打开  IAP 的.hex文件   和APP 的.hex 文件 ,  (顺便问一下.hex文件格式你会看吗?)
8 m& q% O  V. r' |9 W7 \. h% g# E! T# ~$ q+ [9 M* ^2 F( z
hex文件格式:3 r3 j, K. {* s5 i& G/ B8 N
) @) P# N; R+ \5 C2 _: v
(1)以行为单位,每行以冒号开头,内容全部为16进制码(以ASCII码形式显示)' [8 t' j4 ]2 [
  y. l  H; x: L8 J9 |

, Q) n3 t# J5 ^* J; N$ `  o(2)在HEX文件里面,每一行代表一个记录。记录的基本格式为:
% ]: A. s) k) g8 r
) p4 v$ W3 p: Q8 _: Y/ f5 l% b) T I@%MNKYT%4P0W18O(OGO85D.png
  v. j, E) ~& [8 X! I                                             
, G) A' h7 T2 N  ~. Y4 U# x                                             
5 S/ F8 o4 w( O+ }3 N. F第一个字节 表示本行数据的长度;! }; W( ~1 [6 T- }, K6 I

+ W9 z8 C- {) S第二、三字节表示本行数据的起始地址;1 C5 T7 Y4 H7 m( v3 `/ d

2 K+ v. j4 t! R3 E( ~第四字节表示数据类型,数据类型有:0x00、0x01、0x02、0x03、0x04、0x05。# A/ u% A8 O+ R( @3 b: t
2 I" X+ z7 ~1 g8 y3 ^7 ~# h
'00' Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录- m" [, i: `2 r  [" h* n
2 B# V5 Y3 ?  k1 C8 G8 J' k) S
'01' End of File Record:用来标识文件结束,放在文件的最后,标识HEX文件的结尾
. M; W# y* s% {& q5 U8 J; V' l% @- I2 }
'02' Extended Segment Address Record:用来标识扩展段地址的记录$ |4 p5 c/ d( ]) Y& q$ f6 u
" X, C4 {+ C5 V! S3 P5 |4 G9 ^
'03' Start Segment Address Record:开始段地址记录' l% m* x8 `9 j, f/ J3 i

; f' s/ `- x/ l! r% v% R'04' Extended Linear Address Record:用来标识扩展线性地址的记录
' C( S$ ]+ ]" A. b/ c" o1 Q; E# w: f) O
'05' Start Linear Address Record:开始线性地址记录- A4 h$ Q3 Y. G1 C( }
( S7 `$ n# ~& z& T% M/ w) Q
然后是数据,最后一个字节 为校验和。* l$ c6 u3 G# _; i) p

; \4 g2 p7 x8 T# K4 R校验和的算法为:计算校验和前所有16进制码的累加和(不计进位),检验和 = 0x100 - 累加和  E* w/ Q2 r8 J/ q
0 I/ l( J/ w, ?9 g# I
打开.hex内容如下:(中间部分数据略去)
, ]! N$ R  R+ {4 @2 c! |
, G  G# }, p( H0 W% C<strong>:020000040800F22 I, f: K, _: V. k+ M( ~$ S
:10000000B80B00207D250008850300088703000841</strong>. w5 A% }: f5 [
:100010009B0300089F030008A303000800000000E2% m, ?. N( s  y) C% O4 q
:10002000000000000000000000000000A70300081E4 e3 S9 N* u( l0 A  J' ]" S
:10003000A903000800000000AB030008AD0300089E4 }6 a: {* ], v9 Z4 z. h) B! K4 C3 Y

, [: p/ R+ J5 h7 h- z" K, c, A3 u/ w5 [- ~6 {( p" M  B. N3 \

8 O; M* H0 [# U# g6 n- [7 K% h: A$ ]:102B400004000000000000000000000000000000814 a9 q: n- T5 H( W) J& n
:102B50000000000000000000000000000000000075/ ]# l: i' w- d/ e+ ]
:102B6000010203040102030406070809020406081F; Q1 i9 M6 i. N- }. F5 O
:102B700000366E01000000000000000001020304A67 m% y' u8 m! M9 e# H( c4 I
:042B80000607080933; E( r& O0 o* L5 T5 J
<strong>:0400000508000121CD
; t0 \: B1 y; ?:00000001FF</strong>
' l! [( ~) n5 `0 y/ A& q
9 v8 S; H  ~& o5 m* T# E先分析第一条语句---- “:02 0000  04 0800  F2”# n; e# F8 f! s) S

/ f4 u8 c7 b0 B7 Y$ V+ A4 f JR{){$AWM@Y0PZNCJ6[`$GS.png       , z& f3 ]! ]) h) h# C( e
                  
/ }; r, T" i! j! `  c# g* u& K1 v$ q  w在上面的数据类型后2种记录(04,05)都是用来提供地址信息的。每次碰到这2个记录的时候,都可以根据记录计算出一个“基”地址。对于后面的数据记录,计算地址的时候,都是以这些“基”地址为基础的。以我们的语句为例:
) g7 [( O$ c  k" R7 K; O第1条记录的长度为02,LOAD OFFSET为0000,RECTYPE为04,说明该记录为扩展段地址记录。数据为0008,校验和为F2。从这个记录的长度和数据,我们可以计算出一个基地址,这个地址为(0x0800 << 16) = 0x0800 0000 ,后面的数据记录都以这个地址为基地址。
# M0 ~% X# T! u+ j7 f( r) ]! A
( n& p' u* [' j' r( B* x第二条语句----“ :10000000B80B00207D250008850300088703000841”( P1 ]* }/ s/ R  f
5BZK310LB87U5]_`V44SCRT.png 9 h; A( E( u0 R/ d/ X! y. y, q) `
4 j- R! g- p% u, A5 }% i$ k
第 2 条记录的长度为 10(0x10=16字节) , LOAD OFFSET 为 0000 , RECTYPE 为 00('00' Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录) ,数据为B80B00207D2500088503000887030008   校验码为41;此时基地址为:0x0800 0000  加上偏移地址:0x0000   这条记录的16个字节的数据的起始地址为:0x0800000 + 0x0000 =0x0800 0000/ W7 X" ~2 l& e, l# h
第3条语句----“:0400000508000121CD”
( u5 i+ ]  `6 ]$ X1 _, A
& a$ h5 d% L6 N( ` }]B1UX%~P4LQZCABF7$YC12.png
" N) S$ F8 H. V4 v, ^$ r% `
9 Y& F3 a) C5 h8 Y8 i8 a记录的长度为 04 , LOAD OFFSET 为 0000 , RECTYPE 为 05 ,此时,EIP寄存器里存放的地址:0x0800 0121; 即IP指向下一个要执行的指令所在地址,我们来看一下IAP工程list目录下的.map文件,其中第393行处如图:(看到没?0x0800 0121值main函数的入口地址)* w& e' S" t; ?& A

: m5 o* _0 z" y6 @) A. H; x G{}ZC_NNZ(F3``N]TRXQF49.png 7 T' n3 k$ M) A1 e$ j
$ Y0 B7 M8 w( Q
EIP是32位机的指令寄存器, IP是指令寄存器,存放当前指令的下一条指令的地址。CPU该执行哪条指令就是通过IP来指示的
1 H1 h! p2 o* q% D, g6 Z* V
% W, ]3 ?$ X# t( A2 x2 v E2E{){GW(`LTNAJTTK4PX`5.png + u7 G+ w9 _3 ?
6 A) o5 c  W8 @, U3 K) p3 e

9 f9 ]* ^0 p' ~9 U- U第4条语句---“:00000001FF”  (每一个.hex文件的最后一行都是固定为这个内容)
* J3 K) W0 O+ G# K/ \# F: i1 C0 P; y" p
SJJ735)({RX%N{N)WGLDR[U.png
3 E: D! b) U4 }) O" F) X9 ?8 v! s! s! D5 ^
(每一个.hex文件的最后一行都是固定为这个内容)
: u9 |* I1 ?% n记录的长度为 00 , LOAD OFFSET 为 0000 , RECTYPE 为 01   ( 01' End of File Record:用来标识文件结束,放在文件的最后,标识HEX文件的结尾)7 ~" n* {: q* H% D2 v% T% q
/ E$ R4 A+ P$ I, T* T3 N, Q' f
三、iap 和app  的.hex 文件结合
" s  h; [8 G: q8 k& f3 `9 z2 w! P5 C0 z# C; A
操作1:设置编译IAP程序的编译器(如图),这个设置意思是把IAP程序下载到flash 的 0x0800 0000开头的位置,然后编译程序,生产.hex文件;
9 Q2 L2 z8 n' {, e+ F# B" \, m4 G' Z* T/ }8 o
9694A03NI0]2E2K5{V]@5`F.png
2 c- h$ k% x- G% N0 y0 B3 e) T, \' }: K
7 p3 [* g1 j. _: h# Q! R
操作2:设置编译APP程序的编译器(如图),这个设置意思是把APP程序下载到flash 的 0x0800 3000开头的位置,然后编译程序,生产.hex文件;2 Q1 M# x. _. I8 D$ }- B
: u8 e0 U, N. n
8V%{U6CJLHN`WXLBC4TIETT.png * J3 G4 q9 c8 |+ q* A
4 r( S- `  u/ ~: W! g8 [. o
操作3:用 notepad++  或者 UltraEdit 打开  IAP 的.hex文件   和APP 的.hex 文件5 x+ C7 z! g! A/ }0 r2 p
: ~( ^5 E* C. p# i- l, H' |
把IAP的.hex 最后一句结束语句去掉(即:删除:00000001FF)) F9 Q6 T6 O0 l% w7 F# H1 T& }

( {3 a: f7 m9 y. {) k把APP的.hex 全部内容拷贝复制到 刚才删掉结束语句的 IAP的.hex后面(如图)2 v" Y0 R- C7 K& ?/ F. C

  V0 e( J  X5 ~原来第701行为 :00000001FF 的结束语句. J% y) E/ v" v, k0 l

( E8 }( a6 S. {. l0 J 2{C0U{BWTMOZUZ@%N5Y]VGK.png
% t5 j- p3 X  u! G  G2 o& M5 A0 {3 h* ?+ g$ P  n" G. O
操作4:把两个.hex合成的.hex文件重新命名,烧写到0x0800 0000 开始位置的地址即可;
- U$ T* q+ v2 f; U8 u# }  \2 a6 V6 ]
这里把 合成的.hex文件上传到我的资源:http://download.csdn.net/detail/yx_l128125/6475171(必须把PB1管脚拉低,串口1连接超级终端才能看到升级程序的引导信息):, ?) s6 Q6 R4 O& R2 t, X& C2 n

% c; ~% Y- d/ k% U% V0 r5 E% a/ \6 f" M+ @' n: o

) p; G) l: U( \; j& [4 w
收藏 评论0 发布时间:2022-5-23 22:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版