本文介绍一个小技巧:% 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- $ b9 a0 v& c- c3 X ]4 m( l2 r, _
- //------------------------------------------------------------------------------
8 L( z& @6 `7 @1 B9 G - #include <absacc.h>* m7 v U. `0 n' u0 h, C/ j
- 8 g* U& n# T8 i# P
- //------------------------------------------------------------------------------& y. ]& k& ?9 d8 a) `3 L
- #define VERINFO_ADDR_BASE (0x8009F00) // 版本信息在FLASH中的存放地址
: }0 G! E8 Z8 r4 E% } - const char Hardware_Ver[] __attribute__((at(VERINFO_ADDR_BASE + 0x00))) = "Hardware: 1.0.0";
+ s1 N0 V; ~9 l6 P N - const char Firmware_Ver[] __attribute__((at(VERINFO_ADDR_BASE + 0x20))) = "Firmware: 1.0.0";$ Q" x! H& _3 X
- const char Compiler_Date[] __attribute__((at(VERINFO_ADDR_BASE + 0x40))) = "Date: "__DATE__;' O, b+ k0 X+ M- P1 P+ |' x
- const char Compiler_Time[] __attribute__((at(VERINFO_ADDR_BASE + 0x60))) = "Time: "__TIME__;; g$ G+ ~6 h8 Y4 ^
- $ A, k! `' J7 B. ?. N6 s
- //------------------------------------------------------------------------------
复制代码 写入到程序中:
8 a/ r) o+ [: h
- v, _4 A# q$ u# P- r' e
选项配置中:Flash地址与大小不用做任何修改!" ~' p; V. O" J" n) }
7 T" @5 w& h4 }$ Y7 \/ j% B HEX文件:/ V4 @8 r- P" e( k- U: C- o# z
# R: x- N. ~: _3 h 串口打印输出:; w9 z5 w: _9 a& @" @
" 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
4 P9 C+ g( V* ^; `. H
1 F& k# I* L5 H$ T- {
|