使用KEIL开发项目时,手动更改版本号会比较繁琐,而且经常容易错漏,为了减少这类繁琐的操作,可以利用KEIL内置的 DATE 和__TIME__这两个宏来获取编译时的日期和时间,这两个宏是字符串形式,可以直接打印,
printf(__DATE__); //日期
printf(__TIME__); //时间
输出结果是
Mar 15 2021 11:51:32
直接用日期作为软件版本号,长度太长,不利于显示。我们进行一下转换,只要2个字节就可以存放,方法:第1字节高4位存放年份的最后一个数字,低4位存放月份,1到12月用1~C表示,第2字节存放日期。
日期: Mar 15 2021 转换成版本是:13.15,21年3月15号
如果1天还有多个版本,可以把时间加上
转换代码如下:
/************************************************************
Copyright (C), 2013-2021
FileName:
Author : 祥子 QQ:570525287
Version : 1.0
Date : 2022-3-22
Description:
Function List:
History :
<author> <time> <version > <desc>
2022.3.22
1、以日期作为的版本标识
***********************************************************/
//----------------------版本------------------
typedef struct
{
u8 ver; //大的版本号,用于升级识别:A0 A1 A2 A3 A4...AF B0 B1...BF 十六进制显示
u8 year_month; //年月,高4位是年,低4位是月,2A 表示2022年10月 十六进制显示
u8 dat; //日 十六进制显示
u8 hour;
u8 minute;
u8 secode;
}REVISION_TypeDef;
extern REVISION_TypeDef revision;
void revision_make(void);
//---------------------日期 时间---------------------------
//月份 Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
const u8 str_date[12] = __DATE__; //示例 "Mar 23 2022"
const u8 str_time[10] = __TIME__;
REVISION_TypeDef revision;
/*----------------------------------------------------------------------
Function :revision_make
Description:生成版本号
Input :无
Retrun :
--------------------------------------------------------------------------*/
void revision_make(void)
{
u8 year,month;
u8 d1,d2;
revision.ver = SOFTWARE_VER;
d1 = str_date[4] - '0'; //日期 十位
d2 = str_date[5] - '0'; //日期 个位
revision.dat = d1 << 4 | d2; //
//月份字符串转换成 1~C:先判断第3个字母,再判第2个字母,得到对应月份
switch(str_date[2])
{
case 'n': //Jan和jun
month = str_date[1] == 'a' ? 1 : 6; //判断1月还是6月
break;
case 'b': //Feb
month = 2;
break;
case 'r': //Mart和Apr
month = str_date[1] == 'a' ? 3 : 4; //判断3月还是4月
break;
case 'y': //May
month = 5;
break;
case 'l': //Jul
month = 7;
break;
case 'g': //Aug
month = 8;
break;
case 'p': //Sep
month = 9;
break;
case 't': //Oct
month = 0x0A; //10
break;
case 'v': //Nov
month = 0x0B; //11
break;
case 'c': //Dec
month = 0x0C; //12
break;
}
year = str_date[10] - '0'; //年份
revision.year_month = year << 4 | month;
}
注意,每次编译时,要把这个函数重新编译才能生成当前日期。