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

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

[复制链接]
STMCU-管管 发布时间:2021-6-23 16:59
本文介绍一个小技巧:
2 c, H$ @) n. W7 R: }) N0 [! i
  X1 O8 z: i% P$ S, O' x- O
! P+ G7 x# x: x& H5 Q
    使用MDK编译器,让STM32程序HEX文件中加入固件版本信息。- s6 d1 h4 B+ g6 F* h
代码
# y* s- A1 V& V" k5 X7 p6 V    代码如下:6 }4 I( G' y+ q/ F8 C
  1. # K7 Q& c5 S6 y+ h) [. h
  2. //------------------------------------------------------------------------------' c1 e4 v) ?) m3 m
  3. #include <absacc.h>. x: ?8 E1 _5 r4 }
  4. ; c/ J& W& V4 V" q, o
  5. //------------------------------------------------------------------------------: ~; b' ^$ `9 w- \- C
  6. #define VERINFO_ADDR_BASE   (0x8009F00) // 版本信息在FLASH中的存放地址
    6 E" E# U4 M; Q$ i5 d1 C6 `
  7. const char Hardware_Ver[] __attribute__((at(VERINFO_ADDR_BASE + 0x00)))  = "Hardware: 1.0.0";
    3 p4 d1 t% m- R+ r, _7 E5 c
  8. const char Firmware_Ver[] __attribute__((at(VERINFO_ADDR_BASE + 0x20)))  = "Firmware: 1.0.0";9 K3 S; @, a4 j3 P& ]9 t5 p
  9. const char Compiler_Date[] __attribute__((at(VERINFO_ADDR_BASE + 0x40))) = "Date: "__DATE__;
    $ I. L2 e/ i% f& V7 X
  10. const char Compiler_Time[] __attribute__((at(VERINFO_ADDR_BASE + 0x60))) = "Time: "__TIME__;' \0 U7 b  W& I  j. Z

  11. : }  F# D8 e- [# I; C0 o6 D" h
  12. //------------------------------------------------------------------------------
复制代码
  写入到程序中:
) D- g/ N1 K% L' Q) k 21.png % c5 V  F4 [( N% s2 U
选项配置中:Flash地址与大小不用做任何修改!
1 X5 f% k8 l" p. r% q 22.png ( H1 I0 G! _7 T; h" P3 v; r+ e
   HEX文件:# x- A. m4 w% B5 [6 `; k) y/ T: x
23.png 6 n" O5 m1 ~# N
    串口打印输出:
. u2 O& [* P% {( L8 R6 { 24.png 8 S/ {, U( T3 N& O' M! Y* d( w3 E
上述方法的缺点
. k' y- q' ~1 }: s/ y
. E+ ]  l6 y2 ~0 X  H
& V6 L$ y/ R1 A9 F$ N
    上述操作可行, 但是有一个缺点:就是生成的bin文件都是满flash大小的, 造成每次烧录都是整个flash读写。- q( o# Q! n! V- q4 C8 E
    其实这个可以把存放地址放到前面,比如偏移1K的地方,都不用改指定地址。5 j  @- ^3 k4 ^) |+ U
    按照上述操作,程序末尾到VERINFO_ADDR_BASE地址这一段会被填充成0x00。根据需要可以修改VERINFO_ADDR_BASE减小地址,或者说不强制指定地址,由编译器自动分配,但这样就要去找相应的版本标识字符串了。
0 N% z+ V9 d) j/ T
0 B" }8 A: Z! |
: t+ z$ F* j8 `2 U9 H
优化方法
  i; h* B& P$ V# R/ r9 k  `2 u7 Z3 I- E: w: G- S
6 q7 o* v+ b% L( T  ]
    不想前面这一段被大量填充0x00,让HEX文件体积小一点的话, 可以把选项配置中Flash的Size改小一点,把VERINFO_ADDR_BASE设置成从FlashSize后面的空间开始,这样生成的HEX文件就小了,且未用空间就不会被大量填充0x00了。% r  y- V7 D) l1 ~4 ]# c

, j, i: ~; a5 l3 }, B
) t3 ~% ^$ [, x
    方法如下:
5 c; y( V* J. l3 E0 y# [" K4 o1 T- E1 H+ e* b+ V% y  o
25.png
: f- w7 f# K3 S' k# Z' c- _! |: t, y, I9 }2 L% h
收藏 评论0 发布时间:2021-6-23 16:59

举报

0个回答

所属标签

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