实现APP进行飞控固件升级
This commit is contained in:
@@ -162,6 +162,12 @@ void app_thread(void* arg)
|
||||
resend_send_data(&sertrf.resend_device, RESEND_CMD_OTA_GET_PARAM, &ota_parm, sizeof(ota_parm_t), 1000);
|
||||
sertrf.resend_device.handle_flag = 0;//标志位清零
|
||||
break;
|
||||
case RESEND_CMD_FC_ISP_GET_PARAM:
|
||||
printf("RESEND_CMD_FC_ISP_GET_PARAM\r\n");
|
||||
stmisp_parm_t stmisp_parm;
|
||||
resend_send_data(&sertrf.resend_device, RESEND_CMD_FC_ISP_GET_PARAM, &stmisp_parm, sizeof(stmisp_parm), 1000);
|
||||
sertrf.resend_device.handle_flag = 0;//标志位清零
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -271,6 +277,58 @@ void data_handle_thread(void* arg)
|
||||
}
|
||||
}
|
||||
break;
|
||||
case DATA_HANDLE_ISP_DATA:
|
||||
{
|
||||
size_t data_size = rb_size(&sertrf.data_handle_buffer);
|
||||
if(data_size > 0)
|
||||
{
|
||||
uint8_t data[data_size];
|
||||
rb_get_bulk(&sertrf.data_handle_buffer, data, data_size);
|
||||
|
||||
uint32_t addr = sertrf.fc_address + sertrf.stmisp_device.adder_offset;
|
||||
|
||||
if(cmd_write_memory(&sertrf.stmisp_device, addr, data, data_size, false))
|
||||
{
|
||||
resend_send_cmd(&sertrf.resend_device, RESEND_CMD_ACK, 0);
|
||||
sertrf.stmisp_device.adder_offset += data_size;
|
||||
SYS_LOG_INF("stmisp write ok %d %d\n",data_size, sertrf.stmisp_device.adder_offset);
|
||||
}
|
||||
else
|
||||
{
|
||||
sertrf.stmisp_device.adder_offset = 0;
|
||||
sertrf.mode_status.task_state = DATA_HANDLE_IDLE;
|
||||
SYS_LOG_DBG("stmisp write error");
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case DATA_HANDLE_ISP_DATA_END:
|
||||
{
|
||||
size_t data_size = rb_size(&sertrf.data_handle_buffer);
|
||||
if(data_size > 0)
|
||||
{
|
||||
uint8_t data[data_size];
|
||||
rb_get_bulk(&sertrf.data_handle_buffer, data, data_size);
|
||||
|
||||
uint32_t addr = sertrf.fc_address + sertrf.stmisp_device.adder_offset;
|
||||
|
||||
if(cmd_write_memory(&sertrf.stmisp_device, addr, data, data_size, true))
|
||||
{
|
||||
sertrf.stmisp_device.adder_offset = 0;
|
||||
sertrf.mode_status.task_state = DATA_HANDLE_IDLE;
|
||||
}
|
||||
else
|
||||
{
|
||||
SYS_LOG_DBG("stmisp write end error");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
sertrf.stmisp_device.adder_offset = 0;
|
||||
sertrf.mode_status.task_state = DATA_HANDLE_IDLE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -434,20 +492,117 @@ void resend_user_parse(void *resend_device)
|
||||
esp_restart();
|
||||
}
|
||||
break;
|
||||
|
||||
case RESEND_CMD_FC_ISP_GET_PARAM:
|
||||
if(sizeof(stmisp_parm_t) != resend_parse->rx_frame.len)
|
||||
{
|
||||
printf("RESEND_CMD_FC_ISP_GET_PARAM len error\r\n");
|
||||
}
|
||||
stmisp_parm_t* stmisp_parm = (stmisp_parm_t*)resend_parse->rx_frame.payload;
|
||||
printf("RESEND_CMD_FC_ISP_GET_PARAM %d\n", stmisp_parm->stmisp_file_size);
|
||||
resend_send_cmd(resend_device, RESEND_CMD_ACK, 0);
|
||||
break;
|
||||
case RESEND_CMD_FC_ISP_START:
|
||||
/*关闭其他线程中相同串口的使用,并复位飞控,使其进入isp烧录模式,串口切换为偶校验模式
|
||||
使用sync与isp确定通讯波特率,并建立联系 解除其写保护 并重新sync建立连接后擦除全部区域内存*/
|
||||
//关闭其他线程中相同串口的使用
|
||||
sertrf.stmisp_device.flag = 1;
|
||||
// 重启飞控,并使其进入isp烧录模式
|
||||
fc_reboot();
|
||||
boot_set(0);
|
||||
os_thread_sleep(1000);
|
||||
//串口切换为偶校验模式,并清除缓存
|
||||
uart_set_parity_switch(sertrf.device.embedded_device, 0x02);
|
||||
os_thread_sleep(100);
|
||||
// 与isp确定通讯波特率,并建立联系
|
||||
if(!send_sync(&sertrf.stmisp_device, 5))
|
||||
printf("stmisp: sync error\n");
|
||||
else
|
||||
printf("stmisp: sync ok\n");
|
||||
|
||||
os_thread_sleep(100);
|
||||
|
||||
// 解除写保护
|
||||
if(!cmd_write_unprotect(&sertrf.stmisp_device))
|
||||
printf("stmisp: write unprotect error\n");
|
||||
else
|
||||
printf("stmisp: write unprotect ok\n");
|
||||
|
||||
os_thread_sleep(100);
|
||||
|
||||
|
||||
if(!send_sync(&sertrf.stmisp_device, 5))
|
||||
printf("stmisp: sync error\n");
|
||||
else
|
||||
printf("stmisp: sync ok\n");
|
||||
os_thread_sleep(100);
|
||||
|
||||
boot_set_high_z();
|
||||
// 全盘擦除
|
||||
if(!cmd_extended_erase_mass(&sertrf.stmisp_device))
|
||||
printf("stmisp: erase mass error\n");
|
||||
else
|
||||
printf("stmisp: erase mass ok\n");
|
||||
|
||||
os_thread_sleep(10);
|
||||
|
||||
printf("stmisp: isp start\n");
|
||||
|
||||
sertrf.mode_status.task_state = DATA_HANDLE_ISP_DATA;
|
||||
resend_send_cmd(resend_device, RESEND_CMD_ACK, 0);
|
||||
break;
|
||||
case RESEND_CMD_FC_ISP_DATA:
|
||||
// 使用环形buff
|
||||
if(rb_size(&sertrf.data_handle_buffer) + sertrf.resend_device.rx_frame.len <= DATA_HANDLE_BUFFER_SIZE)
|
||||
{
|
||||
rb_put_bulk(&sertrf.data_handle_buffer, sertrf.resend_device.rx_frame.payload, sertrf.resend_device.rx_frame.len);
|
||||
}
|
||||
else
|
||||
{
|
||||
SYS_LOG_DBG("RESEND_CMD_FC_ISP_DATA buffer full");
|
||||
}
|
||||
// resend_send_cmd(resend_device, RESEND_CMD_ACK, 0);
|
||||
break;
|
||||
case RESEND_CMD_FC_ISP_END:
|
||||
// 告诉数据处理线程,ISP烧录数据传输完成
|
||||
sertrf.mode_status.task_state = DATA_HANDLE_ISP_DATA_END;
|
||||
// 等待数据处理线程写入完成
|
||||
SYS_LOG_INF("RESEND_CMD_FC_ISP_END1");
|
||||
while(sertrf.mode_status.task_state != DATA_HANDLE_IDLE){
|
||||
os_thread_sleep(10);}
|
||||
// ISP下跳转到应用层运行地址
|
||||
if(cmd_go(&sertrf.stmisp_device, sertrf.fc_address))
|
||||
{
|
||||
printf("stmisp: go ok\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("stmisp: go error\n");
|
||||
}
|
||||
//开启其他线程中相同串口的使用
|
||||
sertrf.stmisp_device.flag = 0;
|
||||
// 将串口切换为无校验模式
|
||||
uart_set_parity_switch(sertrf.device.embedded_device, 0x00);
|
||||
SYS_LOG_INF("RESEND_CMD_FC_ISP_END2");
|
||||
resend_send_cmd(resend_device, RESEND_CMD_ACK, 0);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Examples_run(void)
|
||||
{
|
||||
//关闭其他线程中相同串口的使用
|
||||
// // //关闭其他线程中相同串口的使用
|
||||
sertrf.stmisp_device.flag = 1;
|
||||
// 重启飞控,并使其进入isp烧录模式
|
||||
// // // 重启飞控,并使其进入isp烧录模式
|
||||
fc_reboot();
|
||||
boot_set(1);
|
||||
os_thread_sleep(1000);
|
||||
boot_set(0);
|
||||
os_thread_sleep(500);
|
||||
uart_set_parity_switch(sertrf.device.embedded_device, 0x02);
|
||||
os_thread_sleep(100);
|
||||
os_thread_sleep(500);
|
||||
// 与isp确定通讯波特率,并建立联系
|
||||
if(!send_sync(&sertrf.stmisp_device, 5))
|
||||
printf("stmisp: sync error\n");
|
||||
@@ -468,6 +623,8 @@ void Examples_run(void)
|
||||
else
|
||||
printf("stmisp: sync ok\n");
|
||||
os_thread_sleep(100);
|
||||
|
||||
boot_set_high_z();
|
||||
// 全盘擦除
|
||||
if(!cmd_extended_erase_mass(&sertrf.stmisp_device))
|
||||
printf("stmisp: erase mass error\n");
|
||||
|
||||
Reference in New Issue
Block a user