单片机固件中加入版本信息的方式

这里写自定义目录标题

前言

下面记录如何在程序中加入版本信息,以MDK为例介绍。

实现方式

第一步:
1.定义一个结构体,里面定义一些软件版本相关的信息

typedef struct
{
    char szVersion[32];    // 软件版本
    char szBuildDate[32];  // 程序编译日期
    char szBuildTime[32];  // 程序编译时间
}AppInfo_t;

2.通过__attribute__定义一个只读结构体变量(只读的目的:防止程序改变、节约RAM)并固定变量在程序固件中的位置,赋初值(其中__DATE_ 和__TIME__是C语言中的内置宏,分别是当前的编译日期和编译时间)。

const AppInfo_t __attribute__ ((section(".ARM.__at_0x08002000"))) sg_tAppInfo =
{
    "STM32_V0.1.5",
    __DATE__,
    __TIME__,
};

注:STM32的代码起始地址是从0x08000000开始的,且存储中断向量表信息,因此在选择程序地址的时候一定要绕开,也不能太靠后,不然生成的bin文件超出了实际的代码固件大小,在实现bin文件升级的时候就会耗时太长。

第二步:
1.在 Keil MDK 中,默认情况下,源文件不修改,只会编译一次。

如果定于sg_tAppInfo变量的源文件没有修改而其它文件修改时,编译日期和编译时间还是之前的

为了编译版本、日期和时间正确,需要进行设置:总是编译
在这里插入图片描述第三步:添加脚本

通过Bat脚本实现以下功能:
1不需要修改代码即可修改程序版本信息
2按照当前固件打包时间作为程序的版本信息,同时按照版本信
息命名文件
3版本命名格式为:STM32_T2206111526

根据目录结构树编写指定脚本

MDK_STM32
    ---- CORE
    ---- STM32F10x_FWLib
    ---- OBJ(编译生成的hex文件)
    ---- USER
tool
    ---- srec_cat.exe
    ---- pack.bat

实现 pack.bat:

:: 版本信息前缀和长度
set strPrefix=SoliSensor-
set strPrefixlen=11

:: hex 文件路径和文件名
set hexFilePath=.\MDK\obj
set hexFileName=project.hex

:: 版本信息起始地址
set verStringAddr=0x00002000

if %time:~0,2% leq 9 (set hour=0%time:~1,1%) else (set hour=%time:~0,2%)
if %time:~0,2% leq 9 (set minute=%time:~3,2%) else (set minute=%time:~3,2%)

:: 打包时间格式为年月日时分 T2206111526
set strTime=T%date:~2,2%%date:~5,2%%date:~8,2%%hour%%minute%
set strVersion=%strPrefix%%strTime%

:: 版本信息的结束地址
set /a InfoEnd=%verStringAddr%+%strPrefixlen%+11

copy %hexFilePath%\%hexFileName% .\
.\srec_cat.exe -generate %verStringAddr% %InfoEnd% -repeat-string %strVersion% %hexFilePath%\%hexFileName% -intel -exclude %verStringAddr% %InfoEnd% -o .\%strVersion%.hex -intel

del %hexFileName%

pause

第四步:
如果实现了 bootloader 程序,那么一定会用到寄存器SCB->VTOR重新设置中断向量表的起始地址了,所以干脆可以将版本信息放在 APP 程序区中的最开始位置,后面紧跟中断向量表的起始地址。

这样做的好处是不用担心程序编译后版本信息的位置超出了APP可执行程序的实际大小,而且在实现升级的时候bootloader程序在一开始就可以直接对版本信息进行校验等。

同时通过映像工具 srec_cat 将 bootloader 和 APP 程序固件进行合并。
也能通过 keil 在编译后自动执行脚本。

以上内容整理自一下链接:

【大橙子疯嵌入式】单片机固件中加入版本信息的方式(二)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值