RefreshMenu.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. /**
  2. ******************************************************************************
  3. * @file RefreshMenu.c
  4. * @author Vincent
  5. * @version V1.0.0
  6. * @date 23-12-2015
  7. * @brief
  8. ******************************************************************************
  9. ******************************************************************************
  10. */
  11. /* Includes ------------------------------------------------------------------*/
  12. #include "RefreshMenu.h"
  13. #include "protocol.h"
  14. #include "can_app.h"
  15. #include "flash_if.h"
  16. /* Private variables ---------------------------------------------------------*/
  17. download_t downLoad;
  18. updatecount_t update;
  19. uint8_t flag_FlashWR[2048];
  20. extern void delay_1ms(uint32_t count);
  21. /* Private variables ---------------------------------------------------------*/
  22. /* Private function prototypes -----------------------------------------------*/
  23. void Protocol_Ack(void);
  24. void updateAck(void);
  25. void startUpAck(void);
  26. void timeOutAck(void);
  27. typedef void (*iapfun)(void); //定义一个函数类型的参数
  28. iapfun jumpFun;
  29. void JumpToApp(__IO uint32_t ApplicationAddress)
  30. {
  31. __IO uint32_t temp;
  32. /* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */
  33. if (((*(__IO uint32_t*)ApplicationAddress) &0x2FFE0000 ) == 0x20000000)
  34. {
  35. /* Get add */
  36. temp = (*(__IO uint32_t*)(ApplicationAddress + 4));
  37. jumpFun =(iapfun)temp;
  38. /* Initialize user application's Stack Pointer */
  39. __set_MSP(*(__IO uint32_t*)ApplicationAddress);
  40. /* Jump to user application */
  41. jumpFun();
  42. }
  43. else
  44. {
  45. delay_1ms(1);
  46. //downLoad.finished = DISABLE;
  47. }
  48. }
  49. /*******************************************************************************
  50. * Function: void User_Manu_Init(void)
  51. * Discrible: 初始化
  52. * Input:
  53. * Output:
  54. * Return:
  55. * Others:
  56. * date version author record
  57. * -----------------------------------------------
  58. * 20180419 V1.0 VINCENT Create
  59. *********************************************************************************/
  60. void User_Manu_Init(void)
  61. {
  62. FLASH_If_Init();
  63. //_.ackcmd = ACK_REQ;
  64. downLoad.step = 0;
  65. downLoad.packagecount = 0;
  66. downLoad.wrenable = DISABLE;
  67. downLoad.finished = DISABLE;
  68. downLoad.startUpSendCount = 0;
  69. update.TimeCounter_Startup = 1000;
  70. update.TimeCounter_Update = 0;
  71. }
  72. /*******************************************************************************
  73. * Function: void User_Main_Manu(void)
  74. * Discrible: 主菜单
  75. * Input:
  76. * Output:
  77. * Return:
  78. * Others:
  79. * date version author record
  80. * -----------------------------------------------
  81. * 20180419 V1.0 VINCENT Create
  82. *********************************************************************************/
  83. void User_Main_Manu(void)
  84. {
  85. while(1)
  86. {
  87. // Iwdg_Refresh();
  88. CAN_RxData_Process(&CAN_RxBuf_Struct1);
  89. startUpAck();
  90. updateAck();
  91. timeOutAck();
  92. if(downLoad.finished == ENABLE)
  93. {
  94. delay_1ms(50);
  95. can_deinit(CAN0);
  96. gpio_bit_reset(GPIOC, GPIO_PIN_1);
  97. JumpToApp(APPLICATION_ADDRESS);
  98. }
  99. }
  100. }
  101. void timeOutAck(void)
  102. {
  103. if((downLoad.finished == DISABLE) && (downLoad.step != 0))
  104. {
  105. if(update.TimeCounter_Update > 3000 ) //3000ms
  106. {
  107. update.TimeCounter_Update = 0;
  108. sendUpdateAck(CMD_ACK_ERR , downLoad.packagecount);
  109. downLoad.finished = ENABLE;
  110. }
  111. }
  112. }
  113. /*上电启动,或复位后*/
  114. void startUpAck(void)
  115. {
  116. if(downLoad.step == 0 )
  117. {
  118. if(downLoad.startUpSendCount < 4)
  119. {
  120. if(update.TimeCounter_Startup >= 50) //200ms
  121. {
  122. update.TimeCounter_Startup = 0;
  123. downLoad.startUpSendCount++;
  124. sendBootInfo();
  125. }
  126. }
  127. else
  128. {
  129. downLoad.finished = ENABLE;
  130. }
  131. }
  132. }
  133. void updateAck(void)
  134. {
  135. if( update.AckEnable == ENABLE )
  136. {
  137. update.AckEnable = DISABLE;
  138. switch(downLoad.step)
  139. {
  140. case 1:
  141. sendUpdateAck(downLoad.userCmd , 0x0000);
  142. break;
  143. case 2:
  144. sendUpdateAck(downLoad.userCmd , downLoad.packagecount);
  145. break;
  146. case 3:
  147. sendUpdateAck(downLoad.userCmd , 0x0000);
  148. downLoad.finished = ENABLE;
  149. break;
  150. case 5:
  151. sendAck();
  152. downLoad.step = 0;
  153. downLoad.finished = DISABLE;
  154. downLoad.startUpSendCount = 0;
  155. break;
  156. default :
  157. break;
  158. }
  159. }
  160. if(downLoad.wrenable == ENABLE)
  161. {
  162. downLoad.wrenable = DISABLE;
  163. //写flash
  164. if((downLoad.packagecount <= 2048) && ( downLoad.packagecount > 0 ) )
  165. {
  166. if(flag_FlashWR[downLoad.packagecount - 1] == 0 )
  167. {
  168. if(FLASH_If_Write( (downLoad.packagecount - 1) * PACKET_128B_SIZE + APPLICATION_ADDRESS, (uint32_t *)downLoad.dataBuff_128B, 32) != FLASHIF_OK )
  169. {
  170. while(1)
  171. {
  172. sendUpdateAck(CMD_ACK_ERR_FLASH , 0xee);
  173. // Iwdg_Refresh();
  174. delay_1ms(1000);
  175. }
  176. }
  177. flag_FlashWR[downLoad.packagecount - 1] = 1;
  178. /* 写完FLASH后立即应答,清超时计数 */
  179. update.AckEnable = ENABLE;
  180. /*清除超时标志*/
  181. update.TimeCounter_Update = 0;
  182. }
  183. else
  184. {
  185. /*重复写入,可能是上位机没有接收到正确应答信号,重发了数据包,
  186. 应答一个正确信号,让上位机发送下一包数据*/
  187. sendUpdateAck(CMD_ACK_OK, downLoad.packagecount);
  188. sendUpdateAck(CMD_ACK_ERR_FLASH , 0xe1);
  189. }
  190. }
  191. else
  192. {
  193. sendUpdateAck(CMD_ACK_ERR_FLASH , 0xe2);
  194. }
  195. }
  196. }
  197. /*******************************************************************************
  198. * Function: void Period_Stick(void)
  199. * Discrible: 周期定时器
  200. * Input:
  201. * Output:
  202. * Return:
  203. * Others:
  204. * date version author record
  205. * -----------------------------------------------
  206. * 20160307 V1.0 VINCENT Create
  207. *********************************************************************************/
  208. void Period_Stick(void)
  209. {
  210. update.TimeCounter_Startup++;
  211. update.TimeCounter_Update++;
  212. }
  213. /************************ (C) END OF FILE *********************************/