soft_uart.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. #include "soft_uart.h"
  2. #include "string.h"
  3. #include "soft_flash.h"
  4. #include "soft_crc.h"
  5. #include "usart.h"
  6. extern UART_HandleTypeDef huart2;
  7. bool fmu_version_ack = false;
  8. void uart2_send_msg(uint8_t *data, uint8_t size)
  9. {
  10. static uint32_t send_time = 0;
  11. send_time = HAL_GetTick();
  12. while (HAL_GetTick() - send_time < 1)
  13. ;
  14. HAL_UART_Transmit_DMA(&huart2, data, size);
  15. }
  16. uint8_t FMU_uart_buf[MAX_UART_BUF] = {0};
  17. Update update;
  18. void USER_UART_IRQHandler(UART_HandleTypeDef *huart)
  19. {
  20. uint32_t recv_count = 0;
  21. if (huart == &huart2)
  22. {
  23. if (RESET != __HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE))
  24. {
  25. __HAL_UART_CLEAR_IDLEFLAG(huart);
  26. HAL_UART_AbortReceive(huart);
  27. recv_count = MAX_UART_BUF - __HAL_DMA_GET_COUNTER(huart->hdmarx);
  28. // 检测是否是新的一包数据
  29. if (FMU_uart_buf[0] == 0xFE && FMU_uart_buf[4] == 204 && update.usebuf_flag == false)
  30. {
  31. memcpy(update.data, FMU_uart_buf, recv_count);
  32. update.usebuf_flag = true;
  33. }
  34. else if(FMU_uart_buf[5] == 21 && FMU_uart_buf[6] == 26 && FMU_uart_buf[7] == 3)
  35. {
  36. fmu_version_ack = true;
  37. }
  38. memset(FMU_uart_buf, 0, MAX_UART_BUF);
  39. HAL_UART_Receive_DMA(huart, FMU_uart_buf, MAX_UART_BUF);
  40. }
  41. }
  42. }
  43. uint8_t msg_buf[128] = {0};
  44. uint32_t cur_pack_num = 0;
  45. void send_pmu_version(void)
  46. {
  47. static int time2_hz = 0;
  48. if (check_usart_is_ok() != true)
  49. return;
  50. if(fmu_version_ack == true)
  51. return;
  52. if(cur_pack_num > 1)
  53. return;
  54. if(HAL_GetTick() - time2_hz > 500 && HAL_GetTick() > 2000)
  55. time2_hz = HAL_GetTick();
  56. else
  57. return;
  58. uint8_t index = 0;
  59. uint16_t s16 = 0;
  60. char sn_buf[12] = {0};
  61. char hardverison_buf[12] = {0};
  62. memset(msg_buf,0,128);
  63. msg_buf[index++] = 0xFE;
  64. msg_buf[index++] = 0;
  65. msg_buf[index++] = 0;
  66. msg_buf[index++] = 0x00;
  67. msg_buf[index++] = 0x00;
  68. msg_buf[index++] = 26;
  69. s16 = 3;
  70. memcpy(&msg_buf[index],&s16,2); //PMU设备号
  71. index += 2;
  72. msg_buf[index++] = 1;
  73. Int2String(pmu_sn,&sn_buf[0],12);
  74. Int2String(pmu_hardversion,&hardverison_buf[0],12);
  75. memcpy(&msg_buf[index],&sn_buf[0],10);//sn
  76. index += 32;
  77. index += 16;
  78. memcpy(&msg_buf[index],&hardverison_buf[0],10);//硬件日期
  79. index += 16;//硬件
  80. index += 16;//厂商
  81. msg_buf[1] = index - 6;
  82. uint16_t uart_crc = Get_Crc16(msg_buf, index);
  83. memcpy(&msg_buf[index], &uart_crc, 2);
  84. index += 2;
  85. uart2_send_msg(msg_buf, index);
  86. }
  87. void Update_ack_fmu(uint8_t msg_id, uint8_t *ackbuf)
  88. {
  89. int index = 0;
  90. msg_buf[index++] = 0xFE;
  91. msg_buf[index++] = 0;
  92. msg_buf[index++] = 0;
  93. msg_buf[index++] = 0x00;
  94. msg_buf[index++] = 204;
  95. msg_buf[index++] = 21;
  96. msg_buf[index++] = msg_id;
  97. msg_buf[index++] = *ackbuf;
  98. msg_buf[index++] = *(ackbuf + 1);
  99. msg_buf[index++] = 1;
  100. msg_buf[1] = index - 6;
  101. uint16_t uart_crc = Get_Crc16(msg_buf, index);
  102. memcpy(&msg_buf[index], &uart_crc, 2);
  103. index += 2;
  104. uart2_send_msg(msg_buf, index);
  105. }
  106. bool check_usart_is_ok(void)
  107. {
  108. if (huart2.gState == HAL_UART_STATE_READY && (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_TC) != RESET && __HAL_UART_GET_FLAG(&huart2, UART_FLAG_TXE) != RESET))
  109. {
  110. }
  111. else
  112. {
  113. return false;
  114. }
  115. return true;
  116. }
  117. uint32_t addr_offset = 0;
  118. bool update_complete = false;
  119. void update_function(void)
  120. {
  121. uint16_t crc = Get_Crc16(update.data, (uint16_t)update.data[LEN] + 2 + 6);
  122. int temp_32t = 0;
  123. if (crc != 0 || check_usart_is_ok() != true)
  124. {
  125. update.usebuf_flag = false;
  126. return;
  127. }
  128. switch (update.data[MSGID_ID])
  129. {
  130. case UPDATE_START:
  131. memcpy(&temp_32t, &update.data[PAYLOAD], 4);
  132. if (temp_32t < 231424 && temp_32t > 112640) //新固件大小在110kb-226kb之间
  133. {
  134. if(cur_pack_num > 1) //中途重新升级
  135. HAL_NVIC_SystemReset();
  136. temp_32t = 0;
  137. Update_ack_fmu(UPDATE_START, (uint8_t *)&temp_32t);
  138. addr_offset = 0;
  139. cur_pack_num = 1;
  140. }
  141. break;
  142. case UPDATE_ING:
  143. if (cur_pack_num == update.data[PAYLOAD] + update.data[PAYLOAD + 1] * 256)
  144. {
  145. temp_32t = Flash_WriteData(FLASH_APP_ADDR + addr_offset, (uint16_t *)&update.data[PAYLOAD + 2], (update.data[LEN] - 2) / 2);
  146. if (temp_32t == WRITE_SUCCESS)
  147. {
  148. cur_pack_num++;
  149. addr_offset += update.data[LEN] - 2;
  150. Update_ack_fmu(UPDATE_ING, &update.data[PAYLOAD]);
  151. }
  152. }
  153. else if(cur_pack_num > update.data[PAYLOAD] + update.data[PAYLOAD + 1] * 256)
  154. {
  155. Update_ack_fmu(UPDATE_ING, &update.data[PAYLOAD]);
  156. }
  157. break;
  158. case UPDATE_END:
  159. temp_32t = 0;
  160. if(update_complete != true)
  161. {
  162. update_complete = wirte_update_flag();
  163. if(update_complete == true)
  164. Update_ack_fmu(UPDATE_END, (uint8_t *)&temp_32t);
  165. HAL_Delay(50);
  166. }
  167. break;
  168. default:
  169. break;
  170. }
  171. update.usebuf_flag = false;
  172. memset(update.data, 0, MAX_UART_BUF);
  173. }
  174. void init_usart(void)
  175. {
  176. __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE); //uart2 空闲中断
  177. HAL_UART_Receive_DMA(&huart2, (uint8_t *)FMU_uart_buf, MAX_UART_BUF);
  178. //开启错误处理机制
  179. __HAL_UART_ENABLE_IT(&huart2, UART_IT_ERR);
  180. }