OpenEdv-开源电子网

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

stm32 IAP问题,从HTTPs 更新了APP,重启之后跳转不进新的APP

[复制链接]

2

主题

16

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-4-9
在线时间
4 小时
发表于 2017-5-10 20:37:15 | 显示全部楼层 |阅读模式
1金钱
我的项目流程是:IAP程序和APP程序合并成一个HEX文件,然后烧写进STM32,可以正常运行,也就是先运行IAP程序然后跳转到APP运行。

然后我发送一个命令,我APP程序会从服务器获取bin文件,烧写进去外部flash(SPI通信的),然后重启,进入IAP,它会从外部flash读取数据烧写进APP中。

成功后,判断栈地址成功,可是跳转不进去APP。

现象:一开始的硬件,可以完美的更新一段时间,之后就出现上面的问题,可是栈地址是对的。
      然后更换了另外一个硬件,试了两三次,放了几天让它运行,之后给升级命令,也出现上面情况。

虽然感觉我描述的不太清楚,也没有很具体的说明现象,我也找不出什么细节出现错误,从服务器烧写进外部flash和读 的数据应该正确的。

所以我来论坛碰碰运气,大伙说说可能的原因,谢谢了!

对了,论坛新手,抱歉没那么多金币给大家。

最佳答案

查看完整内容[请看2#楼]

解决:由于之前喂狗时间短,所以每次外部flash只擦除4K,现在加大喂狗时间,改成64K擦除,可行。 应该是擦除连续擦除4K,后面的没擦除成功的原因。 不过也要过段时间看可用否。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-4-9
在线时间
4 小时
 楼主| 发表于 2017-5-10 20:37:16 | 显示全部楼层
本帖最后由 vijay_ye 于 2017-5-11 16:03 编辑

解决:由于之前喂狗时间短,所以每次外部flash只擦除4K,现在加大喂狗时间,改成64K擦除,可行。
应该是擦除连续擦除4K,后面的没擦除成功的原因。

不过也要过段时间看可用否。
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-4-9
在线时间
4 小时
 楼主| 发表于 2017-5-10 21:06:37 | 显示全部楼层
读外部flash 会可能错误么?可是我打印出来栈地址是一样的,升级的Bin文件跟原来程序差不多的。
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-4-9
在线时间
4 小时
 楼主| 发表于 2017-5-11 09:09:50 | 显示全部楼层
yklstudent 发表于 2017-5-11 07:45
别差不多,查一个字节都不行

不是,意思是说升级的程序跟原来的改动一点点,意思是说栈头地址肯定相同的。请问有什么方法可以比较是否烧写进去的程序是没错的呢?
回复

使用道具 举报

33

主题

197

帖子

0

精华

高级会员

Rank: 4

积分
587
金钱
587
注册时间
2015-1-9
在线时间
80 小时
发表于 2017-5-11 10:52:23 | 显示全部楼层
你的APP程序有没有BUG,比如数组越界之类的BUG,我建议你先试验简单的APP程序,比如只闪灯的APP程序。如果长时间运行不出错,可以判断你目前的APP程序有问题。
君子性非异也,善假于物也
不知常,妄作,凶
纵浪大化中,不喜亦不惧,应尽便须尽,无复独多虑
路漫漫其修远兮,吾将上下而求索
菩萨畏因,凡夫畏果
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-4-9
在线时间
4 小时
 楼主| 发表于 2017-5-11 11:32:21 | 显示全部楼层
XUZJWWSZ 发表于 2017-5-11 10:52
你的APP程序有没有BUG,比如数组越界之类的BUG,我建议你先试验简单的APP程序,比如只闪灯的APP程序。如果 ...

这倒没有,长时间运行没问题,也成功升级好几次。我先目前判断外部FLASH读或者写问题。
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-4-9
在线时间
4 小时
 楼主| 发表于 2017-5-11 11:34:16 | 显示全部楼层
yklstudent 发表于 2017-5-11 11:16
你把烧录后的程序读出来比较下就可以了

我烧录的可以运行的,然后给命令升级,重启到iap区进行更新APP区代码,然后打印出的栈地址合理的,然后就没东西了。
怎么读取程序?
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-4-9
在线时间
4 小时
 楼主| 发表于 2017-5-11 13:21:01 | 显示全部楼层
yklstudent 发表于 2017-5-11 11:44
JLINK烧录程序,也可以读程序;
读出来自己比较下是否写对了,写全了

谢谢了,因为在产品上开发,很尴尬,只留了串口,不过FlyMcu 可以读取成.bin文件,已经找到原因了,在楼下,具体问题导致的还不清楚。
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-4-9
在线时间
4 小时
 楼主| 发表于 2017-5-11 13:43:09 | 显示全部楼层
定位到原因了,是读写外部flash错误,我使用的是W25Q16。有两个现象。
1. 板子1,新板,一开始可远程升级代码的,然后运行了两三天,在给它远程升级固件,就出现上面的现象,在IAP升级时(也就是将信息写入STM32falsh中),打印出来读取外部falsh的信息,只打印了前一点点内容,也就是因此说栈顶地址能够合法的原因。
2.  板子1,将写入外部flash的地址换了。然后成功了。

所以给出来的原因是可能我将外部flash擦坏了,不过我只擦除过两次,运行了几天(之前不是板子1,有测试连续远程升级好几十次都没问题的),所以感觉我正常运行对W25Q16有影响。

对于有关W25Q16的流程:大伙看看合不合理,整体是参考正点哥的。
IAP区:初始W25Q16(也就是初始化管脚)->读W25Q16 ID->无更新标志直接跳入APP,有更新标志->读取W25Q16 2K写 入stm32 flash 2K(大容量32)。

APP区:初始W25Q16(也就是初始化管脚)->读W25Q16 ID->接收到升级命令->每4K擦除外部flash,64次(256K)->读取固件写入外部flash->重启。

绿色部分,由于看门狗原因,需要每4K擦除。这里合理么?
回复

使用道具 举报

33

主题

197

帖子

0

精华

高级会员

Rank: 4

积分
587
金钱
587
注册时间
2015-1-9
在线时间
80 小时
发表于 2017-5-12 08:50:12 | 显示全部楼层
楼主是不是可以在运行的时候量一下那片flash的片选。
我用过W25Q128A+stm32f107,没问题。每4K擦除应该没问题。
后来同事把同样的读写FLASH的代码移植到PIC单片机,那片W25Q128A就总是坏掉。
我们的解决办法是简化代码:
比如原来代码中考虑了许多情况:全片擦除,多扇区擦除,楼主可以只保留4K擦除的代码。
同样的读写代码也可以做简化。

简化之后那片flash就没有坏掉过,到现在也莫名其妙。
君子性非异也,善假于物也
不知常,妄作,凶
纵浪大化中,不喜亦不惧,应尽便须尽,无复独多虑
路漫漫其修远兮,吾将上下而求索
菩萨畏因,凡夫畏果
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-4-9
在线时间
4 小时
 楼主| 发表于 2017-5-19 08:56:56 | 显示全部楼层
XUZJWWSZ 发表于 2017-5-12 08:50
楼主是不是可以在运行的时候量一下那片flash的片选。
我用过W25Q128A+stm32f107,没问题。每4K擦除应该没 ...

抱歉这么晚看到,4K擦写应该没问题的,我的是要存储32固件,所以需要擦除很大片,会多次擦除,导致只擦除了前面的。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-21 04:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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