/**
******************************************************************************
* @file main.c
* @author LI
* @version V3.5.0
* @date 08-April-2015
* @brief Main program body
******************************************************************************
* @attention
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*
*
© COPYRIGHT 2011 STMicroelectronics
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "includes.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
uint8_t run_led_state = LED_OFF;
uint32_t count = 0;
uint16_t read_data_dr2 = 0, write_data_dr2 = 0;
uint8_t updata_flag = 0;
uint32_t read_crc1,read_crc2,read_crc3;
uint32_t get_crc1,get_crc2,get_crc3;
uint32_t datalen1,datalen2,datalen3;
uint8_t app1_check_result,app2_check_result,app3_check_result;
uint8_t app1_check_num=0,app2_check_num=0,app3_check_num=0;
uint8_t jump_flag = 0;
uint32_t update_addr=0,update_len=0;
uint16_t read_data_dr=0;
uint8_t copy_addr=0,update_type;
int main(void)
{
// SysTick_init();
RCC_Configuration();
LED_Init();
uart_init(UART1_ID, 115200, USART_WL_8BIT, USART_PM_NONE);
I2C_init();
IWDG_Config();
printf("bootloader begin\n");
eeprom_init_handle();
read_data_dr2 = bkp_data_read(BKP_DATA_1);
printf("BKP_DR2=%04x\n",read_data_dr2);
if(flag_not_cmp(read_data_dr2))
{
read_data_dr=bkp_data_read(BKP_DATA_6);//升级的固件类型
if(read_data_dr == 0x02)//升级产测
{
update_addr = OTA_UPDATE_PT_FLASH_START_ADDR;
update_len = OTA_UPDATE_PT_FLASH_SIZE;
copy_addr = UPDATE_ENUM_PT;
update_type = 2;
printf("升级产测\n");
}
else if(read_data_dr == 0x03)//升级app
{
update_addr = OTA_UPDATE_APP1_FLASH_START_ADDR;
update_len = OTA_UPDATE_APP1_FLASH_SIZE;
copy_addr = UPDATE_ENUM_APP1;
update_type = 3;
printf("升级app\n");
}
if((read_data_dr2&0x00ff) == UPDATA_FLAG)//升级
{
printf("updata begin\n");
//校验app1
app1_check_result = app_check(update_addr,update_len,&get_crc1);
app3_check_result = app_check(OTA_UPDATE_APP3_FLASH_START_ADDR,OTA_UPDATE_APP3_FLASH_SIZE,&get_crc3);
move1:
erase_app(UPDATE_ENUM_APP2);
fwdgt_counter_reload();
// printf("erase app2 end\n");
copy_app(copy_addr, UPDATE_ENUM_APP2);
fwdgt_counter_reload();
// printf("copy app1 end\n");
//校验app2
app2_check_result = app_check(OTA_UPDATE_APP2_FLASH_START_ADDR,OTA_UPDATE_APP2_FLASH_SIZE,&get_crc2);
if(get_crc1 != get_crc2)//校验错误,拷贝过程出错
{
if(app2_check_num == 0)//如果是第一次,则重新拷贝一次
{
app2_check_num++;
goto move1;
}
else
{
printf("copy app1 to app2 error\n");
}
}
move2:
erase_app(copy_addr);
fwdgt_counter_reload();
// printf("erase app1 end\n");
copy_app(UPDATE_ENUM_APP3, copy_addr);
fwdgt_counter_reload();
// printf("copy app3 end\n");
app1_check_result = app_check(update_addr,update_len,&get_crc1);
if(get_crc1 != get_crc3)//校验错误,拷贝过程出错
{
if(app1_check_num == 0)//如果是第一次,则重新拷贝一次
{
app1_check_num++;
goto move2;
}
else
{
printf("copy app3 to app1 error\n");
jump_flag = 1;
}
}
write_data_dr2 = set_flag_not(BACKOFF_FLAG);
bkp_data_write(BKP_DATA_1,write_data_dr2);
if(update_type == 2)//产测
{
device_mcu_info.app2_ver = device_mcu_info.pt_ver;
device_mcu_info.pt_ver = device_mcu_info.app3_ver;
updata_flag = 1;
}
else if(update_type == 3)//app
{
device_mcu_info.app2_ver = device_mcu_info.app1_ver;
device_mcu_info.app1_ver = device_mcu_info.app3_ver;
updata_flag = 1;
}
}
else if((read_data_dr2&0x00ff) == BACKOFF_FLAG)//回退
{
printf("back off begin\n");
app2_check_result = app_check(OTA_UPDATE_APP2_FLASH_START_ADDR,OTA_UPDATE_APP2_FLASH_SIZE,&get_crc2);
move3:
erase_app(copy_addr);
fwdgt_counter_reload();
copy_app(UPDATE_ENUM_APP2, copy_addr);
fwdgt_counter_reload();
app1_check_result = app_check(update_addr,update_len,&get_crc1);
if(get_crc1 != get_crc2)//校验错误,拷贝过程出错
{
if(app1_check_num == 0)//如果是第一次,则重新拷贝一次
{
app1_check_num++;
goto move3;
}
else
{
printf("copy app2 to app1 error\n");
jump_flag = 1;
}
}
write_data_dr2 = set_flag_not(BACKOFF_OVER);
bkp_data_write(BKP_DATA_1,write_data_dr2);
if(update_type == 2)//产测
{
device_mcu_info.pt_ver = device_mcu_info.app2_ver;
updata_flag = 1;
}
else if(update_type == 3)//app
{
device_mcu_info.app1_ver = device_mcu_info.app2_ver;
updata_flag = 1;
}
}
else if((read_data_dr2&0x00ff) == BACKOFF_OVER)//回退失败
{
bkp_data_write(BKP_DATA_1,0x0000);
}
}
fwdgt_counter_reload();
eeprom_info_updata();
//打印信息
printf("bootloader信息:\n");
printf(" first init = %04x\n",device_public_info.eeprom_first_flag);
printf(" eeprom ver = %02x\n",device_public_info.eeprom_ver);
printf(" reset num = %u\n",Reset_cnt);
printf(" boot ver = %08x\n",device_mcu_info.bootloader_ver);
printf(" app1 ver = %08x\n",device_mcu_info.app1_ver);
printf(" app2 ver = %08x\n",device_mcu_info.app2_ver);
printf(" app3 ver = %08x\n",device_mcu_info.app3_ver);
fwdgt_counter_reload();
run_app1();
fwdgt_counter_reload();
while(1)
{
if(run_led_state)
LED_STATE_OFF();
else
LED_STATE_ON();
run_led_state = !run_led_state;
delay_ms(500);
fwdgt_counter_reload(); //喂狗
count++;
if(count > 10)
{
count = 0;
NVIC_SystemReset();
}
}
}