Engineer:邓工
注:代码中已包含注释
第一种方式:
#if( UPDATE_FIRMWARE_WAY_SELECT == TIMEKEEPING )
/*new APP program receive finish,start update firmware*/
if(G_UPDATE_FIRMWARE_InitStructure.u8_update_flag == APP_RX_FINISH)
{
if(G_UPDATE_FIRMWARE_InitStructure.u16_rx_app_lenth)
{
printf("开始更新固件...\r\n");
printf("value = %x\r\n",*(vu32*)(0X20000800+4));
if(((*(vu32*)(0X20000800+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{
iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,G_UPDATE_FIRMWARE_InitStructure.u16_rx_app_lenth);//更新FLASH代码
printf("固件更新完成!\r\n");
G_UPDATE_FIRMWARE_InitStructure.u8_update_flag = FIRMWARE_UPDATE_FINISH;
}
else
{
printf("非FLASH应用程序!\r\n");
}
}
else
{
printf("没有可以更新的固件!\r\n");
}
}
/*ten seconds countdown.
if usart not receive app program after ten seconds,not update firmware,start to run old APP program*/
G_UPDATE_FIRMWARE_InitStructure.u16_time_cnt++;
delay_ms(10);
if(G_UPDATE_FIRMWARE_InitStructure.u16_time_cnt%100 == 0)
{
printf("倒计时 %d s......\r\n",11-G_UPDATE_FIRMWARE_InitStructure.u16_time_cnt/100);
}
if(G_UPDATE_FIRMWARE_InitStructure.u16_time_cnt >= 1000)
{
G_UPDATE_FIRMWARE_InitStructure.u16_time_cnt = 1000;
}
if(G_UPDATE_FIRMWARE_InitStructure.u16_time_cnt == 1000 && G_UPDATE_FIRMWARE_InitStructure.u8_update_flag == 0)
{
G_UPDATE_FIRMWARE_InitStructure.u8_update_flag = NO_FIRMWARE_UPDATE;
printf("没有可以更新的固件!\r\n");
}
if((G_UPDATE_FIRMWARE_InitStructure.u8_update_flag == FIRMWARE_UPDATE_FINISH)||(G_UPDATE_FIRMWARE_InitStructure.u8_update_flag == NO_FIRMWARE_UPDATE))
{
printf("开始执行FLASH用户代码!!\r\n");
if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{
// __disable_irq();
iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
//g_u8_update_firmware_flag = 0;
}
else
{
printf("非FLASH应用程序,无法执行!\r\n");
}
}
第二种方式:
#elif( UPDATE_FIRMWARE_WAY_SELECT == KEY_SCAN)
GetKeyVal();
/*keys are not pressed*/
if((G_KEY_InitStructure.u8_key1_val == 0)&&(G_KEY_InitStructure.u8_key2_val == 0))
{
//printf("没有按键按下,等待固件更新......,等待用户程序开始执行......\r\n");
printf("等待用户按键按下......\r\n按下KEY1:更新固件。按下KEY2:开始执行用户程序\r\n");
//delay_ms(500);
printf("\r\n");
}
/*press key1*/
if(G_KEY_InitStructure.u8_key1_val == 1)
{
G_KEY_InitStructure.u8_key1_val = 0;
/*new app program had received, update firmware*/
if(G_UPDATE_FIRMWARE_InitStructure.u8_update_flag == APP_RX_FINISH)
{
if(G_UPDATE_FIRMWARE_InitStructure.u16_rx_app_lenth)
{
printf("开始更新固件...\r\n");
printf("value = %x\r\n",*(vu32*)(0X20000800+4));
if(((*(vu32*)(0X20000800+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{
iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,G_UPDATE_FIRMWARE_InitStructure.u16_rx_app_lenth);//更新FLASH代码
printf("固件更新完成!\r\n");
G_UPDATE_FIRMWARE_InitStructure.u8_update_flag = FIRMWARE_UPDATE_FINISH;
}
else
{
printf("非FLASH应用程序!\r\n");
}
}
else
{
printf("没有可以更新的固件!\r\n");
}
}
/*new app program had not received, not update firmware*/
else if(G_UPDATE_FIRMWARE_InitStructure.u8_update_flag == 0)
{
printf("没有可以更新的固件!\r\n");
}
}
/*press key2*/
if(G_KEY_InitStructure.u8_key2_val == 1)
{
G_KEY_InitStructure.u8_key2_val = 0;
//if((G_UPDATE_firmware_InitStructure.u8_update_flag == firmware_UPDATE_FINISH)||(G_UPDATE_firmware_InitStructure.u8_update_flag == 0))
/*firmware updates finishion, start to run new app program*/
if(G_UPDATE_FIRMWARE_InitStructure.u8_update_flag == FIRMWARE_UPDATE_FINISH)
{
printf("开始执行FLASH用户代码!!\r\n");
if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{
// __disable_irq();
iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
//g_u8_update_firmware_flag = 0;
}
else
{
printf("非FLASH应用程序,无法执行!\r\n");
}
}
/*if usart is not receiving new app program or usart has received new app program,
but is not updating firmware, start to run old app program*/
else if((G_UPDATE_FIRMWARE_InitStructure.u8_update_flag == 0)||(G_UPDATE_FIRMWARE_InitStructure.u8_update_flag == APP_RX_FINISH))
{
printf("没有可以更新的固件!\r\n");
printf("开始执行FLASH用户代码!!\r\n");
if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{
// __disable_irq();
iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
//g_u8_update_firmware_flag = 0;
}
else
{
printf("非FLASH应用程序,无法执行!\r\n");
}
}
}
第三种方式:
#elif( UPDATE_FIRMWARE_WAY_SELECT == USART_CMD )
/*usart has received new app program, and then it has received a char of 'u',start to update firmware*/
if((USART_RX_CMD == 'u')&&(G_UPDATE_FIRMWARE_InitStructure.u8_update_flag == APP_RX_FINISH))
{
USART_RX_CMD = 0;
if(G_UPDATE_FIRMWARE_InitStructure.u16_rx_app_lenth)
{
printf("开始更新固件...\r\n");
printf("value = %x\r\n",*(vu32*)(0X20000800+4));
if(((*(vu32*)(0X20000800+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{
iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,G_UPDATE_FIRMWARE_InitStructure.u16_rx_app_lenth);//更新FLASH代码
printf("固件更新完成!\r\n");
G_UPDATE_FIRMWARE_InitStructure.u8_update_flag = FIRMWARE_UPDATE_FINISH;
}
else
{
printf("非FLASH应用程序!\r\n");
}
}
else
{
printf("没有可以更新的固件!\r\n");
}
}
/*if firmware has updated, and then usart has received a char of 'a', start to run new app program*/
if((USART_RX_CMD == 'a')&&(G_UPDATE_FIRMWARE_InitStructure.u8_update_flag == FIRMWARE_UPDATE_FINISH))
{
USART_RX_CMD = 0;
printf("开始执行FLASH用户代码!!\r\n");
if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{
// __disable_irq();
iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
//g_u8_update_firmware_flag = 0;
}
else
{
printf("非FLASH应用程序,无法执行!\r\n");
}
}
/*usart not receive new app program,but it has received a char of 'a', start to run old app program*/
if((USART_RX_BUF[0] == 'a')&&(G_UPDATE_FIRMWARE_InitStructure.u8_update_flag == 0))
{
USART_RX_BUF[0] = 0;
printf("没有可以更新的固件!\r\n");
printf("开始执行FLASH用户代码!!\r\n");
if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{
// __disable_irq();
iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
//g_u8_update_firmware_flag = 0;
}
else
{
printf("非FLASH应用程序,无法执行!\r\n");
}
}
/*usart has received new app program, but not update firmware, and then it has received a char of 'a',start to old app program*/
else if((USART_RX_CMD == 'a')&&(G_UPDATE_FIRMWARE_InitStructure.u8_update_flag == APP_RX_FINISH))
{
USART_RX_CMD = 0;
printf("没有可以更新的固件!\r\n");
printf("开始执行FLASH用户代码!!\r\n");
if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{
// __disable_irq();
iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
//g_u8_update_firmware_flag = 0;
}
else
{
printf("非FLASH应用程序,无法执行!\r\n");
}
}
/*usart not receive a char of 'a',but it is receiving new app program*/
else if((USART_RX_BUF[0] != 'a' && USART_RX_CNT != 0)&&(G_UPDATE_FIRMWARE_InitStructure.u8_update_flag == 0))
{
printf("正在接收APP程序,请勿在此期间发送其他字符,等待APP程序接收完成......\r\n");
}
/*usart not receive a char of 'a', and it also is not receiving new app program, waiting user send usart cmd*/
else if((USART_RX_BUF[0] != 'a' && USART_RX_CNT == 0)&&(G_UPDATE_FIRMWARE_InitStructure.u8_update_flag == 0))
{
printf("等待用户发送字符......\r\n发送字符'u':更新固件。发送字符'a':开始执行用户程序\r\n");
delay_ms(500);
printf("\r\n");
}