CH58X_OTA功能使用

  • CH58x系列EVT/BLE中提供了两种OTA方式,分别是BackupUpgrade和OnlyUpdateAPP
  • 区别是BackupUpgrade是带库升级,该升级方式是“整个镜像替换”,因此静态库会链接进镜像,代价是整个镜像会大,OnlyUpdateAPP是固定库升级,使用ROM自带库,升级时不会升级蓝牙库,如果需要升级库只能使用ISP等方式
  • 带库和不带库的内存分配情况:
    image

带库升级-BackupUpgrade

image

BackupUpgrade_JumpIAP

  • 该工程没有在主函数中做任何操作,仅在LD文件中分配了4KB内存,并在startup_CH585.s文件中无条件跳转到IAP

image

image

BackupUpgrade_IAP

  • 该工程起始地址为JumpIAP跳转的地址:0x6D000,大小为12K,通过jumpIAP,每次上电都会运行IAP工程
    image

  • IAP工程main函数中主要实现了ReadImageFlag和APP跳转功能

    • ReadImageFlag()函数从0x76000读取ImageFlag,空片或非法值一律当 IMAGE_A_FLAG(0x01) 处理
    • 在jump_APP()函数中,只有标志等于 IMAGE_IAP_FLAG(0x03)才搬运数据,首先一次性擦除整个IMAGEA,然后将IMAGEB搬运到IMAGEA,切换flag,擦除整个备份区;操作完成后跳转到IMAGEA运行

BackupUpgrade_OTA

  • 该工程就是imageA,在LD文件中可以看到起始地址为0x1000,大小为216KB,主要是在从机例程上添加了OTA功能
    image

QA:为什么JumpIAP和IAP的起始地址这样设计:ISP最小擦除单位是8KB,用户代码从0x1000开始,ISP工具烧录代码至少会将0~8K这段flash擦除,意味着如果使用ISP工具方式读取flash,用户代码的前4KB一定会被擦除,起到一定的代码保护作用


带库升级流程

  • 手机安装升级工具:https://www.wch.cn/downloads/BLE_OTA_Android_ZIP.html
  • ISP烧录时需要同时烧录jumpIAP/IAP/OTA三个工程
    image
  • 打开手机OTA升级工具,选择要连接的设备--点击GETINFO--右上角三个点导入需要OTA文件
    image
  • 点击IMAGEA,选择需要升级的固件
    image
  • 点击start选择需要升级的芯片
    8a6ea1f90a30cd6bf92dd9bc27cf63b2
  • 升级过程中串口不断打印flash校验信息,手机APP有进度条显示,直到升级完成
    fe8774cf15051c3ce5622e7f82745ff2

不带库升级-OnlyUpdateApp

image

Onlyupdate_jumpIAP

  • 该工程和带库升级的jumpIAP工程作用是一样的,也是分配一段4KB大小的flash并跳转到IAP
    image

Onlyupdate_IAP

  • 该工程起始地址为0xc000,大小为16KB

  • 与带库升级的IAP工程不同的是

    • Onlyupdate_IAP启动文件中跳转到了起始地址为0x00040000 ROM_BLE库(不同芯片库的起始地址不一样)
    la a0, 0x00040000
    jr a0
    
    • Onlyupdate_IAP工程中添加了OTA服务,实现了用户区代码的擦除写入;代码检查是否是软复位,软复位不跳转APP,检查标志位是否需要跳转到 APP 代码执行,如果不跳转到 APP,需要进行 OTA,程序会初始化BLE从机
    • 该工程用户区的代码起始地址取决于主机端
    OpParaDataLen = iap_rec_data.program.len;
    OpAdd = (uint32_t)(iap_rec_data.program.addr[0]);
    OpAdd |= ((uint32_t)(iap_rec_data.program.addr[1]) << 8);
    OpAdd = OpAdd * 16;
    

OnlyUpdateApp_Peripheral

  • 该工程与OTA相关的是在BLE服务中接收到任意数据后会触发OTA,Jump_OTA会擦除在ROM中OTA标志位,写标志IMAGE_OTA_FLAG,然后软复位,芯片复位;复位后运行到IAP中,在IAP中擦除和写入用户区代码,实现OTA
        case SIMPLEPROFILE_CHAR3:
        {
            uint8_t newValue[SIMPLEPROFILE_CHAR3_LEN];
            tmos_memcpy(newValue, pValue, len);
            PRINT("profile ChangeCB CHAR3..\n");
            PRINT("jump OTA \n");
            mDelaymS(5);
            Jump_OTA();
            break;
        }

不带库升级流程

  • 不带库升级手机端需要的工具是BLE调试助手和沁恒手机升级工具
  • ISP烧录时需要烧录IAP/Jump_IAP/OnlyUpdateApp_Peripheral;以及ROM库
    image
    image
  • 烧录完成后在BLE调试助手中连接simple_peripheral,并在UUID为0xFFE3特征发送任意数据触发OTA
    image
  • 触发OTA后可以在OTA升级工具中搜索到需要OTA的设备
    image
  • 后面操作与带库操作流程一致,GETINFO-添加HEX-IMAGEA-选择需要OTA文件-START-等待OTA结束
    9d655b9d1334b6eda35c627f251066cc

默认例程中留给APP的空间为44KB,如果APP空间需要更大,则将IAP往后移,为APP腾出空间,相应的跳转地址和flash大小分配进行修改

posted @ 2026-10-16 17:14  J_02346  阅读(19)  评论(0)    收藏  举报