IAP收取完bin包后,无法进入新的APP,请支招

2019-08-14 03:11发布

功能背景:
1、使用STM32F103VET6的芯片,64K的SRAM,512K的FLASH,76K的bin升级包。无法一次收取缓存bin包,只能分开两次接收,一次50k,一次26k。APPBuffer=[1024*55],FLASH_APP1_ADDR地址为0x08010000。
2、收发bin包方式:上位机分解bin包,每帧516字节,格式为:包头,帧序号,512字节bin,CRC_H,CRCL。
                           下位机收取bin包,校验每帧,提取512字节bin写入APPBuffer,收满100包50K,写入0x8010000flash。清空APPBuffer,再接收剩下26Kbin包,再写入0x801c800,进入APP。
3、收取这76Kbin包每一帧校验都正确。
附上分帧处理程序,请大侠指点。
///////////////////////////复制第二轮bin包到flash/////////////////////////////////
if (CmdBuffer[0] == 0xAA && CmdBuffer[1] == 0x55 && rec_check == cal_check)//复制剩下数据到FLASH
{
        iap_write_appbin(FLASH_APP1_ADDR+0xc800, APPBuffer, APP_length-51200);
        u3_printf("update finish ");
}
//////////////////////////执行新APP,进入APP///////////////////////////////////////                       
if (CmdBuffer[0]==0xBB &&CmdBuffer[1]==0x55&&rec_check==cal_check)        //运行新程序
{
        flag_jump = 0xAAAA;
        Test_Write(FLASH_DATA_JUMP, flag_jump);
        u3_printf("load app ");
        delay_ms(10);
        iap_load_app(FLASH_APP1_ADDR);                                //执行FLASH APP代码
}
                        /////////////////////////////////////////////////////////////
if (CmdBuffer[0] == 0xF9 && rec_check == cal_check)                                                                 //接收最后不满一帧数据
{
        u3_printf("收到数据包编号:%d……………………正确 ", CmdBuffer[1]);
        memcpy((APPBuffer + (CmdBuffer[1]-101) * 512), (CmdBuffer + 2), Cmd_Count-4);//
        APP_length = CmdBuffer[1] * 512 + Cmd_Count - 4;                                                        //计算程序包字节大小
        u3_printf("数据传输完毕,APP_length = %d ",APP_length);
}                       
                       
if (CmdBuffer[0] == 0xF8 && rec_check == cal_check)                                                                //正确接收满一帧的分包数据
{                               
        if(CmdBuffer[1]<=100)                //收取第一轮100个帧包的数据50k
        {       
                if(CmdBuffer[1]==100)        //收取第100个帧包
                {
                        u3_printf("收到数据包编号:%d……………………正确 ", CmdBuffer[1]);
                        memcpy((APPBuffer + CmdBuffer[1] * 512), (CmdBuffer + 2), 512);                //提取前100个升级包数据
                        iap_write_appbin(FLASH_APP1_ADDR, APPBuffer, 51200);                                //复制前100个升级包到flash空间
                        memset(APPBuffer,0,51200);                                                                                        //清空数据接收缓冲区
                        u3_printf("第一轮数据复制成功,缓冲区已清空 ");
                }
                else                                          //收取0~99个帧包
                {
                        u3_printf("收到数据包编号:%d……………………正确 ", CmdBuffer[1]);
                        memcpy((APPBuffer + CmdBuffer[1] * 512), (CmdBuffer + 2), 512);                //提取前100个升级包数据
                }
        }
        else                //第一轮接收完成100个数据包,收取剩下的数据
        {
                u3_printf("收到数据包编号:%d……………………正确 ", CmdBuffer[1]);
                memcpy((APPBuffer + ( CmdBuffer[1]-101 )* 512), (CmdBuffer + 2), 512);        //提取剩下程序数据包数据                                                                                                //清空接收数组缓存
        }
}
else
{
        u3_printf("收到数据包编号:%d……………………错误,请注意! ", CmdBuffer[1]);       
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
leozzd
2019-08-14 18:21
正点原子 发表于 2017-9-4 00:52
单步仿真,接收第一批数据开始,看接收到的数据,写入后的数据,是否和预期的一样。
仿真可以解决这种问 ...

原子哥,从调试中断的memory Window种查到,后面的26k数据叠到前50k的末尾,也就是第101个包叠到了第100个包的末尾。每个包512个字节,就是512*100/1024=50k,相应的地址偏移就是0x8010000~0x801c800。剩下的26k数据相应的地址偏移就是0x801c800开始往后。这样计算没错吧。 QQ图片20170905102216.png
记事本是我下发的测试程序包数据,F8 65往后就是101个包的数据,从memory Window看到,F8 65前面的数据对应着记事本最开头的数据,也就是方框内的数据不见了,被F8 65后的数据盖掉了。这是地址哪里算错了吗 ?

一周热门 更多>