我的项目流程是:IAP程序和APP程序合并成一个HEX文件,然后烧写进STM32,可以正常运行,也就是先运行IAP程序然后跳转到APP运行。
然后我发送一个命令,我APP程序会从服务器获取bin文件,烧写进去外部flash(SPI通信的),然后重启,进入IAP,它会从外部flash读取数据烧写进APP中。
成功后,判断栈地址成功,可是跳转不进去APP。
现象:一开始的硬件,可以完美的更新一段时间,之后就出现上面的问题,可是栈地址是对的。
然后更换了另外一个硬件,试了两三次,放了几天让它运行,之后给升级命令,也出现上面情况。
虽然感觉我描述的不太清楚,也没有很具体的说明现象,我也找不出什么细节出现错误,从服务器烧写进外部flash和读 的数据应该正确的。
所以我来论坛碰碰运气,大伙说说可能的原因,谢谢了!
对了,论坛新手,抱歉没那么多金币给大家。
谢谢了,因为在产品上开发,很尴尬,只留了串口,不过FlyMcu 可以读取成.bin文件,已经找到原因了,在楼下,具体问题导致的还不清楚。
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->重启。
绿 {MOD}部分,由于看门狗原因,需要每4K擦除。这里合理么?
抱歉这么晚看到,4K擦写应该没问题的,我的是要存储32固件,所以需要擦除很大片,会多次擦除,导致只擦除了前面的。
一周热门 更多>