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

SMT32的HEX文件里加入固件版本的方法

[复制链接]
STMCU小助手 发布时间:2021-8-9 14:20
本文介绍一个小技巧:使用MDK编译器,让STM32程序HEX文件中加入固件版本信息。) U0 X% l  {6 Z( e

) j/ V% K" v5 j, U. L6 c
# M- N) a: S$ P2 j' f
代码* y+ Y4 z% s: W! T
1 C) N4 y6 S0 v8 c3 S
( ^+ w. C" _( q) u+ z
    代码如下:7 n) o6 p: k& U6 n' X* L
  1. <font face="微软雅黑" size="3">//------------------------------------------------------------------------------( ]3 x3 _6 Z' q- y. ?* G
  2. #include <absacc.h>" r7 k; S2 N; h3 K5 z+ N
  3. 7 I- q! n' H4 K7 T
  4. //------------------------------------------------------------------------------
    9 C  @; m7 i, W3 t6 z! F' V9 z/ \7 M
  5. #define VERINFO_ADDR_BASE   (0x8009F00) // 版本信息在FLASH中的存放地址
    + A' s9 ]6 C1 B. M" M8 ~
  6. const char Hardware_Ver[] __attribute__((at(VERINFO_ADDR_BASE + 0x00)))  = "Hardware: 1.0.0";8 Q3 v( }. U. o3 f6 u
  7. const char Firmware_Ver[] __attribute__((at(VERINFO_ADDR_BASE + 0x20)))  = "Firmware: 1.0.0";
    5 |7 b4 B7 L. t$ V2 N" r" k+ M
  8. const char Compiler_Date[] __attribute__((at(VERINFO_ADDR_BASE + 0x40))) = "Date: "__DATE__;& X  Y( s5 S% i0 L. _6 ]4 E
  9. const char Compiler_Time[] __attribute__((at(VERINFO_ADDR_BASE + 0x60))) = "Time: "__TIME__;) f& [; m% Q: k" ~) g3 M
  10. 3 W$ |# M! z" x: z+ \
  11. //------------------------------------------------------------------------------</font>
复制代码
    写入到程序中:+ ~6 W0 i  |0 M  Y, D
0 m7 P  Z* e" K1 C  @
. t' t( L8 t& d7 Z/ Z+ y
1.png / Q8 o* h) Y8 f

+ x4 }# ~9 J) l( v; V! o
5 M+ @, [: Z, S' u# G
    选项配置中:Flash地址与大小不用做任何修改!
) |' f4 T& I$ X# C# n3 P. {
4 J" V. K4 E- N# N, b# m0 n
* P2 ~& B+ P' `6 _  ]/ P' w
2.png
+ \. k7 }1 s) @# F* H' ~. O) M+ B9 o
9 N1 O9 d( y: t( p# _% _6 @
    HEX文件:
$ ^  y9 c2 X# y* x; ]# R0 I# J# c
7 N  f0 l4 M  x7 r8 N$ `5 i

. h% i" _0 {" M& Y 3.png 2 R0 D( |# }  b; Q
. O6 G# t7 O  V% y) X. k
* c8 D8 b7 M0 H' R+ @
    串口打印输出:' o# W% S  o0 _" U- J
1 x8 S" a9 ?9 e1 h$ a$ F

6 @2 B: e# B9 I# O3 _  T; \, x$ k 4.png : S* g4 V) x- _9 B9 l+ u

* e0 ^: x8 O" c5 k; a0 [3 v
+ Z! G' @% R. o- S2 @! G: }7 y
上述方法的缺点: B$ Y! B0 o7 |+ c# f6 Q3 }$ }

, t9 w) O" I& a  x1 ^
8 |2 h9 h; R; ?/ Y9 E& D4 v! }
    上述操作可行, 但是有一个缺点:就是生成的bin文件都是满flash大小的, 造成每次烧录都是整个flash读写。7 ~! O( s9 e5 d2 g# w

6 `1 ?& M: |1 ]7 q7 h" {2 B
0 L" V+ [/ g' Q
    其实这个可以把存放地址放到前面,比如偏移1K的地方,都不用改指定地址。8 U  x) E% ^" _2 K8 M

* c5 \0 S6 T5 O  n0 R+ M

' j4 _1 y/ `- y! n    按照上述操作,程序末尾到VERINFO_ADDR_BASE地址这一段会被填充成0x00。根据需要可以修改VERINFO_ADDR_BASE减小地址,或者说不强制指定地址,由编译器自动分配,但这样就要去找相应的版本标识字符串了。* M& Q/ |! W* w

2 j7 u9 H  Y- |/ E* E( g& f/ @3 n) l6 p
! a% ]# M7 G( z- ?- E
优化方法% m( x; Z4 c7 W6 A, \
5 r7 w2 L/ c, h; Y
5 I+ l/ M7 R1 g6 e
    不想前面这一段被大量填充0x00,让HEX文件体积小一点的话, 可以把选项配置中Flash的Size改小一点,把VERINFO_ADDR_BASE设置成从FlashSize后面的空间开始,这样生成的HEX文件就小了,且未用空间就不会被大量填充0x00了。
' u/ k6 @- M1 }) ^; x1 E5 U, |+ j! c, p' K7 L/ x  ]

6 W- a  z, r+ G    方法如下:
7 T. Q- D* f& Y. e 5.png
# K+ F1 ?+ D, c. f4 V, e
4 S# V  J3 _" R$ u+ p+ C& I
赞 收藏 评论0 发布时间:2021-8-9 14:20

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版