特点 | 描述 |
---|
DFU | 采用可靠的升级协议,文件crc16校验。串口模式。波特率115200,升级30kb文件约5秒 | 掉电保护 | 备份升级时,遇到掉电重启的情况,会自动重新从BACK区搬运APP | 防导出,防被盗 | boot上电启动会将SWO口禁用,防止他人导出程序。(在boot模式下,通过AT命令可以解锁,APP区域数据会擦除) | 带备份升级 | 会根据app大小自动计算自身空间剩余,如果APP小于剩余空间的一半,则采用备用升级方式。反之直接覆盖APP区域。 | 带简易KV键值系统 | 存在数据到FLASH中,可以避免反复擦写降低寿命 |
文件大小:RAM 1.79KB ROM 9,96KB
协议流程:
-
PC发送"bootloader",如果在APP区,则跳到boot。如果在boot中,则MCU应答UP^OK。(PC重发机制,直到收到应答) -
PC发送文件信息 “UP^FILE_INFO=文件CRC值(2字节),文件大小”,MCU应答 UP^OK,串口缓存区大小 -
PC通过MCU返回的串口缓存区大小,进行封包,例如返回256,则"UP^DATA=[240字节]" 注:256-协议头尾16个字节 -
发送DFU文件检验,“UP^CHECK_FILE=1”,MCU会根据收到的文件进行CRC16计算,如果校验值于PC下发的一致,则应答 “UP^OK”,(如果是备份升级,则开始搬运数据) 反之"UP^FAIL"。
PC上位机
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);
}
|