本文介绍一个小技巧:& y9 @" f+ l' X7 n# I4 Q) l! g$ p
1 Y- x& t$ p) c- @! I$ E+ r. @' B% X, e
使用MDK编译器,让STM32程序HEX文件中加入固件版本信息。1 S/ M+ y* D8 Z. H8 u
代码; c: T0 A" c) d- F7 h ~
代码如下:: j6 K! E B' c$ m* S/ _+ G3 j
- & l% f( Z7 ]) a" Q# M
- //------------------------------------------------------------------------------
& S7 [/ r' n" N - #include <absacc.h>
+ q+ O* q( b* Z) f3 z2 ~ - * w: Q' f! L2 v9 i% |! l2 L$ Y
- //------------------------------------------------------------------------------9 \/ q$ P/ Z, b
- #define VERINFO_ADDR_BASE (0x8009F00) // 版本信息在FLASH中的存放地址
; H3 j& I2 Y3 ]) z - const char Hardware_Ver[] __attribute__((at(VERINFO_ADDR_BASE + 0x00))) = "Hardware: 1.0.0";
# T- c+ V9 ~5 H) c - const char Firmware_Ver[] __attribute__((at(VERINFO_ADDR_BASE + 0x20))) = "Firmware: 1.0.0";2 t, L3 l; i3 ~! J4 o' c
- const char Compiler_Date[] __attribute__((at(VERINFO_ADDR_BASE + 0x40))) = "Date: "__DATE__;
3 i( a( K \' |+ M" @ - const char Compiler_Time[] __attribute__((at(VERINFO_ADDR_BASE + 0x60))) = "Time: "__TIME__;
; t/ X7 b( F, G: J7 \ S0 O
( c" x2 u# u& e- //------------------------------------------------------------------------------
复制代码 写入到程序中:4 ?' e3 _" r; M) O0 q
: N+ c$ @" z3 E9 N) w
选项配置中:Flash地址与大小不用做任何修改!
. Y3 H( ]6 `! Y1 g5 Z! m. |
- x/ E W4 A9 [2 j8 w1 M HEX文件:
! G8 m7 j/ }3 z& e- {1 b
6 F7 u) J: [! \- {, y W
串口打印输出:% m$ T4 y( Y2 \' E
8 a( ^- H- e/ {7 _5 f8 Q
上述方法的缺点* Q1 H9 B5 j! x) ]+ _" z; h+ B
+ A: h1 W1 t2 B% s. O7 | ~4 Z0 b2 A% W3 b4 D
上述操作可行, 但是有一个缺点:就是生成的bin文件都是满flash大小的, 造成每次烧录都是整个flash读写。8 m+ ~1 i" H! O+ P6 Q- l
其实这个可以把存放地址放到前面,比如偏移1K的地方,都不用改指定地址。
* O3 p9 K0 j6 H( A 按照上述操作,程序末尾到VERINFO_ADDR_BASE地址这一段会被填充成0x00。根据需要可以修改VERINFO_ADDR_BASE减小地址,或者说不强制指定地址,由编译器自动分配,但这样就要去找相应的版本标识字符串了。& ~; Y/ J U! M0 ~
' S+ X* i/ Z4 {
$ s9 A0 J/ ?& U, A优化方法
$ x$ `1 B- o. {2 l R% {& ]+ F+ B
$ X! T1 U: [, w 不想前面这一段被大量填充0x00,让HEX文件体积小一点的话, 可以把选项配置中Flash的Size改小一点,把VERINFO_ADDR_BASE设置成从FlashSize后面的空间开始,这样生成的HEX文件就小了,且未用空间就不会被大量填充0x00了。* P- m( M; Y! L9 z9 O4 s" D& i
8 ~; k7 W* J5 v9 B3 O& s$ T
3 Z7 |& O. O* I+ ]% m 方法如下:+ R* n' v7 j: Z
9 e& t9 i; u: U" m/ B
1 S V! T6 u: S7 L' o$ g, c( ^/ O. ~6 p- L. f0 }3 [
|