然后依然和之前一样只是在WebUSB基础上修改添加WebDFU相关参数函数接口即可,代码如下:
//DFU初始化
void usbd_dfu_init(void)
{
DFU_Reset();
current_write_addr = 0;
}
//USB DFU开始升级
BOOL USBD_DFU_StartUpgrade(void) {
error_t err = flash_manager_init(target_device);
current_write_addr = target_device.flash_start;
switch (err) {
case ERROR_SUCCESS:
initialized = true;
break;
case ERROR_RESET:
case ERROR_ALGO_DL:
case ERROR_ALGO_DATA_SEQ:
case ERROR_INIT:
case ERROR_SECURITY_BITS:
case ERROR_UNLOCK:
DFU_SetStatus(DFU_STATUS_ERR_PROG);
break;
case ERROR_ERASE_SECTOR:
case ERROR_ERASE_ALL:
DFU_SetStatus(DFU_STATUS_ERR_ERASE);
break;
case ERROR_WRITE:
DFU_SetStatus(DFU_STATUS_ERR_WRITE);
break;
case ERROR_FAILURE:
case ERROR_INTERNAL:
default:
DFU_SetStatus(DFU_STATUS_ERR_UNKNOWN);
break;
}
return (err == ERROR_SUCCESS) ? (__TRUE) : (__FALSE);
}
//复位目标
static bool reset_target(bool error_condition) {
current_write_addr = 0;
if (initialized) {
error_t err = flash_manager_uninit();
switch (err) {
case ERROR_SUCCESS:
if (config_get_auto_rst()) {
// Target is reset and run by the uninit
} else if (!error_condition) {
// Reset and run the target at the end of a successful upgrade
target_set_state(RESET_RUN);
}
break;
case ERROR_RESET:
case ERROR_ALGO_DL:
case ERROR_ALGO_DATA_SEQ:
case ERROR_INIT:
case ERROR_SECURITY_BITS:
case ERROR_UNLOCK:
DFU_SetStatus(DFU_STATUS_ERR_PROG);
break;
case ERROR_ERASE_SECTOR:
case ERROR_ERASE_ALL:
DFU_SetStatus(DFU_STATUS_ERR_ERASE);
break;
case ERROR_WRITE:
DFU_SetStatus(DFU_STATUS_ERR_WRITE);
break;
case ERROR_FAILURE:
case ERROR_INTERNAL:
default:
DFU_SetStatus(DFU_STATUS_ERR_UNKNOWN);
break;
}
initialized = false;
return (err == ERROR_SUCCESS);
}
return true;
}
//USB DFU结束升级
BOOL USBD_DFU_FinishUpgrade(void) {
return reset_target(false) ? (__TRUE) : (__FALSE);
}
//USB DFU写数据
BOOL USBD_DFU_WriteBlock(const U8 *buffer, U16 blockSize) {
error_t err = flash_manager_data(current_write_addr, (U8*)buffer, blockSize);
switch (err) {
case ERROR_SUCCESS:
current_write_addr += blockSize;
break;
case ERROR_RESET:
case ERROR_ALGO_DL:
case ERROR_ALGO_DATA_SEQ:
case ERROR_INIT:
case ERROR_SECURITY_BITS:
case ERROR_UNLOCK:
DFU_SetStatus(DFU_STATUS_ERR_PROG);
break;
case ERROR_ERASE_SECTOR:
case ERROR_ERASE_ALL:
DFU_SetStatus(DFU_STATUS_ERR_ERASE);
break;
case ERROR_WRITE:
DFU_SetStatus(DFU_STATUS_ERR_WRITE);
break;
case ERROR_FAILURE:
case ERROR_INTERNAL:
default:
DFU_SetStatus(DFU_STATUS_ERR_UNKNOWN);
break;
}
return (err == ERROR_SUCCESS);
}
这样我们就完成MM32 MCU的WebDFU功能,将程序下载到板子中,USB插上电脑,电脑上会枚举出USB DFU。在USB DFU枚举成功后,我们需要检查是否真的可以被WebDFU网页识别。
|