搜索
bottom↓
回复: 30

如何用W25Q128芯片做IAP升级呢?

[复制链接]

出0入0汤圆

发表于 2017-1-18 10:13:44 | 显示全部楼层 |阅读模式
APP现用tftp协议将bin文件发送到STM32F407,接收到数据写进W25Q128,IAP从W25Q128读取bin文件数据然后写进内部flash,做了CRC校验,断点在线调试,查看写进W25Q128里和读取到的数据都是正确的,但写完内部flash后IAP跳转到APP时就死机了,跳转前有将全部中断都关掉的,这是什么原因呢,有人用过外部flash芯片做IAP升级的吗?

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2017-1-18 10:16:33 | 显示全部楼层
APP地址设置正确吗?

出0入0汤圆

发表于 2017-1-18 10:17:50 | 显示全部楼层
为什么要经过W25Q128做IAP。

出0入0汤圆

 楼主| 发表于 2017-1-18 10:21:31 | 显示全部楼层
hyghyg1234 发表于 2017-1-18 10:17
为什么要经过W25Q128做IAP。

因为做的项目,内部的flash已经600多K了,bin文件也五六百K了,内部flash 1M预留备份区来保存bin文件数据是不够了,所以想把bin文件保存到W25Q128再读出来覆盖APP,实现升级。

出0入0汤圆

 楼主| 发表于 2017-1-18 10:24:43 | 显示全部楼层
huangrui 发表于 2017-1-18 10:16
APP地址设置正确吗?

APP地址是正确的,小代码量时把内部flash做备份区,是可以实现IAP升级的,现在因为代码量变大了想换一种方式保存到W25Q128,再读取写到内部flash里,遇到了问题。

出0入0汤圆

发表于 2017-1-18 10:25:25 | 显示全部楼层
放出你的IAP程序来,我帮你看看,我最近有做过大容量IAP,估计能帮到你。

出0入0汤圆

 楼主| 发表于 2017-1-18 10:39:52 | 显示全部楼层
hyghyg1234 发表于 2017-1-18 10:25
放出你的IAP程序来,我帮你看看,我最近有做过大容量IAP,估计能帮到你。

#define WRITE_ADDRESS 0x8010000
#define APPLICATION_ADDRESS   (uint32_t)(0x08010000)


void updataApplication(__IO uint32_t* ReadAddress,__IO uint32_t* WriteAddress)
{
                u8 n;
          u8 datatemp[516];
                uint32_t data[128];
                int lent=0,leng=0;;
                FLASH_Unlock();              
                FLASH_If_Erase(WRITE_ADDRESS);   
       
//                while(*ReadAddress<0x8100000)  
//                {
//                        data=*(uint32_t*)*ReadAddress;   
//                        FLASH_ProgramWord(*WriteAddress, data);   
//                        *ReadAddress += 4;         
//                        *WriteAddress+= 4;                
//                }
       

                while(*WriteAddress<0x8100000)
                {
                       
//                        FLASH_If_Write(&WriteAddress, data ,4096*256);
                        W25QXX_Read(datatemp,w52q128_addr+4096*512,516);
                        lent = datatemp[0]*256+datatemp[1];               
                        if((datatemp[lent+2]==CRC16_2(datatemp,lent+2)%256)&&(datatemp[lent+3]==CRC16_2(datatemp,lent+2)/256%256))
                        {
                                 leng = lent/4;
                                 if((lent%4)!=0) leng++;
                                 memset(data,0xFF,sizeof(uint32_t)*128);
                                 for(n=0;n<leng;n++)
                                 {
                                          data[n] = datatemp[(n*4)+5]*256*256*256 + datatemp[(n*4)+4]*256*256 + datatemp[(n*4)+3]*256 + datatemp[n*4+2];       
                                                FLASH_ProgramWord(*WriteAddress, data[n]);           
                                                *WriteAddress+= 4;                                                  
                                 }       
                                 w52q128_addr+=516;
                                 if(lent<512)     //tftp最后一个包小于512字节
                                 {
                                         FLASH_Lock();     
                                         break;
                                 }                                         
                        }       
                                       
                }                       
               
                FLASH_Lock();     
}

void stm32_app()
{
         if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
        {
                AppAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);         
                Jump_To_Application = (pFunction) AppAddress;                       
                __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);                
                __disable_irq();                    //关闭所有中断
                Jump_To_Application();                                                                   //执行应用程序
               
        }
}
因为公司项目,加密了不能把全部源码上传,这是IAP里的主要两个函数

出0入0汤圆

发表于 2017-1-18 10:50:31 | 显示全部楼层
另外我来说几个排错的方法。
1.跳转APP前关闭中断,复位串口还有其他外设,我曾经因为没有复位串口弄了很久才解决。
2.W25Q128如果内容写对了,需要确认内部flash是否写对了,进到调试里边看,之前我也遇到写内部flash出错的。
3.APP程序是否正确,试着直接把APP直接下载进去看是否运行正确。

出0入0汤圆

发表于 2017-1-18 11:09:58 | 显示全部楼层
我的已经调试成功,你要检查 STM32 ST-LINK Utility   你要升级的地址是不是已经写进去。而且要注意一下103和407 FLASH写入是有区别的,主要是扇区大小不同。要先擦再写。 我开始就是将这个地址搞错了。

出0入0汤圆

 楼主| 发表于 2017-1-18 11:30:14 | 显示全部楼层
wind2100 发表于 2017-1-18 11:09
我的已经调试成功,你要检查 STM32 ST-LINK Utility   你要升级的地址是不是已经写进去。而且要注意一下103 ...

请问你用的也是外部flash芯片来保存bin文件吗,你说的地址是修改的中断向量表的地址吗,能共享你代码来学习吗,这个问题困扰了很久

出0入0汤圆

 楼主| 发表于 2017-1-18 11:36:11 | 显示全部楼层
hyghyg1234 发表于 2017-1-18 10:50
另外我来说几个排错的方法。
1.跳转APP前关闭中断,复位串口还有其他外设,我曾经因为没有复位串口弄了很久 ...

IAP里没有用到串口外设,只有APP里才有。根据写入函数FLASH_ProgramWord(*WriteAddress, data[n]);  返回的状态是正确的,APP用j-link烧写进去是能正常运行的。还有什么会影响到的吗

出0入0汤圆

发表于 2017-1-18 12:19:41 | 显示全部楼层
wind2100 发表于 2017-1-18 11:09
我的已经调试成功,你要检查 STM32 ST-LINK Utility   你要升级的地址是不是已经写进去。而且要注意一下103 ...

对,扇区大小要注意,103我是以1024大小去写的,407应该也是可以用1024.只要是1024的整数倍都可以。

出0入0汤圆

发表于 2017-1-18 12:23:08 | 显示全部楼层
本帖最后由 hyghyg1234 于 2017-1-18 12:26 编辑

比较好的办法就是在调试下面看memory,然后再打开bin文件对比下是否正确。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入31汤圆

发表于 2017-1-18 12:37:21 来自手机 | 显示全部楼层
把flash内容弄出来比较一下

出0入0汤圆

发表于 2017-1-18 12:40:57 来自手机 | 显示全部楼层
呵呵,应用程序的跳转地址是app+4,前4个字节是堆栈首地址

出0入0汤圆

 楼主| 发表于 2017-1-18 13:25:51 | 显示全部楼层
hyghyg1234 发表于 2017-1-18 12:23
比较好的办法就是在调试下面看memory,然后再打开bin文件对比下是否正确。

...

    看memory和bin文件比较,数据是对的,说明bin文件数据是写进flash了的,还发现个奇葩问题,就是当我用j-link把IAP和APP程序烧写进去后,不修改APP程序的话,升级是正常的(不管升级多少次),当我随便修改一下APP程序后,升级,IAP跳转APP时就挂了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2017-1-18 13:36:20 | 显示全部楼层
风中答案 发表于 2017-1-18 13:25
看memory和bin文件比较,数据是对的,说明bin文件数据是写进flash了的,还发现个奇葩问题,就是当我 ...

bin的开始和结束都核对一下(确认bin文件都写进去就找IAP的问题了)。另外遇到莫名的有时能跳转有时不能,或者加一点什么内容又不行的时候,基本都是IAP有问题,尽量把所有初始化过的硬件都复位。我之前遇到的问题就是加一个delay就不能跳转或者加一个printf不能跳转。

出0入0汤圆

发表于 2017-1-18 14:07:36 | 显示全部楼层
风中答案 发表于 2017-1-18 13:25
看memory和bin文件比较,数据是对的,说明bin文件数据是写进flash了的,还发现个奇葩问题,就是当我 ...

怎么可能,APP怎么改,都行,不要超过容量,先可以ST LINK下载试一下,能不能跑起来,再用你自己的IAP程序试,就知道问题在哪里了。
注意禁用了IRQ 要再次打开。
APP本身要能运行,不行进去也是一堆错,跳入ERROR

出0入0汤圆

发表于 2017-1-18 14:21:53 | 显示全部楼层
风中答案 发表于 2017-1-18 11:30
请问你用的也是外部flash芯片来保存bin文件吗,你说的地址是修改的中断向量表的地址吗,能共享你代码来学 ...

外部FLASH 只要你检测CRC校验值就好了,32自带32BIT CRC啊,很好用。
打印出来看就对了,
对不对全部CRC看结果。
SPI FLASH 读出来看, f407也是可以读出FLASH 计算CRC的,再对比一下,就知道了。
你不是已经跑起来了吗?
我也是看坛里面的  

注明下:是坛友的,网址我忘记了。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2017-1-18 16:25:21 | 显示全部楼层
wind2100 发表于 2017-1-18 14:21
外部FLASH 只要你检测CRC校验值就好了,32自带32BIT CRC啊,很好用。
打印出来看就对了,
对不对全部CRC ...

有做CRC检验的,tftp接收到每包数据后,在每一包最后都做了CRC16校验才写到W25Q128,读出来时都先判断CRC再把数据写到内部flash里。现在碰到问题是,当我用J-Link烧写IAP和APP程序,能正常运行,用J-Link烧写完后,不修改APP程序,能进行升级,IAP跳转APP没问题,但当我随便修改了APP程序后,再升级的话,IAP跳转APP时就死机了,没任何反映应了,在跳转APP那断点看memory,就是上面的图片所示,和bin文件数据比较,是正确的。跑的是freeRTOS系统,跳转前有把全部中断关掉的。

出0入0汤圆

发表于 2017-1-18 17:22:43 | 显示全部楼层
风中答案 发表于 2017-1-18 16:25
有做CRC检验的,tftp接收到每包数据后,在每一包最后都做了CRC16校验才写到W25Q128,读出来时都先判断CRC ...

你的boot在往片内flash写APP程序的时候有没有先擦再写呢?

出0入31汤圆

发表于 2017-1-18 17:28:30 来自手机 | 显示全部楼层
int 发表于 2017-1-18 17:22
你的boot在往片内flash写APP程序的时候有没有先擦再写呢?

要是这个问题要打屁屁了

出0入31汤圆

发表于 2017-1-18 17:32:08 来自手机 | 显示全部楼层
jtag把app读出来保存为bin文件与原始文件比较,先排内部flash写的对不对,一步一步来,逐步排除

出0入0汤圆

发表于 2017-1-18 17:39:16 | 显示全部楼层
if (((*(vu32*)appaddr) & 0x2FF80000 ) == 0x20000000)//ÆðʼµØÖ·Ç°4×Ö½ÚÊÇSRAM´ó429-256K 看跳转这里 RAM的判断的

出0入0汤圆

发表于 2017-1-18 18:58:25 | 显示全部楼层
zchong 发表于 2017-1-18 17:28
要是这个问题要打屁屁了

哈哈,从描述来看还是有一点点这个可能的

出0入0汤圆

发表于 2017-1-19 08:37:39 | 显示全部楼层
风中答案 发表于 2017-1-18 16:25
有做CRC检验的,tftp接收到每包数据后,在每一包最后都做了CRC16校验才写到W25Q128,读出来时都先判断CRC ...

我看了,你是没设置中断向量,由于F4的中断向量要写寄存器了,没有库函数
你的APP一开中断,就死了,这货可以仿真的。就知道哪里跑飞了。

你玩这个的时候,不要急于将自己的项目放进来,做一个例子,这样就可以将工程放进来,不然,你自己慢慢找问题。

出0入0汤圆

发表于 2017-1-19 14:57:59 | 显示全部楼层
有没有重置向量表?

出0入0汤圆

 楼主| 发表于 2017-1-19 16:01:46 | 显示全部楼层
wind2100 发表于 2017-1-19 08:37
我看了,你是没设置中断向量,由于F4的中断向量要写寄存器了,没有库函数
你的APP一开中断,就死了,这货 ...

APP里有设置中断向量表的SCB->VTOR = FLASH_BASE | 0x10000;  之前代码量小的时候,有通过直接用内部flash做备份区来保存bin文件,实现IAP升级的,测试没问题的,现在因为加入网页数据,ROM变大了,才想通过W25Q128保存bin实现升级的。然后碰到了这个问题。

出0入0汤圆

发表于 2017-1-19 17:06:08 | 显示全部楼层
跳转完后掉电重启。分开写boot和APP.,APP启动时候判断升级。不升级或升级成功进入APP。升级失败或启动失败继续升级。

出0入0汤圆

发表于 2017-1-19 17:10:42 | 显示全部楼层
将两个程序合并后写到单片机看看能不能正常运行

出0入31汤圆

发表于 2017-1-19 19:06:24 | 显示全部楼层
我就不信了,如果通过外部flash最终写入到内部flash的数据和原始bin文件相同,那就相当奇怪了,这就和直接jtag写进去是一模一样了啊
楼主到底有没有确认过这个问题,内部flash的内容和你的bin是否完全一致?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 09:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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