白姐透特今晚开什么码

打印

[学习笔记]简单的备份升级策略

[复制链接]
188|7
跳转到指定楼层
楼主
硬件环境:通用开发板  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的代码此处内容必须完全同步(中文注释乱码
  1. #define IAP_BOOTLOAD_ADDRESS    0x8000000    /* define bootload start address */
  2. #define CONFIG_ADDRESS      0x08003800  /* Ô¤ÁôÒ»¸öÒ³ÓÃÓÚ´æ·ÅÅäÖÃÐÅÏ¢ */
  3. #define APP_ADDRESS    0x8004000    /* define app start address */   
  4.    
  5. #define EFLASH_PAGE_SIZE_INIT 2048  /* define one-page size */
  6. #define EFLASH_PAGE_NUM_INIT  60    /* define APP page num, size=2048*60=120K */
  7. #define APP_ADDRESS_END     ((uint32_t)(APP_ADDRESS + EFLASH_PAGE_SIZE_INIT * EFLASH_PAGE_NUM_INIT))        
  8. #define APP_BKP_ADDRESS     APP_ADDRESS_END
  9. #define APP_BKP_ADDRESS_END     ((uint32_t)(APP_BKP_ADDRESS + EFLASH_PAGE_SIZE_INIT * EFLASH_PAGE_NUM_INIT))     

  10. #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, 下载次数: 19)

相关资料

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

启动应该要判断启动原因,不同的启动原因做不同的事情,就可以规避因为升级重启而导致SOC重上电了,当然,硬件上也需要对SOC电源加锁。防止MCU重启自动断开SOC供电。当然,有空间的话还是备份比较好。有些单片机都设计了AB双启动区用于升级切换。更加方便。
5
 楼主|2019-12-5 13:24|只看该作者
我测试发现好像对数据的crc16校验总是为0xffff,后来发现是crc16的第二个参数用的u8,导致长度限制了,大家可以改成u32的。我也不记得我这份代码里改没改了,大家看下,没改的话改下就好了
6
|2019-12-5 14:11|只看该作者
这样可以保证将升级的代码数据的完整,我也是这么用的.
7
 楼主|2019-12-5 16:48|只看该作者
z_no1 发表于 2019-12-5 14:11
这样可以保证将升级的代码数据的完整,我也是这么用的.

对,其实我做的还不够完全,最好的应该下载代码的时候校验一次,boot copy代码前校验一次,copy完校验一次,这样即使copy过程中出了问题也能发现并重新copy了
8
|2019-12-6 00:29|只看该作者
JasonLee27 发表于 2019-12-5 16:48
对,其实我做的还不够完全,最好的应该下载代码的时候校验一次,boot copy代码前校验一次,copy完校验一 ...

没用,在更新前做强校验就好了,其他的要么没影响,要么已经没法挽救了.
扫描二维码,随时随地手机跟帖

本版积分规则

我要发帖投诉建议创建版块

快速回复

您需要登录后才可以回帖
登录 | 注册

论坛热帖

在线客服 快速回复 返回顶部返回列表