OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8251|回复: 31

IAP程序升级失败,产品变砖如何解决这个问题?

[复制链接]

51

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
409
金钱
409
注册时间
2012-10-24
在线时间
19 小时
发表于 2016-5-30 16:55:00 | 显示全部楼层 |阅读模式
1金钱
大家好,IAP远程升级代码的时候,因为环境的因素,在通过串口无线烧录时有时会失败,这种情况很容易导致产品死机无法使用,大家有没想到更保险的方案呢?我看有些产品是用flash空间比较大的MCU,在IAP升级的过程中会先把原来可以用的代码先拷贝到别的地方,然后把新的代码下载进来,如果中途升级失败,再把旧的代码拷回原来的位置继续使用,这样不会导致产品无法使用,有没有人试过这种方法,或者有更好的方案,希望指教一下,感激不尽!!!!!!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

45

帖子

0

精华

高级会员

Rank: 4

积分
548
金钱
548
注册时间
2015-1-18
在线时间
173 小时
发表于 2016-5-30 17:23:36 | 显示全部楼层
可以啊  我们就是用这种方法的 用了两份代码  一个有点类似于bootload  在这里判断升级标志位  升级成功就复制备份区代码到运行区 然后代码跳转到运行区 升级失败则直接跳转运行区;
运行区代码烧写时重新定义地址, 跳转到运行区后可以远程升级代码,成功就在内存中写入成功标志位 失败就写入失败标志位
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-5-30 17:35:12 | 显示全部楼层
本帖最后由 憨厚诚实大叔 于 2016-5-30 17:36 编辑

和楼上差不多吧,我是把flash分成3部分,一部分类似bootload,他判断flash固定位置的标志位,来确认程序跳到什么地址执行,更新是在正常运行的程序中偷偷更新的,等更新完毕并且确认无误后,改变flash固定位置的标志位,下一次复位就执行另外一套代码了,而且更新完毕后,程序也可以找合适的时机直接跳到另外一个地址执行。
不过的确是用大容量的芯片
回复

使用道具 举报

51

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
409
金钱
409
注册时间
2012-10-24
在线时间
19 小时
 楼主| 发表于 2016-5-31 10:05:36 | 显示全部楼层
一个爱做梦的人 发表于 2016-5-30 17:23
可以啊  我们就是用这种方法的 用了两份代码  一个有点类似于bootload  在这里判断升级标志位  升级成功就 ...

您好,有例程吗?太感谢了,我是做电动车的,设计到远程升级的问题
回复

使用道具 举报

51

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
409
金钱
409
注册时间
2012-10-24
在线时间
19 小时
 楼主| 发表于 2016-5-31 10:06:36 | 显示全部楼层
憨厚诚实大叔 发表于 2016-5-30 17:35
和楼上差不多吧,我是把flash分成3部分,一部分类似bootload,他判断flash固定位置的标志位,来确认程序跳 ...

您好,要是更新失败有没有保险设置?
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-5-31 10:10:36 | 显示全部楼层
莆田 发表于 2016-5-31 10:06
您好,要是更新失败有没有保险设置?

更新失败就是在继续跑以前的代码啊,每接收一次数据,都会返回去给网络端校验,只有发送完,全部校验无误后,等待网络端返回特定的信号,才会更改flash固定位置的标志位,并且找时机跳到另外的代码,不然的话就是一直跑现在的代码啊
回复

使用道具 举报

51

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
409
金钱
409
注册时间
2012-10-24
在线时间
19 小时
 楼主| 发表于 2016-5-31 10:47:43 | 显示全部楼层
憨厚诚实大叔 发表于 2016-5-31 10:10
更新失败就是在继续跑以前的代码啊,每接收一次数据,都会返回去给网络端校验,只有发送完,全部校验无误 ...

听起来很牛逼啊,有没有例程啊,我想参考一下,我是做电动平衡车的,要远程升级代码,电机驱动我比较擅长
回复

使用道具 举报

8

主题

45

帖子

0

精华

高级会员

Rank: 4

积分
548
金钱
548
注册时间
2015-1-18
在线时间
173 小时
发表于 2016-6-1 08:58:27 | 显示全部楼层
莆田 发表于 2016-5-31 10:05
您好,有例程吗?太感谢了,我是做电动车的,设计到远程升级的问题

由于是公司的代码  不方便上传 上位机也是公司的自己设计的  你可以参考 这个网站的代码SD卡升级的http://www.openedv.com/thread-10027-1-2.html
回复

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2016-5-31
在线时间
4 小时
发表于 2016-6-1 09:51:03 | 显示全部楼层
升级的时候要做校验啊,校验不成功就停在boot程序中等待固件再次升级
回复

使用道具 举报

51

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
409
金钱
409
注册时间
2012-10-24
在线时间
19 小时
 楼主| 发表于 2016-6-1 10:15:21 | 显示全部楼层
一个爱做梦的人 发表于 2016-6-1 08:58
由于是公司的代码  不方便上传 上位机也是公司的自己设计的  你可以参考 这个网站的代码SD卡升级的http:/ ...

还是谢谢你啊!!IAP升级例程,原子哥的mini资料里有,我想了解一下升级失败后处理的例程,SD卡升级里面好像没有这过程
回复

使用道具 举报

51

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
409
金钱
409
注册时间
2012-10-24
在线时间
19 小时
 楼主| 发表于 2016-6-1 10:16:25 | 显示全部楼层
shushanxiaoyao 发表于 2016-6-1 09:51
升级的时候要做校验啊,校验不成功就停在boot程序中等待固件再次升级

您好,有例程可以参考一下吗?谢谢你!!!
回复

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2016-5-31
在线时间
4 小时
发表于 2016-6-1 10:58:46 | 显示全部楼层
莆田 发表于 2016-6-1 10:16
您好,有例程可以参考一下吗?谢谢你!!!

http://www.cnblogs.com/xiaomagee/p/5135088.html
参考的小马哥的
每次上电从boot开始执行,只要boot区域的代码不被破坏就不会变砖。
回复

使用道具 举报

51

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
409
金钱
409
注册时间
2012-10-24
在线时间
19 小时
 楼主| 发表于 2016-6-1 11:25:04 | 显示全部楼层
shushanxiaoyao 发表于 2016-6-1 10:58
http://www.cnblogs.com/xiaomagee/p/5135088.html
参考的小马哥的
每次上电从boot开始执行,只要boot ...

好的,谢谢,我看看
回复

使用道具 举报

17

主题

587

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4467
金钱
4467
注册时间
2013-6-27
在线时间
565 小时
发表于 2016-6-1 11:37:55 | 显示全部楼层
目前我是使用一块FLASH做数据存储,BOOT与API都可以读写,如果怕失败我就在这个数据存储标记调试模式,调试模式就是每次上电会自动进入BOOT升级,升级完成后关闭调试模式。
这样即使升级失败只要复位下就再次进入boot设计。
让我们的思维驾驭在电的速度之上!
回复

使用道具 举报

8

主题

571

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2922
金钱
2922
注册时间
2016-5-13
在线时间
185 小时
发表于 2016-6-1 11:58:26 | 显示全部楼层
flash空间划分:bootloader,app,swap,rescue。
开机进入bootloader。
app中接收固件写入swap中去。
bootloader中先把app区复制到rescue中去,然后擦除app区,再把swap复制写入app区。
出问题了就把rescue区中的固件再次写入app中。
程序在app区中运行。
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

51

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
409
金钱
409
注册时间
2012-10-24
在线时间
19 小时
 楼主| 发表于 2016-6-1 12:09:03 | 显示全部楼层
电脑小白 发表于 2016-6-1 11:58
flash空间划分:bootloader,app,swap,rescue。
开机进入bootloader。
app中接收固件写入swap中去。

IAP升级只能用USART1吗?
回复

使用道具 举报

51

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
409
金钱
409
注册时间
2012-10-24
在线时间
19 小时
 楼主| 发表于 2016-6-1 12:14:06 | 显示全部楼层
DongInker 发表于 2016-6-1 11:37
目前我是使用一块FLASH做数据存储,BOOT与API都可以读写,如果怕失败我就在这个数据存储标记调试模式,调试 ...

你好,能不能给个代码参考一下,我是做无刷电机驱动的,在这方面有需要我也可以共享
回复

使用道具 举报

51

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
409
金钱
409
注册时间
2012-10-24
在线时间
19 小时
 楼主| 发表于 2016-6-1 12:15:26 | 显示全部楼层
电脑小白 发表于 2016-6-1 11:58
flash空间划分:bootloader,app,swap,rescue。
开机进入bootloader。
app中接收固件写入swap中去。

对,我就是想用这方法,我觉得这个比较可靠,请问有代码参考吗?谢谢!
回复

使用道具 举报

8

主题

571

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2922
金钱
2922
注册时间
2016-5-13
在线时间
185 小时
发表于 2016-6-1 13:40:42 | 显示全部楼层
没有 stm32的例程。我的是在51822上实现的。stm32上自己写bootloader也是可以实现的。
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

51

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
409
金钱
409
注册时间
2012-10-24
在线时间
19 小时
 楼主| 发表于 2016-6-1 15:02:53 | 显示全部楼层
电脑小白 发表于 2016-6-1 13:40
没有 stm32的例程。我的是在51822上实现的。stm32上自己写bootloader也是可以实现的。

IAP升级只能用USART1吗?
回复

使用道具 举报

8

主题

571

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2922
金钱
2922
注册时间
2016-5-13
在线时间
185 小时
发表于 2016-6-1 15:38:45 | 显示全部楼层
莆田 发表于 2016-6-1 15:02
IAP升级只能用USART1吗?

只要能通信的都可以的。
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

8

主题

571

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2922
金钱
2922
注册时间
2016-5-13
在线时间
185 小时
发表于 2016-6-1 15:39:50 | 显示全部楼层
莆田 发表于 2016-6-1 15:02
IAP升级只能用USART1吗?

IIC  网口 CAN 等都能实现IAP的。
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2016-6-1 15:43:55 | 显示全部楼层
加上CRC校验,确保Bin文件是正确接收,应该无问题
回复

使用道具 举报

7

主题

185

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2729
金钱
2729
注册时间
2015-12-27
在线时间
469 小时
发表于 2016-6-1 16:46:09 | 显示全部楼层
电脑小白 发表于 2016-6-1 11:58
flash空间划分:bootloader,app,swap,rescue。
开机进入bootloader。
app中接收固件写入swap中去。

我觉得这样做不是有些繁琐吗?boot区,APP1区,APP2区,分成这个3个区,现在一个APP区运行待另一个APP区的数据全都正确写入了,在跳转过去不久可以了?这样做避免了来回多次的拷贝····这样是不是更好呢?
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-6-1 17:26:20 | 显示全部楼层
钩月黄昏 发表于 2016-6-1 16:46
我觉得这样做不是有些繁琐吗?boot区,APP1区,APP2区,分成这个3个区,现在一个APP区运行待另一个APP区 ...

我现在就是这样做的,直接在一个APP里面写另外一个APP的flash区的数据,写完校验无错后过去
回复

使用道具 举报

7

主题

185

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2729
金钱
2729
注册时间
2015-12-27
在线时间
469 小时
发表于 2016-6-2 10:28:25 | 显示全部楼层
憨厚诚实大叔 发表于 2016-6-1 17:26
我现在就是这样做的,直接在一个APP里面写另外一个APP的flash区的数据,写完校验无错后过去

我想在有两个产品硬件复用,我准备直接同一个芯片烧写两个固件进入,在生产的时候通过boot区选择进入那个APP区,这样就可以两个产品无差别的生产,只在出厂的时候在boot运行时设置一下···
回复

使用道具 举报

8

主题

571

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2922
金钱
2922
注册时间
2016-5-13
在线时间
185 小时
发表于 2016-6-2 15:13:41 | 显示全部楼层
钩月黄昏 发表于 2016-6-1 16:46
我觉得这样做不是有些繁琐吗?boot区,APP1区,APP2区,分成这个3个区,现在一个APP区运行待另一个APP区 ...

APP1和APP2的中断向量表不一样的,不能用同一个固件的。做两个工程岂不是更麻烦了么。
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

17

主题

587

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4467
金钱
4467
注册时间
2013-6-27
在线时间
565 小时
发表于 2016-6-2 20:55:21 | 显示全部楼层
/*
+----------+ 0X08000000
| Boot Code|
+----------+
| Boot Cfg | 1 Page
+----------+ 0X08002000
| Api Code |
+----------+
| License  | 1 Page
+----------+
| ResetTime| 2 Page
+----------+
| RunTime  | 2 Page
+----------+
| Api Cfg  | 2 Page
+----------+ MCU MAX ADDR
*/
ROM分配 其中Boot Cfg是可以供Api Code及Boot Code共同配置及访问。
让我们的思维驾驭在电的速度之上!
回复

使用道具 举报

8

主题

571

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2922
金钱
2922
注册时间
2016-5-13
在线时间
185 小时
发表于 2016-6-6 09:51:32 | 显示全部楼层
DongInker 发表于 2016-6-2 20:55
/*
+----------+ 0X08000000
| Boot Code|

加上license和config的想法真的不错哦。
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

12

主题

86

帖子

0

精华

高级会员

Rank: 4

积分
567
金钱
567
注册时间
2014-12-19
在线时间
139 小时
发表于 2016-8-5 10:01:59 | 显示全部楼层
电脑小白 发表于 2016-6-2 15:13
APP1和APP2的中断向量表不一样的,不能用同一个固件的。做两个工程岂不是更麻烦了么。

有道理!
回复

使用道具 举报

37

主题

596

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1574
金钱
1574
注册时间
2017-7-17
在线时间
308 小时
发表于 2018-10-30 22:56:34 | 显示全部楼层
本帖最后由 candylife9 于 2018-10-30 22:58 编辑

STM32F103远程网络升级,www.sharing-iot.com有一个视频课程,附参考代码。思路就是将新程序保存在一片FLASH中,无误后替换旧程序。有错误不进行替换,这样就不会变砖。
回复

使用道具 举报

7

主题

199

帖子

0

精华

高级会员

Rank: 4

积分
711
金钱
711
注册时间
2017-5-20
在线时间
96 小时
发表于 2018-10-31 11:52:23 | 显示全部楼层
可以将rom区分为BootLoader,app1,app1copy,flag.
每次开机,BootLoader里面读取flag决定去app1还是app1copy;
升级app1之前设置flag,升级app1成功再修改flag;升级app1copy之前设置flag,升级app1copy成功再修改flag;
这样即使中途升级失败,BootLoader也能通过flag进入正常可使用的app1 or app1copy。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 09:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表