本文介绍一个小技巧:
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
- # K7 Q& c5 S6 y+ h) [. h
- //------------------------------------------------------------------------------' c1 e4 v) ?) m3 m
- #include <absacc.h>. x: ?8 E1 _5 r4 }
- ; c/ J& W& V4 V" q, o
- //------------------------------------------------------------------------------: ~; b' ^$ `9 w- \- C
- #define VERINFO_ADDR_BASE (0x8009F00) // 版本信息在FLASH中的存放地址
6 E" E# U4 M; Q$ i5 d1 C6 ` - const char Hardware_Ver[] __attribute__((at(VERINFO_ADDR_BASE + 0x00))) = "Hardware: 1.0.0";
3 p4 d1 t% m- R+ r, _7 E5 c - const char Firmware_Ver[] __attribute__((at(VERINFO_ADDR_BASE + 0x20))) = "Firmware: 1.0.0";9 K3 S; @, a4 j3 P& ]9 t5 p
- const char Compiler_Date[] __attribute__((at(VERINFO_ADDR_BASE + 0x40))) = "Date: "__DATE__;
$ I. L2 e/ i% f& V7 X - const char Compiler_Time[] __attribute__((at(VERINFO_ADDR_BASE + 0x60))) = "Time: "__TIME__;' \0 U7 b W& I j. Z
: } F# D8 e- [# I; C0 o6 D" h- //------------------------------------------------------------------------------
复制代码 写入到程序中:
) D- g/ N1 K% L' Q) k
% c5 V F4 [( N% s2 U
选项配置中:Flash地址与大小不用做任何修改!
1 X5 f% k8 l" p. r% q
( H1 I0 G! _7 T; h" P3 v; r+ e
HEX文件:# x- A. m4 w% B5 [6 `; k) y/ T: x
6 n" O5 m1 ~# N
串口打印输出:
. u2 O& [* P% {( L8 R6 {
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
: f- w7 f# K3 S' k# Z' c- _! |: t, y, I9 }2 L% h
|