本文介绍一个小技巧:
) T+ Q, i9 y1 |, w( _8 A* a2 M {6 @
1 L/ Z- [; J9 @; m$ H/ `
: w9 i8 k% K5 O! C: y m 使用MDK编译器,让STM32程序HEX文件中加入固件版本信息。
9 f+ T, Y/ K/ }% a2 D' R代码. D9 e4 o8 `: T/ F3 J t
代码如下:3 {. l8 H8 m6 `- N& A0 a, P
: \# @- k1 x/ z. N. {" Y- //------------------------------------------------------------------------------" k! H! w; A& h# a- g' f+ l1 ~
- #include <absacc.h>0 }# C+ S _9 x. I( M. g
& i# g; }* @% Q! T- //------------------------------------------------------------------------------
- E' J) Z$ ]- |! O }: x6 _8 z - #define VERINFO_ADDR_BASE (0x8009F00) // 版本信息在FLASH中的存放地址
* n6 o& J( f% `& E - const char Hardware_Ver[] __attribute__((at(VERINFO_ADDR_BASE + 0x00))) = "Hardware: 1.0.0";% b( h# D( D3 q/ A4 V
- const char Firmware_Ver[] __attribute__((at(VERINFO_ADDR_BASE + 0x20))) = "Firmware: 1.0.0";
1 B, ] B! L' j, q - const char Compiler_Date[] __attribute__((at(VERINFO_ADDR_BASE + 0x40))) = "Date: "__DATE__;
! ^8 s8 N6 d* U! [5 X3 e - const char Compiler_Time[] __attribute__((at(VERINFO_ADDR_BASE + 0x60))) = "Time: "__TIME__;
- l* R" x( l: p$ w# j - - j V1 s$ b8 l& U+ t
- //------------------------------------------------------------------------------
复制代码 写入到程序中:- ?4 m" x* I) i3 S6 V
: U. X- ?- F. f; a
选项配置中:Flash地址与大小不用做任何修改!
" e' L) Q$ U, r3 ]3 U: i" j% K0 p
5 t$ K. k% u2 o3 f" o HEX文件:8 _0 K# K4 q& K% B/ X
0 \: X% a5 [( h" k3 }7 i8 {# J7 p 串口打印输出:) o+ C# F& f! `7 s5 y# _+ o0 ~1 c
( r, u j9 J& z* q! }. M# }# f上述方法的缺点
2 L+ j! \6 f9 Y! P7 T7 T1 P2 n% O& X# ^# X
8 L/ B! V# n s2 e 上述操作可行, 但是有一个缺点:就是生成的bin文件都是满flash大小的, 造成每次烧录都是整个flash读写。
- C3 `& s; W( X 其实这个可以把存放地址放到前面,比如偏移1K的地方,都不用改指定地址。
$ A/ u) G3 ?' Q% K2 U, p' {+ E 按照上述操作,程序末尾到VERINFO_ADDR_BASE地址这一段会被填充成0x00。根据需要可以修改VERINFO_ADDR_BASE减小地址,或者说不强制指定地址,由编译器自动分配,但这样就要去找相应的版本标识字符串了。1 l( ~9 m( r: P
$ S! r+ u7 W' i W
* V _8 k" h! \
优化方法( e1 i; }7 M. r5 g2 f
2 ?( a: p* G" t" l% T% s q
2 W# b0 w+ U! ~0 P A. y* m 不想前面这一段被大量填充0x00,让HEX文件体积小一点的话, 可以把选项配置中Flash的Size改小一点,把VERINFO_ADDR_BASE设置成从FlashSize后面的空间开始,这样生成的HEX文件就小了,且未用空间就不会被大量填充0x00了。; {/ \( m' M }1 l1 P+ R$ |
/ R0 Y9 Q: }4 O( x
0 A0 Y# a) r- W0 ~
方法如下:
7 j9 Z" u6 m7 U& N; X) J: K$ z d) o4 Y
9 U* ^" D( O) s2 H! j
5 b' H1 q, [- |+ L5 n |