liao6 发表于 2025-8-21 15:46

【每周分享】涂鸦WIFI模组WBR3之OTA升级

本帖最后由 liao6 于 2025-8-25 10:05 编辑

@21小跑堂、#申请原创#

一、涂鸦平台      涂鸦平台上传固件版本,并设置OTA升级,点击验证升级选中产品的ID号才能下发固件。
二、程序运行流程(本文MCU为STM32F4,flash采用1M)      1.程序运行流程参考下图:
程序分区如下:         bootloader:0~0x8020000                     128KB         app1      :0x8020000~0x8080000          384KB          app2      :0x8080000~0x80E0000          384KB         FLAG       :0x80E0000~0x8100000          128KB      以上偏移地址分区是根据扇区来分的,FLAG是做为标记判断是否需要升级,执行逻辑就是首先接收OTA数据包,存到app2地址中,接收完OTA固件包之后把FLAG标记,然后软件复位,程序就会跳转到bootloader中,bootloader通过判断FLAG决定是否要升级,最后跳转到APP1中。
三、APP部分      OTA升级部分代码处理如下:unsigned char mcu_firm_update_handle(const unsigned char value[],unsigned long position,unsigned short length){    u32 nbuff=0x55555555;    u16 t;    u16 i=0;    u16 value_cnt=0;    u32 temp;    if(length == 0) //固件数据发送完成        {               STMFLASH_Write(Upgrade_FlashADDR_Flag,&nbuff,1);      if(STMFLASH_ReadWord(Upgrade_FlashADDR_Flag) == 0x55555555)      {            HAL_GPIO_WritePin(GPIOD, GPIO_PIN_9, GPIO_PIN_RESET);      }      NVIC_SystemReset();    }    else     {            for(t=0;t<length;t+=4)      {         temp=(u32)value <<24;            temp|=(u32)value<<16;            temp|=(u32)value<<8;            temp|=(u32)value;            value_cnt+=4;            iapbuf=temp;            if(i==64)            {                                                           STMFLASH_Write(fwaddr,iapbuf,64);                 memset(iapbuf,0,64);                fwaddr+=256;                i=0;                value_cnt=0;            }      }      if((i>0) && (i<64))STMFLASH_Write(fwaddr,iapbuf,i);    }        return tuya_SUCCESS;
}传参:value-接收的固件包数据,传入的是一个指针,指向串口接收数组wifi_data_process_buf         position-第几个数据包         length-当前固件包长度(固件包长度为0时,表示固件包发送完成)固件包是一包一包传输的,每包数据256字节,把接收到的数据包写到app2中,接收完毕数据FLAG做一个标记。写数据时,先擦除才能写,STM32F4的最小到位是扇区,要按扇区擦除,最好是先擦除整个扇区再一个字节一个字节的写数据。部分代码参考如下:(修改的STM32F4库函数)if((addrx==0x8080000) || (addrx==0x80A0000) || (addrx==0x80C0000) || (addrx==0x80E0000))//每个扇区的首地址      {                while(addrx<0x80F0000)                //擦除的地址范围                {                        if(STMFLASH_ReadWord(addrx)!=0XFFFFFFFF)//有非0XFFFFFFFF的地方,要擦除这个扇区 STMFLASH_ReadWord(addrx)!=0XFFFFFFFF                        {                                 FlashEraseInit.TypeErase=FLASH_TYPEERASE_SECTORS;       //擦除类型,扇区擦除                               FlashEraseInit.Sector=STMFLASH_GetFlashSector(addrx);   //要擦除的扇区                              FlashEraseInit.NbSectors=1;                FlashEraseInit.VoltageRange=FLASH_VOLTAGE_RANGE_3;      //电压范围,VCC=2.7~3.6V之间!!                              if(HAL_FLASHEx_Erase(&FlashEraseInit,&SectorError)!=HAL_OK)                               {                                        break;//发生错误了                                    }                        }            else addrx+=4;                        FLASH_WaitForLastOperation(FLASH_WAITETIME);                //等待上次操作完成      }
      }                         OTA固件数据包接收完毕,软件复位跳转到bootloader中。
四、bootloader部分      bootloader代码处理如下:void iap_main(void){    u32 nbuff=0xAAAAAAAA;    STMFLASH_Read(Upgrade_FlashADDR_Flag,&read_addr,1);    if(read_addr == 0x55555555)    {      Updata_Firmware(APP1_START_ADDR,APP2_START_ADDR);//固件升级操作      STMFLASH_Write(Upgrade_FlashADDR_Flag,&nbuff,1);      NVIC_SystemReset();    }    else    {      iap_load_app(0x8020000);    }}检测到FLAG位ox55555555时,进入升级操作,把app2的代码复制给app1,然后把改变FLAG,软件复位,再次执行程序就会直接跳转到新接手的固件app1中。固件升级操作代码如下:void Updata_Firmware(u32 SourceAddress,u32 TargetAddress){    u16 i=0;    u32 buffer;//1kb    volatile u32 nk;    nk = (TargetAddress-SourceAddress-0x20000)/(256);      //计算有几个扇区数据0x40000/256=1024    for(i=0;i<nk;i++)    {      memset(buffer,0,sizeof(buffer));       STMFLASH_Read(TargetAddress+i*256,buffer,64);    //256/4 传入num为32位数据      STMFLASH_Write(SourceAddress+i*256,buffer,64);   //    }}把app2的代码复制给app1是按固件包读取,读取一个固件包,写一个固件包,注意读写时的位操作,位操作搞错了,会出现奇怪问题。
五、结论      OTA升级的本质就是IAP,所以,按照IAP升级的方式来做就可以,可以参考原子的IAP例程中的iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,applenth);//更新FLASH代码。

huangcunxiake 发表于 2025-8-27 11:19

支持OTA升级挺好。

wangwu1976@ 发表于 2025-9-2 08:27

看了个迷迷瞪瞪

ntaaq18 发表于 2025-9-14 11:25

支持OTA升级很好,以后升级方便了

花开了相爱吧 发表于 2025-9-19 16:24

涂鸦 WIFI 模组 WBR3 的 OTA 升级,需先在涂鸦开发者平台配置升级固件与策略。模组联网后会主动检测平台升级指令,接收固件包时会校验完整性。升级中模组暂断服务但保留关键数据,完成后自动重启生效。整个过程支持断点续传,能降低升级失败风险,保障设备功能平滑更新。
页: [1]
查看完整版本: 【每周分享】涂鸦WIFI模组WBR3之OTA升级