基于机智云物联网平台MCU模式基础教程及远程OTA( 二 )
配置时钟72M
10.在产品的OTA界面进行固件升级 , 升级配置如下 , 手动推送需要主动更新 , 静默推送自动更新 , 其余按照要求配置即可 。 
文章图片
到此本教程结束 , 如有疑问联系机智云技术支持 , 15120205205(QQ,微信 , 电话同号)
FLASH驱动编写
Flash.c
1
#include"flash.h"2.#include<stdio.h>3.#include<string.h>4.volatileuint32_tflashWriteOffset=SYS_APP_BAK_SAVE_ADDR_BASE;5.volatileuint32_tflashReadOffset=SYS_APP_BAK_SAVE_ADDR_BASE;6./*Exportedtypes------------------------------------------------------------*/7./**@defgroupFLASH_Exported_TypesFLASHExportedTypes8.*@{9.*/10./*MCUOTA*/11.voidflash_erase_page(uint8_tflashPage,uint32_taddr_base)12.{13.HAL_FLASH_Unlock();14.FLASH_EraseInitTypeDeff;15.f.TypeErase=FLASH_TYPEERASE_PAGES;16.f.PageAddress=flashPage+(addr_base-SYS_Bootloader_SAVE_ADDR_BASE)/FLASH_PAGE_SIZE;17.f.NbPages=1;18.19.uint32_tPageError=0;20.HAL_FLASHEx_Erase(&f,&PageError);21.HAL_FLASH_Lock();22.}23.voidflash_erase(uint32_tsize,uint32_taddr_base)24.{25.uint32_tflashPageSum;26.uint32_ti;27./*如果小于2048做处理*/28.if(size<FLASH_PAGE_SIZE)29.size=FLASH_PAGE_SIZE;//30./*计算需要擦写的Flash页*/31.if((size%FLASH_PAGE_SIZE)==0)32.{33.flashPageSum=size/FLASH_PAGE_SIZE;//小于一页擦除一页34.}35.else36.{37.flashPageSum=(size/FLASH_PAGE_SIZE)+1;//大于一页擦除n+1页38.}39.for(i=0;i<flashPageSum;i++)40.{41.flash_erase_page(i,addr_base);//基址累加擦除flash42.}43.}44.45.voidwriteFlash(uint64_t*buf_to_save,uint16_tlen,uint32_twFlashAddr)46.{47.uint16_tcount=0;48.if(wFlashAddr>=0x08020000)49.{50.#ifdefDEBUG51.printf("Waring:FlashWriteAddrErrorrn");52.#endif53.flashWriteOffset=SYS_APP_BAK_SAVE_ADDR_BASE;54.return;55.}56.HAL_FLASH_Unlock();57.58.while(count<len)59.{60.HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD,(wFlashAddr+count*8),buf_to_save[count]);//вflash????д???è16λé61.count++;62.}63.HAL_FLASH_Lock();64.}65.66.voidreadFlash(uint64_t*buf_to_get,uint16_tlen,uint32_treadFlashAddr)67.{68.uint16_tcount=0;69.while(count<len)70.{71.buf_to_get[count]=*(uint64_t*)(readFlashAddr+count*8);72.count++;73.}74.}75./*写Flash,控制写长度,Flash地址偏移*/76.voidwFlashData(uint8_t*buf_to_save,uint16_tlen,uint32_twFlashAddr)77.{78.uint8_tWriteFlashTempBuf[PIECE_MAX_LEN];//写Flash临时缓冲区79.uint16_tWriteFlashTempLen=0;//写Flash长度80.uint8_trem;81.memset(WriteFlashTempBuf,0xEE,sizeof(WriteFlashTempBuf));//写Flash临时缓冲区首先全部填充0xEE82.memcpy(WriteFlashTempBuf,buf_to_save,len);//临时缓冲区83.WriteFlashTempLen=len;84.if(len%8!=0)85.{86.rem=len%8;87.WriteFlashTempLen=len+8-rem;88.}89.writeFlash((uint64_t*)&WriteFlashTempBuf,WriteFlashTempLen/8,wFlashAddr);90.}91.voidrFlashData(uint8_t*buf_to_get,uint16_tlen,uint32_trFlashAddr)92.{93.uint8_tReadFlashTempBuf[PIECE_MAX_LEN];//读Flash临时缓冲区94.uint16_tReadFlashTempLen=0;//读Flash长度95.uint8_trem;96.if(len%8==0)97.{98.ReadFlashTempLen=len;99.readFlash((uint64_t*)&ReadFlashTempBuf,ReadFlashTempLen/8,rFlashAddr);100.memcpy(buf_to_get,ReadFlashTempBuf,len);101.}102.else103.{104.rem=len%8;105.ReadFlashTempLen=len+8-rem;106.readFlash((uint64_t*)&ReadFlashTempBuf,ReadFlashTempLen/8,rFlashAddr);107.memcpy(buf_to_get,ReadFlashTempBuf,len);108.}109.}110./***IAP****/111.typedefvoid(*iapfun)(void);112.iapfunjump2app;113.uint16_tiapbuf[1024];114.115.#defineBITBAND(addr,bitnum)((addr&0xF0000000)+0x2000000+((addr&0xFFFFF)<<5)+(bitnum<<2))116.#defineMEM_ADDR(addr)*((volatileunsignedlong*)(addr))117.#defineBIT_ADDR(addr,bitnum)MEM_ADDR(BITBAND(addr,bitnum))118.119.120./*#defineiar121.#ifdefiar122.//设置栈顶地址123.//addr:栈顶地址124.125.voidMSR_MSP(uint32_taddr)126.{127.asm("MSRMSP,r0");128.asm("BXr14");129.}130.#else131.__asmvoidMSR_MSP(uint32_taddr)132.{133.MSRMSP,r0//setMainStackvalue134.BXr14135.}136.#endif137.*/138.__asmvoidMSR_MSP(uint32_taddr)139.{140.MSRMSP,r0//setMainStackvalue141.BXr14142.}143.144.145.voidiap_load_app(uint32_tappxaddr)146.{147.if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)148.{149.#ifdefDEBUG150.printf("StackSuccess!rn");151.#endif152.jump2app=(iapfun)*(vu32*)(appxaddr+4);153.MSR_MSP(*(vu32*)appxaddr);154./*Relocatevectortable*/155.SCB->VTOR=(uint32_t)(appxaddr-SYS_Bootloader_SAVE_ADDR_BASE);156.jump2app();157.}158.else159.{160.#ifdefDEBUG161.printf("StackFailed!rn");162.#endif163.}164.}复制代码
flash.h
1.
#ifndef_FLASH_2.#define_FLASH_3.#include"stm32f1xx_hal.h"4.//#defineDEBUG5.//#definePROTOCOL_DEBUG6.typedefuint32_tu32;7.typedefuint16_tu16;8.typedefuint8_tu8;9.typedef__IOuint32_tvu32;10.typedef__IOuint16_tvu16;11.typedef__IOuint8_tvu8;12./*BootLoaderFlash首地址*/13.#defineSYS_Bootloader_SAVE_ADDR_BASE0x08000000//Bootloader首地址//支持Bootloader大小18KB14./*升级参数存储*/15.#defineUPDATE_PARAM_SAVE_ADDR_BASE0x0800480016.#defineUPDATE_PARAM_MAX_SIZE(2*1024)//支持参数大小2KB17./*APPFlash首地址*/18.#defineSYS_APP_SAVE_ADDR_BASE0x0800500019.#defineAPP_DATA_MAX_SIZE(54*1024)//支持APP大小54KB20./*APPBAKFlash首地址*/21.#defineSYS_APP_BAK_SAVE_ADDR_BASE0x0801280022.#defineAPP_BAK_DATA_MAX_SIZE(54*1024)//支持APP_BAK大小54KB23./*升级参数*/24.#definePIECE_MAX25625.#defineSSL_MAX_LEN1626.typedefstruct27.{28.uint16_trom_statue;29.uint32_trom_size;30.uint8_tssl_data[SSL_MAX_LEN];31.}update_param_def;32./*FLASH页大小*/33.//#defineFLASH_PAGE_SIZE0x400//1KB34./*大数据分片大小*/35.//#defineBIGDATA_PIECE_MAX200//支持的最大数据分片即大数据最大传输单元,200B36.#definePIECE_MAX_LEN25637.voidsave_param_to_flash(uint16_t*buf_to_save,uint16_tlen);38.voidread_param_from_flash(uint16_t*buf_to_get,uint16_tlen);39.voidset_flash_flag_to_updata(uint16_tcrc_code);40.voidrFlashData(uint8_t*buf_to_get,uint16_tlen,uint32_trFlashAddr);41.voidwFlashData(uint8_t*buf_to_save,uint16_tlen,uint32_twFlashAddr);42.voidiap_load_app(uint32_tappxaddr);43.voidflash_erase(uint32_tsize,uint32_taddr_base);44.#endif复制代码
- “侯佩岑道歉”被骂上热搜,她母亲林月云,当年到底做了什么?
- RNG拿下EDG,上单差距太明显,德云色:小虎现在是LPL第一上单!
- 马云|马云:一段为时仅29天的留学生活,彻底改变了我的一生
- 网易云音乐高管大变动 将何去何从?
- 德云社杨九郎直播招生,哪位师兄弟回来助阵,搭档张云雷呼声最高
- 何云伟和郭德纲有什么矛盾 退出德云社的他被收回云字
- 《王者荣耀》与《和平精英》云游戏来啦,体积只有15M左右
- 罗云熙表示自己的颜值是家里最丑的,网友:我也想丑成你这样
- 著名相声演员侯耀文,曾为德云社题匾,“德”字写错是其用心良苦
- 【我要上电视】齐云楼新出12技能出其观照谛听,等级辣眼睛
