【WCH蓝牙系列芯片】-基于CH32V208开发板—OTA不带库升级移植

------------------------------------------------------------------------------------------------------------------------------------

  在上篇博客中,讲解过利用CH32V208芯片实现OnlyUpdate方式的OTA升级的过程,在此通过这篇博客讲解基于CH32V208芯片实现OTA不带库升级的程序移植过程。
  在移植之前,由于EVT资源包中有很多公共文件(LD文件,启动文件),为了不影响EVT资源包中其他程序正常使用,可以重新新建一个文件夹专门用于OTA升级的,这里以BLE_UART例程为例,讲解整个移植过程。
第一步:
  新建一个32V208文件夹,将EVT资源包里面的SRC文件复制一份到32V208文件中,并在里面建立一个BLE文件夹

  在BLE文件夹中,将HAL文件和LIB文件都从EVT资源包中拷贝一份,再将之前的不带库升级的IAP和peripheral,加上BLE_UART程序都复制一份,并将改名字以作区分。

第二步:
  在OnlyUpdataApp_BLE_UART工程中,找到Ld文件和启动文件,然后将OnlyUpdateApp_Peripheral的Ld文件的Link.ld和启动文件Startup中的startup_ch32v20x_D8W.S都复制一遍到OnlyUpdataApp_BLE_UART中,直接替换原本的文件。

第三步:
  在OnlyUpdataApp_BLE_UART文件夹中,移植相关的OTA升级文件。
  在主函数前添加ImageFlag相关代码。

   在Peripheral.c尾部增加OTA跳转相关代码,并添加自定义的OTA跳转执行逻辑。

/* OTA upgrade logo */
#define IMAGE_OTA_FLAG       0x03

/* Store on the DataFlash address, the position of Bluetooth cannot be occupied */
#define OTA_DATAFLASH_ADD    0x08077000

/* Flash data temporary storage */
__attribute__((aligned(8))) uint8_t block_buf[256];

/*********************************************************************
 * @fn      FLASH_read
 *
 * @brief   读 flash
 *
 * @return  none
 */
void FLASH_read(uint32_t addr, uint8_t *pData, uint32_t len)
{
    uint32_t i;
    for(i=0;i<len;i++)
    {
        *pData++ = *(uint8_t*)addr++;
    }
}

/*********************************************************************
 * @fn      Jump_OTA
 *
 * @brief   Jump to OTA upgrade
 *
 * @return  none
 */
void Jump_OTA(void)
{
    uint16_t i;
    uint32_t ver_flag;

    /* Read the first block */
    FLASH_read(OTA_DATAFLASH_ADD, (uint8_t *)&block_buf[0], 4);

    FLASH_Unlock_Fast();
    /* Erase the first block */
    FLASH_ErasePage_Fast( OTA_DATAFLASH_ADD );

    /* Update Image information */
    block_buf[0] = IMAGE_OTA_FLAG;
    block_buf[1] = 0x5A;
    block_buf[2] = 0x5A;
    block_buf[3] = 0x5A;

    /* Programming DataFlash */
    FLASH_ProgramPage_Fast(OTA_DATAFLASH_ADD, (uint32_t *)&block_buf[0]);
    FLASH_Lock_Fast();

    /* Software reset */
    NVIC_SystemReset();
}

   在Peripheral.h中声明一下JUMP_OTA(void)这个函数

   由于是BLE_UART例程,所以在蓝牙往串口发送数据的部分,添加JUMP_OTA函数,通过判断蓝牙发送的数据来决定是否跳转到OTA升级功能。

第四步:
  在程序预编译中添加外置蓝牙固定库

第五步:
  最后检查一下IAP层与APP层代码的32K时钟的内/外部源,是否一致。测试期间发现如果APP层代码使用外部32K晶振,而IAP层代码使用内部32K振荡器,APP跳转IAP会出问题。

第六步:烧录程序,观察现象
  1、将APP、LIB、IAP的三个HEX同时烧录至芯片。

2、利用BLE调试助手,连接蓝牙设备,发送数据0x77,蓝牙会自动断开,会跳到OTA升级的部分。
3、利用OTA升级工具,搜索OTA升级的蓝牙名字为OTAOTA_OTAOTA_OTA设备并连接。
4、通过选择要升级的HEX文件,然后点击START,开始OTA升级,等到OTA升级成功就OK

 

posted on 2024-06-27 16:05  凡仕  阅读(74)  评论(0编辑  收藏  举报