基于机智云物联网平台MCU模式基础教程及远程OTA( 三 )


APP驱动编写
app.c
1.
/**2.****************************************************3.*@file:main.c4.*@brief:Mainprogrambody5.****************************************************6.*@attention7.*8.*<h2><center>?Copyright(c)2019STMicroelectronics.9.*Allrightsreserved.</center></h2>10.*11.*ThissoftwarecomponentislicensedbySTunderBSD3-Clauselicense,12.*the"License";Youmaynotusethisfileexceptincompliancewiththe13.*License.YoumayobtainacopyoftheLicenseat:14.*opensource.org/licenses/BSD-3-Clause15.*16.****************************************************17.*/18./*Includes------------------------------------------------------------------*/19.#include"app.h"20.#include"../Src/md5/gagent_md5.h"21.#include"../Hal/flash.h"22.#include"usart.h"23.24./*GlobalVariable*/25./**26.*@briefMainprogram.27.*@paramNone28.*@retvalNone29.*/30.update_param_defupdate_param;31.uint8_tmd5_calc[SSL_MAX_LEN];32.MD5_CTXctx;33.voidmcu_restart()34.{35.//__set_FAULTMASK(1);36.NVIC_SystemReset();37.}38.int8_tROM_MD5_Check(uint32_tsys_size,uint32_tFlashAddr,uint8_t*ssl)39.{40.uint8_tupdate_data_tmp[PIECE_MAX];41.uint32_tload_loop=0;42.uint32_tremaind_data_len=sys_size;43.uint32_tvalid_data_len=0;44.45.GAgent_MD5Init(&ctx);46.if(0==sys_size%PIECE_MAX)47.{48.load_loop=sys_size/PIECE_MAX;49.}50.else51.{52.load_loop=sys_size/PIECE_MAX+1;53.}54.#ifdefDEBUG55.printf("CheckNewSys...loop=%drn",load_loop);56.#endif57.for(uint32_ti=0;i<load_loop;i++)58.{59.if(remaind_data_len>PIECE_MAX)60.{61.valid_data_len=PIECE_MAX;62.}63.else64.{65.valid_data_len=remaind_data_len;66.}67.memset(update_data_tmp,0,PIECE_MAX);68.rFlashData(update_data_tmp,valid_data_len,FlashAddr+i*PIECE_MAX);69.GAgent_MD5Update(&ctx,update_data_tmp,valid_data_len);70.remaind_data_len=remaind_data_len-valid_data_len;71.#ifdefDEBUG72.printf("*");73.#endif74.}75.#ifdefDEBUG76.printf("rn");77.#endif78.GAgent_MD5Final(&ctx,md5_calc);79.#ifdefDEBUG80.printf("MD5CalculateSuccessrn");81.#endif82.if(memcmp(ssl,md5_calc,SSL_MAX_LEN)!=0)83.{84.#ifdefDEBUG85.printf("Md5_CaclCheckFaild,MCUOTAFaildrn");86.#endif87.#ifdefPROTOCOL_DEBUG88.printf("MD5:");89.for(uint16_ti=0;i<SSL_MAX_LEN;i++)90.{91.printf("%02x",md5_calc[i]);92.}93.printf("rn");94.#endif95.return-1;96.}97.else98.{99.#ifdefDEBUG100.printf("MD5CheckSuccess,MCUOTASuccessrn");101.#endif102.return0;103.}104.}105.uint8_tupdate_new_system(uint32_tsys_size)106.{107.uint8_tupdate_data_tmp[PIECE_MAX];108.uint32_tload_loop=0;109.uint32_tremaind_data_len=sys_size;110.uint32_tvalid_data_len=0;111.112.if(0==sys_size%PIECE_MAX)113.{114.load_loop=sys_size/PIECE_MAX;115.}116.else117.{118.load_loop=sys_size/PIECE_MAX+1;119.}120.#ifdefDEBUG121.printf("CopyNewSys...loop=%drn",load_loop);122.#endif123.124.flash_erase(update_param.rom_size,SYS_APP_SAVE_ADDR_BASE);125.#ifdefDEBUG126.printf("CopyNewSysrn");127.#endif128.for(uint32_ti=0;i<load_loop;i++)129.{130.if(remaind_data_len>PIECE_MAX)131.{132.valid_data_len=PIECE_MAX;133.}134.else135.{136.valid_data_len=remaind_data_len;137.}138.memset(update_data_tmp,0,PIECE_MAX);139.rFlashData(update_data_tmp,valid_data_len,SYS_APP_BAK_SAVE_ADDR_BASE+i*PIECE_MAX);140.141.wFlashData(update_data_tmp,valid_data_len,SYS_APP_SAVE_ADDR_BASE+i*PIECE_MAX);142.remaind_data_len=remaind_data_len-valid_data_len;143.#ifdefDEBUG144.printf(".");145.#endif146.}147.#ifdefDEBUG148.printf("rn");149.printf("CopySuccess,WaittoCheck...rn");150.#endif151.152.if(0==ROM_MD5_Check(update_param.rom_size,SYS_APP_SAVE_ADDR_BASE,update_param.ssl_data))153.{154.#ifdefDEBUG155.printf("NewROMCheckSuccess,WaittoLoadNewSystermrn");156.#endif157.flash_erase(sizeof(update_param_def),UPDATE_PARAM_SAVE_ADDR_BASE);158.mcu_restart();159.}160.else161.{162.#ifdefDEBUG163.printf("NewROMCheckFaild,UpdateFaild,MCUTryToUpdateAgain,MCURestart...rn");164.#endif165.mcu_restart();166.}167.168.return0;169.}170.voidAPP_Process(void)171.{172.memset((uint8_t*)&update_param,0,sizeof(update_param_def));173.rFlashData((uint8_t*)&update_param,sizeof(update_param_def),UPDATE_PARAM_SAVE_ADDR_BASE);174.if(0xEEEE==update_param.rom_statue)175.{176.#ifdefDEBUG177.printf("UpdateTask,SysWillLoadNewSys..WaitForAMomentrn");178.printf("UpdateSize[%d]rn",update_param.rom_size);179.#endif180.if(0==ROM_MD5_Check(update_param.rom_size,SYS_APP_BAK_SAVE_ADDR_BASE,update_param.ssl_data))181.{182.update_new_system(update_param.rom_size);183.}184.else185.{186.#ifdefDEBUG187.printf("CheckFaild,GotoOldSystermrn");188.#endif189.flash_erase(sizeof(update_param_def),UPDATE_PARAM_SAVE_ADDR_BASE);190.if(((*(vu32*)(SYS_APP_SAVE_ADDR_BASE+4))&0xFF000000)==0x08000000)191.{192.#ifdefDEBUG193.printf("SysWillLoadAPP.....rn");194.#endif195.iap_load_app(SYS_APP_SAVE_ADDR_BASE);196.}197.else198.{199.#ifdefDEBUG200.printf("StartAPPFailed!rn");201.#endif202.}203.}204.205.}206.else207.{208.#ifdefDEBUG209.printf("NoUpdateTask,GoToAPP....%04Xrn",update_param.rom_statue);210.#endif211.if(((*(vu32*)(SYS_APP_SAVE_ADDR_BASE+4))&0xFF000000)==0x08000000)212.{213.#ifdefDEBUG214.printf("SysWillLoadAPP.....rn");215.#endif216.iap_load_app(SYS_APP_SAVE_ADDR_BASE);217.}218.else219.{220.#ifdefDEBUG221.printf("StartAPPFailed!rn");222.223.#endif224.225.}226.}227.}复制代码