【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