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 14:06
本帖最后由 leozzd 于 2017-9-3 12:00 编辑
正点原子 发表于 2017-9-2 22:06
你先看看你接收到的数据长度,对不对吧

从串口打印出的情况看,串口收取到每帧的数据长度都对,CRC校验都对。原子哥,你看我这个分包处理的函数会存在问题吗。有没有一种可以连续打印flash地址中从0x8010000到整个bin包大小地址结束的操作。调试中发现BootLoader停在了hardfault,只能怀疑写入flash数据出错了。或者能不能在keil的debug中memory window中看到flash写入的内容

一周热门 更多>