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

【经验分享】在SMT32的HEX文件里加入固件版本信息

[复制链接]
STMCU小助手 发布时间:2022-3-13 19:37
使用MDK编译器,让STM32程序HEX文件中加入固件版本信息。
( ?' a# O$ `1 b& G/ ]) L  u) d& Z4 }( _4 j% L
代码
2 f' o! a, f  q" C代码如下:
2 ^1 C$ d, f/ b/ ~
  1. //------------------------------------------------------------------------------) H; W: r$ h  P$ a% u2 _& D. P+ [
  2. #include
    ! u, a: f9 k1 C+ L3 x

  3. 7 Z- e  \) b, a+ s
  4. //------------------------------------------------------------------------------/ N4 d9 q4 U0 s3 l: b4 c
  5. #define VERINFO_ADDR_BASE   (0x8009F00) // 版本信息在FLASH中的存放地址' K% d8 p6 q! r  {0 `# b
  6. const char Hardware_Ver[] __attribute__((at(VERINFO_ADDR_BASE + 0x00)))  = "Hardware: 1.0.0";; P+ \7 [9 H$ K+ X2 t
  7. const char Firmware_Ver[] __attribute__((at(VERINFO_ADDR_BASE + 0x20)))  = "Firmware: 1.0.0";
    ) P3 U: U- \3 E  G9 R
  8. const char Compiler_Date[] __attribute__((at(VERINFO_ADDR_BASE + 0x40))) = "Date: "__DATE__;4 C/ O: J7 G9 q% c% l
  9. const char Compiler_Time[] __attribute__((at(VERINFO_ADDR_BASE + 0x60))) = "Time: "__TIME__;5 a$ S6 V1 u" K+ Q4 z
  10. ' b% W* H6 X; Q7 q- W
  11. //------------------------------------------------------------------------------
复制代码

; T! e$ N+ b" h8 P9 C/ D写入到程序中:
5 v: G1 z) v4 m8 r" v/ {3 V  p$ m$ f/ X5 G7 _4 ]; C
QJ]8`ABJKW]D%WQ8TH6AUE1.png $ \: p5 m0 A- f+ ~& h3 Q( ?

, K8 ^7 L8 J4 @  p( A4 s3 y选项配置中:Flash地址与大小不用做任何修改!5 u7 z0 K: W$ H* N- E1 z9 R

/ Z! y1 M" Z7 e7 ~3 [5 K% o! k K1V9WTXK9O(OR1}[P2XU}7D.png
1 x( w9 ^. A( Y  O8 a* T# |7 W
0 U3 z. }3 A+ ]: z" BHEX文件:+ F5 L1 t1 |4 G. |7 v* x
* z) t2 {, a: H5 ?7 W6 U
85(1BWLV818LLNF]S6L)X6P.png
3 o1 S$ t6 x6 N" g
' B/ Y! ]% e0 v串口打印输出:9 I/ X* u; Y- _- H

+ Y# t0 V$ @2 M3 O, U7 A& m/ R2 \ YPDJLECCM43]]0R9%{)@@48.png
. \4 A/ i  [, `+ m8 ~+ _6 j1 |4 U) I6 c
上述方法的缺点
3 y  s4 I% G* f* A& L8 o上述操作可行, 但是有一个缺点:就是生成的bin文件都是满Flash大小的, 造成每次烧录都是整个Flash读写。相关文章推荐:STM32单片机中Hex、Bin文件的区别与应用。
. `" o$ e3 j2 u3 r/ s5 G4 P其实这个可以把存放地址放到前面,比如偏移1K的地方,都不用改指定地址。
$ B- e( Q, S8 Q- {! U* o$ o按照上述操作,程序末尾到VERINFO_ADDR_BASE地址这一段会被填充成0x00。根据需要可以修改VERINFO_ADDR_BASE减小地址,或者说不强制指定地址,由编译器自动分配,但这样就要去找相应的版本标识字符串了。! y3 L2 W, i0 P) F9 h( c: |, q
优化方法
8 `& R) B7 |; a8 q9 H不想前面这一段被大量填充0x00,让HEX文件体积小一点的话, 可以把选项配置中Flash的Size改小一点,把VERINFO_ADDR_BASE设置成从FlashSize后面的空间开始,这样生成的HEX文件就小了,且未用空间就不会被大量填充0x00了。
0 `. _, d0 _) `  _9 H3 `2 Q1 R方法如下:1 }: S4 `- a* E, h
) e' _& ]3 ~( V& z8 ]
( g; G/ e+ |# U6 ~
3]6D9N%TE{}1EKHMO_8GNQI.png   E# q6 k0 P$ U% t* w7 M/ V
2 f$ b$ v; A# Y- Z' C5 [% i
+ a4 q5 D9 U  O3 Y
赞 收藏 评论0 发布时间:2022-3-13 19:37

举报

0个回答

所属标签

相似技术帖

官网相关资源

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