打印
[学习笔记]

简单的备份升级策略

[复制链接]
1271|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
JasonLee27|  楼主 | 2019-11-29 14:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
硬件环境:通用开发板  ATC-LINK软件环境:keil5.23   CMSIS1.0.8

软件分为boot和app

flash总共256K,划分为4个部分
0x08000000~0x08003800  作为boot代码区域
0x08003800~0x08004000  用于保存一些信息
0x08004000~0x08022000  APP部分代码区域
0x08022000~0x08040000  APP代码备份区域

地址配置信息在代码的IAP_cfg.h中,boot和app的代码此处内容必须完全同步(中文注释乱码
#define IAP_BOOTLOAD_ADDRESS    0x8000000    /* define bootload start address */
#define CONFIG_ADDRESS      0x08003800  /* Ô¤ÁôÒ»¸öÒ³ÓÃÓÚ´æ·ÅÅäÖÃÐÅÏ¢ */
#define APP_ADDRESS    0x8004000    /* define app start address */   
   
#define EFLASH_PAGE_SIZE_INIT 2048  /* define one-page size */
#define EFLASH_PAGE_NUM_INIT  60    /* define APP page num, size=2048*60=120K */
#define APP_ADDRESS_END     ((uint32_t)(APP_ADDRESS + EFLASH_PAGE_SIZE_INIT * EFLASH_PAGE_NUM_INIT))        
#define APP_BKP_ADDRESS     APP_ADDRESS_END
#define APP_BKP_ADDRESS_END     ((uint32_t)(APP_BKP_ADDRESS + EFLASH_PAGE_SIZE_INIT * EFLASH_PAGE_NUM_INIT))     

#define APP_BKP_SIZE        (APP_BKP_ADDRESS_END - APP_BKP_ADDRESS)


通信默认采用的UART1,协议设计的很简单,附件里面也会提供,就不多说了。
app里面同时集成了测试程序。

升级的理论大概就是:
1,app接收到升级bin文件,将升级文件存放在备份区域,在传输结束后,会收到对应升级文件的crc16值,然后app要对备份bin文件进行crc16校验,校验成功后返回校验结果,并设置升级标志。
2,boot启动时判断升级标志有请求后,同样要校验备份区域的crc16值是否正确,如果正确,则将备份区代码copy至app区域,然后启动app,否则不进行copy动作。



使用时需要根据自己芯片的存储大小,适当的修改flash划分,目前boot编译的代码大概有十几K,app也大概十多K的样子,如果flash较小的,可以减小app和备份区域的大小。
IAP.rar (1.91 MB)

使用特权

评论回复

相关帖子

沙发
心口上的朱砂痣| | 2019-12-3 18:08 | 只看该作者
感谢分享

使用特权

评论回复
板凳
zchunhua25| | 2019-12-5 09:57 | 只看该作者
跟我周一写的一个升级流程框图不谋而合,不过我们是用的S32K。以前是收到升级请求后重启返回到BOOT接收数据并更新APP,但MCU重启会跑一遍SOC的上电时序,会造成SOC重上电,后来SOC想实现数据传输完成前不重上电,就重新构思了这个升级流程。这样就是MCU备份好数据后再重启进入BOOT,擦写APP。

使用特权

评论回复
地板
JasonLee27|  楼主 | 2019-12-5 11:17 | 只看该作者
zchunhua25 发表于 2019-12-5 09:57
跟我周一写的一个升级流程框图不谋而合,不过我们是用的S32K。以前是收到升级请求后重启返回到BOOT接收数据 ...

启动应该要判断启动原因,不同的启动原因做不同的事情,就可以规避因为升级重启而导致SOC重上电了,当然,硬件上也需要对SOC电源加锁。防止MCU重启自动断开SOC供电。当然,有空间的话还是备份比较好。有些单片机都设计了AB双启动区用于升级切换。更加方便。

使用特权

评论回复
5
JasonLee27|  楼主 | 2019-12-5 13:24 | 只看该作者
我测试发现好像对数据的crc16校验总是为0xffff,后来发现是crc16的第二个参数用的u8,导致长度限制了,大家可以改成u32的。我也不记得我这份代码里改没改了,大家看下,没改的话改下就好了

使用特权

评论回复
6
z_no1| | 2019-12-5 14:11 | 只看该作者
这样可以保证将升级的代码数据的完整,我也是这么用的.

使用特权

评论回复
7
JasonLee27|  楼主 | 2019-12-5 16:48 | 只看该作者
z_no1 发表于 2019-12-5 14:11
这样可以保证将升级的代码数据的完整,我也是这么用的.

对,其实我做的还不够完全,最好的应该下载代码的时候校验一次,boot copy代码前校验一次,copy完校验一次,这样即使copy过程中出了问题也能发现并重新copy了

使用特权

评论回复
8
z_no1| | 2019-12-6 00:29 | 只看该作者
JasonLee27 发表于 2019-12-5 16:48
对,其实我做的还不够完全,最好的应该下载代码的时候校验一次,boot copy代码前校验一次,copy完校验一 ...

没用,在更新前做强校验就好了,其他的要么没影响,要么已经没法挽救了.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

66

主题

415

帖子

11

粉丝