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

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

  在使用CH591型号的蓝牙芯片时,CH591的用户闪存只有192K,但是默认的BLE库的大小就是192K,这样的情况下,如果在使用CH591开发蓝牙OTA升级功能,就非常不合适。

image

  好在沁恒官方在EVT程序中,提供一个蓝牙从机小库CH59xBLE_ROM_PERI;作为蓝牙OTA升级的固定库,这个库中只包含有蓝牙从机功能的小库,只有136K的大小。蓝牙库的起始地址是在 #define LIB_FLASH_BASE_ADDRESSS 0x0000C000 是在48K的位置。

注:这个蓝牙小库放在48K的起始位置,是以防后续有新需求,库增加新功能导致不够用。

image

image

image

  如果用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

image

2、启动文件修改

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

image

3、OTA程序修改

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

image

  还需要在 peripheral.c程序中进行修改,在CMD_IAP_ERASE加上边界判断,修改为

  if(EraseAdd < IMAGE_A_START_ADD || (EraseAdd + (EraseBlockNum - 1) * FLASH_BLOCK_SIZE) > IMAGE_C_START_ADD)

  为了防止芯片自杀或破坏库文件,建立安全的擦除范围

image

  修改CMD_IAP_INFO中,将IMAGE_C_START_ADD发送给手机APP,这个是告诉手机APP,进行固件大小和地址的合法性校验,防止手机发来过大的固件。

                         send_buf[1] = (uint8_t)(IMAGE_C_START_ADD& 0xff);

send_buf[2] = (uint8_t)((IMAGE_C_START_ADD>> 8) & 0xff);
send_buf[3] = (uint8_t)((IMAGE_C_START_ADD>> 16) & 0xff);
send_buf[4] = (uint8_t)((IMAGE_C_START_ADD>> 24) & 0xff);

image

4、预编译宏处理

image

5、添加新的MCU.C公共文件

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

image

二、针对APP工程的修改

1、LD文件修改

image

2、启动文件修改

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

image

3、预编译宏处理

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

image

4、添加程序到APP程序

image

/* 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();
}

image

三、烧录固件验证

image-20260326171617555

image

 

posted on 2026-03-27 10:05  凡仕  阅读(254)  评论(1)    收藏  举报