环境监测设备中对BC260Y进行OTA升级

Posted 瑞奇Ricky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了环境监测设备中对BC260Y进行OTA升级相关的知识,希望对你有一定的参考价值。

资产监测设备出厂后需要进行升级,现场升级浪费人力物力。基于此背景下,研发团队的工作人员通过OTA进行远程升级。

以下介绍BC260Y进行远程升级。
void Modem_Process(void)
{
static uint8_t CNT=0,Errocde=0,OTA_Errcode=0,OTA_CNT=0;
uint8_t u8Ret,u8Erascnt;
uint16_t i;
uint32_t u32AppFlag;
switch(FrameStatus)
{
case FRAME_IDLE_STATUS: /空闲状态/
CNT+=1;
FrameStatus = FRAME_CONNECT_STATUS;
break;
case FRAME_CONNECT_STATUS: /连接OTA服务器/
UsartSendStr(Debug_Uart,“连接OTA服务器…\\n”);
if(Connect_OTA())
{
FrameStatus = FRAME_VERSION_STATUS;
CNT=0;
UsartSendStr(Debug_Uart,“OTA服务器连接成功…\\n”);
AT_Step(NULL,AT_Buff,“AT+QICFG=“dataformat”,1,0\\r\\n”,“OK”,101000,101000);
}
else
{
FrameStatus = FRAME_IDLE_STATUS;
UsartSendStr(Debug_Uart,“OTA服务器连接失败,重新连接…\\n”);
}
break;
case FRAME_VERSION_STATUS: /查询是否存在新版本/
Get_Version();
UsartSendStr(Debug_Uart,“查询版本更新…\\n”);
// AT_Step(NULL,AT_Buff,“AT+QICFG=“dataformat”,1,0\\r\\n”,“OK”,101000,101000);
if(AT_SendData(DataPackage,19))
{
if(OTADataHandle()==Ok)
CNT =0;
else
CNT+=1;
}
else
CNT+=1;
break;
case PACKET_CMD_APP_DOWNLOAD : /获取程序包大小/
Get_APP_Package();
UsartSendStr(Debug_Uart,“获取升级包大小…\\n”);
if(AT_SendData(DataPackage,11))
{
if(OTADataHandle()==Ok)
{
printf(“数据包大小为:%d字节,%d帧”,FrameData,FrameDataIndex);
CNT =0;
}
else
CNT+=1;
}
else
CNT+=1;
break;
case PACKET_CMD_APP_UPLOAD: /获取帧数据/
Get_Seq_Package();
if(AT_SendData(DataPackage,12))
{
if(OTADataHandle()==Ok)
{
printf(“数据包校验成功…\\n”);
CNT =0;
}
else
{
printf(“数据包错误…\\n”);
CNT+=1;
}
}
else
CNT+=1;
break;
case PACKET_CMD_ERASE_APP2:
UsartSendStr(Debug_Uart,“擦除APP2指定数量扇区…\\n”);
for (u8Erascnt=0; u8Erascnt<200; u8Erascnt++) //擦除指定数量的扇区
{
u8Ret = Flash_SectorErase(APP2 + (u8Erascnt * FLASH_SECTOR));
if (Ok != u8Ret) //如果擦除失败,反馈上位机错误代码
{
CNT+=1;
break;
}
}
UsartSendStr(Debug_Uart,“APP2擦除成功…\\n”);
CNT = 0;
if(Errocde)
FrameStatus = PACKET_CMD_JUMP_TO_APP;
else
FrameStatus = PACKET_CMD_APP_DOWNLOAD;
break;
case PACKET_CMD_WRITE_APP2: /升级数据写入Flash/
u8Ret = FlashWriteBytes(APP2+512FrameSeqIndex,AppData, 512); //把所有数据写入flash
if (Ok != u8Ret) //如果擦除失败,反馈上位机错误代码
{
CNT+=1;
printf(“第%d帧写入失败,擦除重写…\\n”,FrameSeqIndex);
Flash_SectorErase(APP2+(FrameSeqIndexFLASH_SECTOR));
break;
}
else
{
CNT = 0;
if(FrameSeqIndex<(FrameDataIndex-1))
{
printf(“第%d帧写入成功,进行下一帧操作…\\n”,FrameSeqIndex);
FrameSeqIndex +=1;
FrameStatus = PACKET_CMD_APP_UPLOAD;
}
else
{
printf(“第%d帧写入成功,进行数据转移…\\n”,FrameSeqIndex);
FrameSeqIndex = 0;
FrameStatus = PACKET_CMD_ERASE_APP1;
}
}
break;
case PACKET_CMD_ERASE_APP1:
UsartSendStr(Debug_Uart,“擦除APP1指定数量扇区…\\n”);
for (u8Erascnt=0; u8Erascnt<200; u8Erascnt++) //擦除指定数量的扇区
{
u8Ret = Flash_SectorErase(APP1 + (u8Erascnt * FLASH_SECTOR));
if (Ok != u8Ret)
{
CNT+=1;
break;
}
}
UsartSendStr(Debug_Uart,“APP1擦除成功…\\n”);
memset(AppData,0,1050);
CNT = 0;
FrameStatus = PACKET_CMD_APP2_APP1;
break;
case PACKET_CMD_APP2_APP1: /从APP2读取512数据写入APP1/
for(i=0;i<512;i++)
*((uint8_t )AppData+i) = (((uint8_t * )APP2)+i+FrameSeqIndex512);
u8Ret = FlashWriteBytes(APP1+512FrameSeqIndex,AppData, 512); //把所有数据写入flash
if (Ok != u8Ret) //如果写入失败,反馈上位机错误代码
{
CNT+=1;
printf(“第%d帧写入失败,重新读取写入…\\n”,FrameSeqIndex);
break;
}
CNT = 0;
if(FrameSeqIndex<(FrameDataIndex-1))
{
printf(“第%d帧写入成功,进行下一帧操作…\\n”,FrameSeqIndex);
FrameSeqIndex +=1;
}
else
{
printf(“第%d帧写入成功,APP1写入完成…\\n”,FrameSeqIndex);
FrameStatus = PACKET_CMD_ERASE_APP2;
FrameSeqIndex = 0;
Errocde =1;
OTA_Errcode = 1;
}
break;
case PACKET_CMD_JUMP_TO_APP:
if(OTA_Errcode)
{
UsartSendStr(Debug_Uart,“跳转至APP…\\n”);
Flash_SectorErase(BOOT_PARA_ADDRESS);
Flash_WriteWord(BOOT_PARA_ADDRESS, APP_FLAG);
PreiModule_DeInit();//CPU外围模块复位
if(IAP_JumpToApp(APP1)==Error)
FrameStatus = PACKET_CMD_APP_UPLOAD;
}
else
{
u32AppFlag = *(__IO uint32_t *)BOOT_PARA_ADDRESS; //读出BootLoader para区标记值
if (0x76543210 == u32AppFlag) //如果标记值等于APP_FLAG,表示不需要升级APP程序
{
OTA_CNT+=1;
if(OTA_CNT>3)
{
UsartSendStr(Debug_Uart,“升级失败,跳转至Preapp…\\n”);
Flash_SectorErase(BOOT_PARA_ADDRESS);
Flash_WriteWord(BOOT_PARA_ADDRESS, APP_FLAG);
PreiModule_DeInit();//CPU外围模块复位
IAP_JumpToApp(APP1); //则直接跳转至APP
}
}
FrameSeqIndex = 0;
CNT = 0;
UsartSendStr(Debug_Uart,“升级失败,重新下载…\\n”);
FrameStatus = FRAME_IDLE_STATUS;
}
break;
default :
break;
}
if(CNT>4)
FrameStatus = PACKET_CMD_JUMP_TO_APP;
}

其中因为网络的限制,传输过程不稳定,因此做一些处理,每次数据包进行首尾/帧以及CRC校验。如果传输失败重新接收此帧数据,如果到达设定次数后,仍未成功,则退出重新升级。整体升级不成功则返回之前的APP区,避免因升级失败而导致升级成砖。

以上是关于环境监测设备中对BC260Y进行OTA升级的主要内容,如果未能解决你的问题,请参考以下文章

资产监测设备中关于OPL1200 芯片OTA升级的API说明

MCU通过UART实现OTA在线升级流程

MCU通过UART实现OTA在线升级流程

物联网中利用OTA进行远程升级的详细操作方法

物联网设备OTA软件升级之:升级包下载过程之旅

物联网设备OTA软件升级之:完全升级和增量升级