| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- /**
- ******************************** 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 ****/
|