网站首页 > 编程文章 正文
资产监测设备出厂后需要进行升级,现场升级浪费人力物力。基于此背景下,AOVX云息通信研发团队的工作人员通过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区,避免因升级失败而导致升级成砖。
- 上一篇: 扒一扒单片机串口IAP原理
- 下一篇: 最具性价比的通话平板 原道M7S现场评测
猜你喜欢
- 2025-05-27 基于RS-485总线与无线射频的智能供暖通讯系统的设计研究
- 2025-05-27 AGV专业术语大全
- 2025-05-27 齐安安小课堂 | 串口数据抓取以及串口数据模拟
- 2025-05-27 最具性价比的通话平板 原道M7S现场评测
- 2025-05-27 扒一扒单片机串口IAP原理
你 发表评论:
欢迎- 05-30欧姆龙CP1H系列PLC通讯扩展与数据采集
- 05-30轻松通过OPC UA协议访问西门子1500数据
- 05-30Smart200与Wincc的通信
- 05-30西门子PLC中的OPC UA应用
- 05-30上位机与MES数据交互的常用方案
- 05-30网关与PLC之间的通信
- 05-30Kepware连接时序数据库--Get!
- 05-30如何在OPC上进行两台PLC的数据交换
- 最近发表
- 标签列表
-
- spire.doc (70)
- system.data.oracleclient (61)
- 按键小精灵源码提取 (66)
- pyqt5designer教程 (65)
- 联想刷bios工具 (66)
- c#源码 (64)
- graphics.h头文件 (62)
- mysqldump下载 (66)
- sqljdbc4.jar下载 (56)
- libmp3lame (60)
- maven3.3.9 (63)
- 二调符号库 (57)
- 苹果ios字体下载 (56)
- git.exe下载 (68)
- diskgenius_winpe (72)
- pythoncrc16 (57)
- solidworks宏文件下载 (59)
- qt帮助文档中文版 (73)
- satacontroller (66)
- hgcad (64)
- bootimg.exe (69)
- android-gif-drawable (62)
- axure9元件库免费下载 (57)
- libmysqlclient.so.18 (58)
- springbootdemo (64)
本文暂时没有评论,来添加一个吧(●'◡'●)