本文介绍一个小技巧: 使用MDK编译器,让STM32程序HEX文件中加入固件版本信息。 代码 代码如下: - //------------------------------------------------------------------------------3 E8 n: a1 o) [; t9 K# J
- #include <absacc.h>% I& \7 w2 J8 L; B0 u- j" v
0 a4 D. ~9 S% L( g- //------------------------------------------------------------------------------0 X2 [( L4 A! F
- #define VERINFO_ADDR_BASE (0x8009F00) // 版本信息在FLASH中的存放地址
$ Z. c0 L9 r9 g4 U - const char Hardware_Ver[] __attribute__((at(VERINFO_ADDR_BASE + 0x00))) = "Hardware: 1.0.0";
0 y0 j% r' X3 U - const char Firmware_Ver[] __attribute__((at(VERINFO_ADDR_BASE + 0x20))) = "Firmware: 1.0.0";
- B" l3 h/ d' a! a. T% K - const char Compiler_Date[] __attribute__((at(VERINFO_ADDR_BASE + 0x40))) = "Date: "__DATE__;
: j$ G1 p- E: ]( U! ], x - const char Compiler_Time[] __attribute__((at(VERINFO_ADDR_BASE + 0x60))) = "Time: "__TIME__;
! _( M1 T9 h6 K% E6 x7 I4 u
9 i$ V* M) U' i+ {5 `: v- //------------------------------------------------------------------------------
复制代码
~$ ]" H6 }" L; V, l0 k 写入到程序中:
/ O2 h% S5 o; l( { \ 选项配置中:Flash地址与大小不用做任何修改! HEX文件: 串口打印输出: 上述方法的缺点 上述操作可行, 但是有一个缺点:就是生成的bin文件都是满flash大小的, 造成每次烧录都是整个flash读写。 其实这个可以把存放地址放到前面,比如偏移1K的地方,都不用改指定地址。 按照上述操作,程序末尾到VERINFO_ADDR_BASE地址这一段会被填充成0x00。根据需要可以修改VERINFO_ADDR_BASE减小地址,或者说不强制指定地址,由编译器自动分配,但这样就要去找相应的版本标识字符串了。 优化方法 不想前面这一段被大量填充0x00,让HEX文件体积小一点的话, 可以把选项配置中Flash的Size改小一点,把VERINFO_ADDR_BASE设置成从FlashSize后面的空间开始,这样生成的HEX文件就小了,且未用空间就不会被大量填充0x00了。 方法如下:
* x- m, P% U/ O4 N8 s7 L# A |