打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

LiSun

打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
特点描述
DFU采用可靠的升级协议,文件crc16校验。串口模式。波特率115200,升级30kb文件约5秒
掉电保护备份升级时,遇到掉电重启的情况,会自动重新从BACK区搬运APP
防导出,防被盗boot上电启动会将SWO口禁用,防止他人导出程序。(在boot模式下,通过AT命令可以解锁,APP区域数据会擦除)
带备份升级会根据app大小自动计算自身空间剩余,如果APP小于剩余空间的一半,则采用备用升级方式。反之直接覆盖APP区域。
带简易KV键值系统存在数据到FLASH中,可以避免反复擦写降低寿命

文件大小:RAM 1.79KB ROM 9,96KB

协议流程:

  1. PC发送"bootloader",如果在APP区,则跳到boot。如果在boot中,则MCU应答UP^OK。(PC重发机制,直到收到应答)

  2. PC发送文件信息 “UP^FILE_INFO=文件CRC值(2字节),文件大小”,MCU应答
    UP^OK,串口缓存区大小

  3. PC通过MCU返回的串口缓存区大小,进行封包,例如返回256,则"UP^DATA=[240字节]"
    注:256-协议头尾16个字节

  4. 发送DFU文件检验,“UP^CHECK_FILE=1”,MCU会根据收到的文件进行CRC16计算,如果校验值于PC下发的一致,则应答
    “UP^OK”,(如果是备份升级,则开始搬运数据)
    反之"UP^FAIL"。

PC上位机

在这里插入图片描述

/*
 * main: initialize and start the system
 */
int main(void)
{
    bool dfu_mode = false;
    uint8_t *p;
    hardware_init();
    kv_gc_check();
    p = kv_get_env(BS_KV_KEY_BOOT_INFO);
    if (p != NULL)
    {
        memcpy((uint8_t *)&g_boot_info, p, sizeof(boot_info_t));
    }
    else
    {
        memset(&g_boot_info, 0, sizeof(boot_info_t));
    }
    chip_lock_check(g_boot_info.chip_lock);
    if (bsp_gpio_get_state(BOARD_BUTTON_SYS_PORT, BOARD_BUTTON_SYS_PIN) == BOARD_BUTTON_SYS_PRESS_LEVEL)
    {
boot:
        g_boot_info.boot_state = BOOT_STATE_IN_DFU;
        dfu_main();
    }
    else
    {
        if (g_boot_info.boot_carry_size == 0xFFFFFFFF)
        {
            g_boot_info.boot_carry_size = 0;
        }
        if (g_boot_info.boot_state == 0xFF)
        {
            g_boot_info.boot_state = BOOT_STATE_RUN_APP;
        }
        if (g_boot_info.boot_state == BOOT_STATE_MOVE_OTA_IN_APP)
        {
            // 搬运文件大小异常
            if (g_boot_info.boot_carry_size > BS_FLASH_APP_SIZE / 2)
            {
                dfu_mode = true;
                goto boot;
            }
            bool state = false;
            state = bsp_flash_carry(BS_FLASH_APP_ADDR, BS_FLASH_OTA_ADDR, g_boot_info.boot_carry_size);
            if (state == true)
            {
                sys_jump_app();
            }
        }
        else if (g_boot_info.boot_state == BOOT_STATE_IN_DFU)
        {
            dfu_mode = true;
        }

        g_boot_info.boot_run_tick++;

        if (dfu_mode)
        {
            goto boot;
        }

        goto_app();
        goto boot;
    }
    while(1);
}
posted on 2022-08-13 11:00  xuejianqiang  阅读(97)  评论(0编辑  收藏  举报
打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033