main.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. /**
  2. ******************************** STM32F10x *********************************
  3. * @文件名 : main.c
  4. * @作者 : sun
  5. * @库版本 : V3.5.0
  6. * @文件版本 : V1.0.0
  7. * @日期 : 2016年05月09日
  8. * @摘要 :
  9. ******************************************************************************/
  10. /*----------------------------------------------------------------------------
  11. 更新日志:
  12. ----------------------------------------------------------------------------*/
  13. /* 包含的头文件 --------------------------------------------------------------*/
  14. #include "bsp.h"
  15. #include "usart.h"
  16. #include "systick.h"
  17. #include "led.h"
  18. #include "stm32f10x_iwdg.h"
  19. #include "update.h"
  20. #include "delay.h"
  21. /************************************************
  22. 函数名称 : main
  23. 功 能 : 主函数入口
  24. 参 数 : 无
  25. 返 回 值 : int
  26. 作 者 : sun
  27. *************************************************/
  28. int update_fireware(void);
  29. uint16_t set_updata_state(uint16_t data);
  30. uint8_t updata_state_cmp(uint16_t data);
  31. uint32_t count = 0;
  32. uint16_t rcv_data_dr2 = 0, send_data_dr2 = 0;
  33. uint8_t updata_flag = 0;
  34. int main(void)
  35. {
  36. System_Initializes(); //系统初始化
  37. IWDG_Init(IWDG_Prescaler_256,625);//独立看门狗,Tout=((4*2^prer)*rlr)/40 (ms)=4s
  38. IWDG_Feed(); //喂狗
  39. eeprom_init_handle();
  40. IWDG_Feed();
  41. rcv_data_dr2 = BKP_ReadBackupRegister(BKP_DR2);
  42. if(updata_state_cmp(rcv_data_dr2))
  43. {
  44. if((rcv_data_dr2&0x00ff) == UPDATA_FLAG)//升级
  45. {
  46. printf("updata begin\n");
  47. erase_app(UPDATE_ENUM_APP2);
  48. IWDG_Feed();
  49. // printf("erase app2 end\n");
  50. copy_app(UPDATE_ENUM_APP1, UPDATE_ENUM_APP2);
  51. IWDG_Feed();
  52. // printf("copy app1 end\n");
  53. erase_app(UPDATE_ENUM_APP1);
  54. IWDG_Feed();
  55. // printf("erase app1 end\n");
  56. copy_app(UPDATE_ENUM_APP3, UPDATE_ENUM_APP1);
  57. IWDG_Feed();
  58. // printf("copy app3 end\n");
  59. send_data_dr2 = set_updata_state(BACKOFF_FLAG);
  60. BKP_WriteBackupRegister(BKP_DR2, send_data_dr2); //向指定的后备寄存器中写入用户程序数据
  61. device_version_info.APP2_ver = device_version_info.APP1_ver;
  62. device_version_info.APP1_ver = device_version_info.APP3_ver;
  63. updata_flag = 1;
  64. }
  65. else if((rcv_data_dr2&0x00ff) == BACKOFF_FLAG)//回退
  66. {
  67. printf("back off begin\n");
  68. erase_app(UPDATE_ENUM_APP1);
  69. IWDG_Feed();
  70. copy_app(UPDATE_ENUM_APP2, UPDATE_ENUM_APP1);
  71. IWDG_Feed();
  72. send_data_dr2 = set_updata_state(BACKOFF_OVER);
  73. BKP_WriteBackupRegister(BKP_DR2, send_data_dr2); //向指定的后备寄存器中写入用户程序数据
  74. device_version_info.APP1_ver = device_version_info.APP2_ver;
  75. updata_flag = 1;
  76. }
  77. else if((rcv_data_dr2&0x00ff) == BACKOFF_OVER)//回退失败
  78. {
  79. BKP_WriteBackupRegister(BKP_DR2, 0x0000); //向指定的后备寄存器中写入用户程序数据
  80. }
  81. }
  82. IWDG_Feed();
  83. eeprom_info_updata();
  84. //打印信息
  85. printf("first_init:0x%04x, eeprom_ver:0x%02x, reset_num:%d \n",eeprom_first_info.eeprom_first_init_flag,
  86. eeprom_first_info.eeprom_ver,eeprom_first_info.reset_total_num);
  87. printf("boot_ver:0x%08x, pt_ver:0x%08x,\n app1_ver:0x%08x, app2_ver:0x%08x, app3_ver:0x%08x\n",
  88. device_version_info.boot_ver,device_version_info.PT_ver,device_version_info.APP1_ver,
  89. device_version_info.APP2_ver,device_version_info.APP3_ver);
  90. ////////////////////////////////////////////////
  91. run_app1();
  92. IWDG_Feed();
  93. while(1)
  94. {
  95. LED_RUN = !LED_RUN;
  96. IWDG_Feed(); //喂狗
  97. delay_ms(500);
  98. count++;
  99. if(count > 10)
  100. {
  101. NVIC_SystemReset();
  102. }
  103. }
  104. }
  105. //设置升级标志
  106. uint16_t set_updata_state(uint16_t data)
  107. {
  108. uint16_t temp_data,ret_data = 0;
  109. uint16_t temp_h,temp_l;
  110. temp_data = data;
  111. temp_h = ((~temp_data)<<8)&0xff00;
  112. temp_l = temp_data&0x00ff;
  113. ret_data = temp_h | temp_l;
  114. return ret_data;
  115. }
  116. //判断升级标志的本体和掩码
  117. uint8_t updata_state_cmp(uint16_t data)
  118. {
  119. uint8_t ret = 0;
  120. uint16_t temp_data;
  121. uint8_t temp_h,temp_l;
  122. temp_data = data;
  123. temp_h = (uint8_t)((temp_data&0xff00)>>8);
  124. temp_l = (uint8_t)(temp_data&0x00ff);
  125. if((temp_h^temp_l) == 0xff)
  126. {
  127. ret = 1;
  128. }
  129. return ret;
  130. }
  131. /**** Copyright (C)2016 sun. All Rights Reserved **** END OF FILE ****/