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

在SMT32的HEX文件里加入固件版本信息

[复制链接]
STMCU-管管 发布时间:2021-6-23 16:59
本文介绍一个小技巧:% U0 C; p4 }/ z

8 L3 f4 K: J* O$ P3 x: v( _
# U) P2 K0 m) C
    使用MDK编译器,让STM32程序HEX文件中加入固件版本信息。' h2 ~& t8 p5 D! y) S% {
代码
! H* `0 F7 N+ I! f; z) b) H    代码如下:
+ V# J. }" `2 J9 D' u$ ~6 S+ Q7 W
  1. $ b9 a0 v& c- c3 X  ]4 m( l2 r, _
  2. //------------------------------------------------------------------------------
    8 L( z& @6 `7 @1 B9 G
  3. #include <absacc.h>* m7 v  U. `0 n' u0 h, C/ j
  4. 8 g* U& n# T8 i# P
  5. //------------------------------------------------------------------------------& y. ]& k& ?9 d8 a) `3 L
  6. #define VERINFO_ADDR_BASE   (0x8009F00) // 版本信息在FLASH中的存放地址
    : }0 G! E8 Z8 r4 E% }
  7. const char Hardware_Ver[] __attribute__((at(VERINFO_ADDR_BASE + 0x00)))  = "Hardware: 1.0.0";
    + s1 N0 V; ~9 l6 P  N
  8. const char Firmware_Ver[] __attribute__((at(VERINFO_ADDR_BASE + 0x20)))  = "Firmware: 1.0.0";$ Q" x! H& _3 X
  9. const char Compiler_Date[] __attribute__((at(VERINFO_ADDR_BASE + 0x40))) = "Date: "__DATE__;' O, b+ k0 X+ M- P1 P+ |' x
  10. const char Compiler_Time[] __attribute__((at(VERINFO_ADDR_BASE + 0x60))) = "Time: "__TIME__;; g$ G+ ~6 h8 Y4 ^
  11. $ A, k! `' J7 B. ?. N6 s
  12. //------------------------------------------------------------------------------
复制代码
  写入到程序中:
8 a/ r) o+ [: h 21.png - v, _4 A# q$ u# P- r' e
选项配置中:Flash地址与大小不用做任何修改!" ~' p; V. O" J" n) }
22.png
7 T" @5 w& h4 }$ Y7 \/ j% B   HEX文件:/ V4 @8 r- P" e( k- U: C- o# z
23.png
# R: x- N. ~: _3 h    串口打印输出:; w9 z5 w: _9 a& @" @
24.png " l6 g! b! ]6 Q5 |1 a& Y
上述方法的缺点
: r( D$ S8 u9 O% C  j& @- O& ~+ @( l7 P) L) e# C* @( j! s% S  C
: M; ?6 f8 y9 V3 c# r9 D
    上述操作可行, 但是有一个缺点:就是生成的bin文件都是满flash大小的, 造成每次烧录都是整个flash读写。
) l6 n3 Q; }3 m1 m' n    其实这个可以把存放地址放到前面,比如偏移1K的地方,都不用改指定地址。
  [: J4 H( C1 W7 F9 w1 m" X( _    按照上述操作,程序末尾到VERINFO_ADDR_BASE地址这一段会被填充成0x00。根据需要可以修改VERINFO_ADDR_BASE减小地址,或者说不强制指定地址,由编译器自动分配,但这样就要去找相应的版本标识字符串了。& a3 z* ~2 \$ w4 b) x: Z4 T
1 E+ d3 ?, v3 ]2 l- |( [
3 K/ X2 T. h1 ^
优化方法, K: g5 f6 a. G( E+ S: h, R+ f

" N4 G6 B. z% P4 p
& }2 V* r/ x# H( b" H
    不想前面这一段被大量填充0x00,让HEX文件体积小一点的话, 可以把选项配置中Flash的Size改小一点,把VERINFO_ADDR_BASE设置成从FlashSize后面的空间开始,这样生成的HEX文件就小了,且未用空间就不会被大量填充0x00了。% a# K4 z! e5 D# w, R4 Q
' Y- V" X+ I  P7 R

1 Q" K6 g7 R0 p" n( @4 ^$ K% O4 b    方法如下:2 y% }7 s1 h2 f
& M& g: @( W5 h6 U; p) [4 e, y
25.png 4 P9 C+ g( V* ^; `. H
1 F& k# I* L5 H$ T- {
赞 收藏 评论0 发布时间:2021-6-23 16:59

举报

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