功能背景:
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]);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
从串口打印出的情况看,串口收取到每帧的数据长度都对,CRC校验都对。原子哥,你看我这个分包处理的函数会存在问题吗。有没有一种可以连续打印flash地址中从0x8010000到整个bin包大小地址结束的操作。调试中发现BootLoader停在了hardfault,只能怀疑写入flash数据出错了。或者能不能在keil的debug中memory window中看到flash写入的内容
一周热门 更多>