/** ******************************** STM32F10x ********************************* * @文件名 : main.c * @作者 : sun * @库版本 : V3.5.0 * @文件版本 : V1.0.0 * @日期 : 2016年05月09日 * @摘要 : ******************************************************************************/ /*---------------------------------------------------------------------------- 更新日志: ----------------------------------------------------------------------------*/ /* 包含的头文件 --------------------------------------------------------------*/ #include "bsp.h" #include "usart.h" #include "systick.h" #include "led.h" #include "stm32f10x_iwdg.h" #include "update.h" #include "delay.h" /************************************************ 函数名称 : main 功 能 : 主函数入口 参 数 : 无 返 回 值 : int 作 者 : sun *************************************************/ int update_fireware(void); uint16_t set_updata_state(uint16_t data); uint8_t updata_state_cmp(uint16_t data); uint32_t count = 0; uint16_t rcv_data_dr2 = 0, send_data_dr2 = 0; uint8_t updata_flag = 0; int main(void) { System_Initializes(); //系统初始化 IWDG_Init(IWDG_Prescaler_256,625);//独立看门狗,Tout=((4*2^prer)*rlr)/40 (ms)=4s IWDG_Feed(); //喂狗 eeprom_init_handle(); IWDG_Feed(); rcv_data_dr2 = BKP_ReadBackupRegister(BKP_DR2); if(updata_state_cmp(rcv_data_dr2)) { if((rcv_data_dr2&0x00ff) == UPDATA_FLAG)//升级 { printf("updata begin\n"); erase_app(UPDATE_ENUM_APP2); IWDG_Feed(); // printf("erase app2 end\n"); copy_app(UPDATE_ENUM_APP1, UPDATE_ENUM_APP2); IWDG_Feed(); // printf("copy app1 end\n"); erase_app(UPDATE_ENUM_APP1); IWDG_Feed(); // printf("erase app1 end\n"); copy_app(UPDATE_ENUM_APP3, UPDATE_ENUM_APP1); IWDG_Feed(); // printf("copy app3 end\n"); send_data_dr2 = set_updata_state(BACKOFF_FLAG); BKP_WriteBackupRegister(BKP_DR2, send_data_dr2); //向指定的后备寄存器中写入用户程序数据 device_version_info.APP2_ver = device_version_info.APP1_ver; device_version_info.APP1_ver = device_version_info.APP3_ver; updata_flag = 1; } else if((rcv_data_dr2&0x00ff) == BACKOFF_FLAG)//回退 { printf("back off begin\n"); erase_app(UPDATE_ENUM_APP1); IWDG_Feed(); copy_app(UPDATE_ENUM_APP2, UPDATE_ENUM_APP1); IWDG_Feed(); send_data_dr2 = set_updata_state(BACKOFF_OVER); BKP_WriteBackupRegister(BKP_DR2, send_data_dr2); //向指定的后备寄存器中写入用户程序数据 device_version_info.APP1_ver = device_version_info.APP2_ver; updata_flag = 1; } else if((rcv_data_dr2&0x00ff) == BACKOFF_OVER)//回退失败 { BKP_WriteBackupRegister(BKP_DR2, 0x0000); //向指定的后备寄存器中写入用户程序数据 } } IWDG_Feed(); eeprom_info_updata(); //打印信息 printf("first_init:0x%04x, eeprom_ver:0x%02x, reset_num:%d \n",eeprom_first_info.eeprom_first_init_flag, eeprom_first_info.eeprom_ver,eeprom_first_info.reset_total_num); printf("boot_ver:0x%08x, pt_ver:0x%08x,\n app1_ver:0x%08x, app2_ver:0x%08x, app3_ver:0x%08x\n", device_version_info.boot_ver,device_version_info.PT_ver,device_version_info.APP1_ver, device_version_info.APP2_ver,device_version_info.APP3_ver); //////////////////////////////////////////////// run_app1(); IWDG_Feed(); while(1) { LED_RUN = !LED_RUN; IWDG_Feed(); //喂狗 delay_ms(500); count++; if(count > 10) { NVIC_SystemReset(); } } } //设置升级标志 uint16_t set_updata_state(uint16_t data) { uint16_t temp_data,ret_data = 0; uint16_t temp_h,temp_l; temp_data = data; temp_h = ((~temp_data)<<8)&0xff00; temp_l = temp_data&0x00ff; ret_data = temp_h | temp_l; return ret_data; } //判断升级标志的本体和掩码 uint8_t updata_state_cmp(uint16_t data) { uint8_t ret = 0; uint16_t temp_data; uint8_t temp_h,temp_l; temp_data = data; temp_h = (uint8_t)((temp_data&0xff00)>>8); temp_l = (uint8_t)(temp_data&0x00ff); if((temp_h^temp_l) == 0xff) { ret = 1; } return ret; } /**** Copyright (C)2016 sun. All Rights Reserved **** END OF FILE ****/