【WCH蓝牙系列芯片】-基于CH591开发板—BLE从机小库应用CH591芯片OTA升级
------------------------------------------------------------------------------------------------------------------------------------

好在沁恒官方在EVT程序中,提供一个蓝牙从机小库CH59xBLE_ROM_PERI;作为蓝牙OTA升级的固定库,这个库中只包含有蓝牙从机功能的小库,只有136K的大小。蓝牙库的起始地址是在 #define LIB_FLASH_BASE_ADDRESSS 0x0000C000 是在48K的位置。
注:这个蓝牙小库放在48K的起始位置,是以防后续有新需求,库增加新功能导致不够用。



如果用EVT例程中OnlyUpdateApp_IAP + OnlyUpdateApp_JumpIAP + OnlyUpdateApp_Peripheral的方式,留给这三个工程的大小只有在48K,OnlyUpdateApp_JumpIAP 大小————4K,OnlyUpdateApp_IAP大小——————16K,这样看来OnlyUpdateApp_Peripheral(APP)的大小只有28K。
如果自己的应用程序APP的功能不复杂,也在28K之内,这样的情况,就可以不需要修改就可以将 JumpIAP+APP+IAP+CH59xBLE_ROM_PERI四个工程同时下载到芯片中,做固定库OTA升级的方式。
在这个基础上,如果对于自己的APP应用程序大小超过了28K的大小,可以按照下面的步骤进行修改,去除JumpIAP程序,将IAP的程序从原来的16K压缩到8K大小,这样计算APP的大小可以到40K的大小。
一、针对IAP工程的修改
1、LD文件修改
将IAP的LD文件的FLASH起始地址改为0,长度设置为8K

2、启动文件修改
在startup_CH592.S启动文件中,将指向的地址,修改为蓝牙库的起始地址48K位置,也就是0xC000

3、OTA程序修改
修改IAP跳转到APP的目标地址,当你最终在 main.c 里调用 jumpApp(); 时,CPU 就会直接把程序计数器(PC)拨到 0x2000 这个位置开始执行指令。

还需要在 peripheral.c程序中进行修改,在CMD_IAP_ERASE加上边界判断,修改为
if(EraseAdd < IMAGE_A_START_ADD || (EraseAdd + (EraseBlockNum - 1) * FLASH_BLOCK_SIZE) > IMAGE_C_START_ADD)
为了防止芯片自杀或破坏库文件,建立安全的擦除范围

修改CMD_IAP_INFO中,将IMAGE_C_START_ADD发送给手机APP,这个是告诉手机APP,进行固件大小和地址的合法性校验,防止手机发来过大的固件。
send_buf[1] = (uint8_t)(IMAGE_C_START_ADD& 0xff);

4、预编译宏处理

5、添加新的MCU.C公共文件
在HAL文件中,重新复制一个新的MCU.C文件,将里面的校准函数屏蔽,这是为了节省FLASH 空间。

二、针对APP工程的修改
1、LD文件修改

2、启动文件修改
在startup_CH592.S启动文件中,将指向的地址,修改为蓝牙库的起始地址48K位置,也就是0xC000

3、预编译宏处理
添加CH59xBLE_ROM=1,是为了告诉编译器:不要在当前工程里寻找蓝牙底层的代码,请把所有的蓝牙函数调用,全部转换成指向 0xC000 区域的函数指针!

4、添加程序到APP程序

/* OTA 升级标志 */ #define IMAGE_OTA_FLAG 0x03 /* 存放在DataFlash地址,不能占用蓝牙的位置 */ #define OTA_DATAFLASH_ADD 0x00076000 - FLASH_ROM_MAX_SIZE /* flash的数据临时存储 */ __attribute__((aligned(8))) uint8_t block_buf[16]; /********************************************************************* * @fn Jump_OTA * * @brief 跳转OTA升级 * * @return none */ void Jump_OTA(void) { uint16_t i; uint32_t ver_flag; /* 读取第一块 */ EEPROM_READ(OTA_DATAFLASH_ADD, (uint32_t *)&block_buf[0], 4); /* 擦除第一块 */ EEPROM_ERASE(OTA_DATAFLASH_ADD, EEPROM_PAGE_SIZE); /* 更新Image信息 */ block_buf[0] = IMAGE_OTA_FLAG; /* 编程DataFlash */ EEPROM_WRITE(OTA_DATAFLASH_ADD, (uint32_t *)&block_buf[0], 4); /* 软复位 */ SYS_ResetExecute(); }



浙公网安备 33010602011771号