soft_uart.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512
  1. #include "soft_uart.h"
  2. #include "usart.h"
  3. #include "stdbool.h"
  4. #include "soft_timer.h"
  5. #include "soft_adc.h"
  6. #include "soft_flow.h"
  7. #include "soft_crc.h"
  8. #include <string.h>
  9. #include "stdbool.h"
  10. #include "tim.h"
  11. #include "hard_led.h"
  12. #include "soft_can.h"
  13. #include "stdio.h"
  14. #include "soft_bms.h"
  15. #include "soft_terrain.h"
  16. #include "soft_obstacle.h"
  17. #include "soft_okcell.h"
  18. #include "soft_adc.h"
  19. #include "soft_p_2_c.h"
  20. #include "soft_engine.h"
  21. #include "stm32f1xx_it.h"
  22. #include "bsp_serial.h"
  23. #include "rkfifo.h"
  24. #include "stm32f1xx_hal_def.h"
  25. #include "soft_update.h"
  26. #include "common.h"
  27. #include "soft_water_device.h"
  28. #include "config.h"
  29. #include "soft_seed_device.h"
  30. uint8_t Update_buf[150] = {0};
  31. Vk_protocol vk_protocol;
  32. rkfifo_t send_uart_rkfifo;
  33. bool radar_update_flag = false; //雷达升级标志
  34. Uart uart_info = {.vk_dev_pack_num = 1};
  35. /**
  36. * @file printf
  37. * @brief 串口发送重定向
  38. * @param
  39. * @details
  40. * @author Zhang Sir
  41. **/
  42. int _write(int fd, char *pBuffer, int size)
  43. {
  44. uint32_t uart3_send_count_time = HAL_GetTick();
  45. while (__HAL_UART_GET_FLAG(&huart3, UART_FLAG_TC) == 0 &&
  46. HAL_GetTick() - uart3_send_count_time < 5)
  47. ;
  48. HAL_UART_Transmit(&huart3, (uint8_t *)pBuffer, size, 0xff);
  49. return size;
  50. }
  51. /**
  52. * @file uart_send_is_ok
  53. * @brief 检测串口是否可用
  54. * @param uart_num 串口号
  55. * @details
  56. * @author Zhang Sir
  57. **/
  58. bool uart_send_is_ok(uint8_t uart_num)
  59. {
  60. //设备升级不发送
  61. //if(radar_update_flag == true)
  62. // return false;
  63. // if(uart_info.vk_dev_update_flag == true)
  64. // return false;
  65. if (uart_num == USART_2)
  66. {
  67. 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))
  68. {
  69. }
  70. else
  71. {
  72. return false;
  73. }
  74. //延迟1ms发送,防止如果是空闲中断接收,连续发送变成一包
  75. if(HAL_GetTick() - uart2_send_delay_time <= 1)
  76. {
  77. return false;
  78. }
  79. }
  80. else if (uart_num == USART_3)
  81. {
  82. if (huart3.gState == HAL_UART_STATE_READY && (__HAL_UART_GET_FLAG(&huart3, UART_FLAG_TC) != RESET && __HAL_UART_GET_FLAG(&huart3, UART_FLAG_TXE) != RESET))
  83. {
  84. }
  85. else
  86. {
  87. return false;
  88. }
  89. if(HAL_GetTick() - uart3_send_delay_time <= 1)
  90. {
  91. return false;
  92. }
  93. }
  94. return true;
  95. }
  96. /**
  97. * @file uart2_send_msg
  98. * @brief 串口2发送
  99. * @param
  100. * @details
  101. * @author Zhang Sir
  102. **/
  103. uint32_t uart2_send_delay_time = 0;
  104. uint32_t uart3_send_delay_time = 0;
  105. void uart2_send_msg(uint8_t *data, uint8_t size)
  106. {
  107. // static uint32_t send_time = 0;
  108. // send_time = HAL_GetTick();
  109. // //防止连续发送使多个数据变成一个
  110. // while (HAL_GetTick() - send_time <= 1)
  111. // ;
  112. rkfifo_in(&send_uart_rkfifo,data,size);
  113. // HAL_UART_Transmit_DMA(&huart2, data, size);
  114. // uart2_send_delay_time = HAL_GetTick();
  115. //bspSerialWrite(&serial2,data,size);
  116. }
  117. uint8_t send_uart_buf[256] = {0};
  118. void send_uartfifo_msg(void)
  119. {
  120. uint16_t len = 0;
  121. if(uart_send_is_ok(USART_2) == true)
  122. {
  123. len = rkfifo_out(&send_uart_rkfifo, &send_uart_buf, 256);
  124. if(len > 0)
  125. {
  126. HAL_UART_Transmit_DMA(&huart2, send_uart_buf, len);
  127. uart2_send_delay_time = HAL_GetTick();
  128. }
  129. }
  130. }
  131. //uart3 发送调用函数
  132. void uart3_send_msg(uint8_t *data, uint8_t size)
  133. {
  134. static uint32_t send_time3 = 0;
  135. send_time3 = HAL_GetTick();
  136. while (HAL_GetTick() - send_time3 <= 1)
  137. ;
  138. HAL_UART_Transmit_DMA(&huart3, data, size);
  139. uart3_send_delay_time = HAL_GetTick();
  140. }
  141. /**
  142. * @file UART_Init
  143. * @brief UART23初始化接收空闲中断 开起DMA
  144. * @param
  145. * @details
  146. * @author Zhang Sir
  147. **/
  148. void UART_Init(void)
  149. {
  150. //uart2
  151. //__HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE); //接收到一个字节产生一次中断
  152. //HAL_UART_Receive_IT(&huart2, &test_buf, 1);
  153. __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE); //uart2 空闲中断
  154. HAL_UART_Receive_DMA(&huart2, (uint8_t *)uart_info.uart2_recv_buf, MAX_UART_BUF);
  155. //开启错误处理机制
  156. __HAL_UART_ENABLE_IT(&huart2, UART_IT_ERR);
  157. //uart3
  158. //HAL_UART_Receive_IT(&huart3, (uint8_t *)uart_info.uart3_recv_buf, 1);
  159. __HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);
  160. HAL_UART_Receive_DMA(&huart3, (uint8_t *)uart_info.uart3_recv_buf, MAX_UART_BUF/2);
  161. //开启错误处理机制
  162. __HAL_UART_ENABLE_IT(&huart3, UART_IT_ERR);
  163. }
  164. /**
  165. * @file USER_UART_IRQHandler
  166. * @brief user用户中断函数
  167. * @param
  168. * @details
  169. * @author Zhang Sir
  170. **/
  171. uint32_t read_DR;
  172. rkfifo_t recv_rkfifo;
  173. void USER_UART_IRQHandler(UART_HandleTypeDef *huart)
  174. {
  175. if (huart == &huart2)
  176. {
  177. if (RESET != __HAL_UART_GET_FLAG(&huart2, UART_FLAG_IDLE))
  178. {
  179. read_DR = huart2.Instance->DR;
  180. __HAL_UART_CLEAR_IDLEFLAG(&huart2);
  181. HAL_UART_AbortReceive(&huart2);//HAL_UART_DMAStop 有问题
  182. uart_info.uart_dma_recv_counts = MAX_UART_BUF - __HAL_DMA_GET_COUNTER(huart->hdmarx);
  183. for(uint8_t i = 0;i<uart_info.uart_dma_recv_counts;i++)
  184. {
  185. if(uart_info.uart2_recv_buf[i] == 0xfe && uart_info.uart2_recv_buf[i+5] == 27)
  186. {
  187. time_heart[0] = HAL_GetTick();
  188. time_count[0]++;
  189. }
  190. }
  191. rkfifo_in(&recv_rkfifo,uart_info.uart2_recv_buf,uart_info.uart_dma_recv_counts);
  192. memset(uart_info.uart2_recv_buf,0,MAX_UART_BUF);
  193. HAL_UART_Receive_DMA(&huart2, uart_info.uart2_recv_buf, MAX_UART_BUF);
  194. }
  195. }
  196. if(huart == &huart3)
  197. {
  198. if (RESET != __HAL_UART_GET_FLAG(&huart3, UART_FLAG_IDLE))
  199. {
  200. read_DR = huart3.Instance->DR;
  201. __HAL_UART_CLEAR_IDLEFLAG(&huart3); //清除中断标志位,不清除一直在中断里
  202. HAL_UART_AbortReceive(&huart3);
  203. uart_info.uart_dma_recv_counts = MAX_UART_BUF - __HAL_DMA_GET_COUNTER(huart->hdmarx);
  204. //串口三接奥安,上飞发动机
  205. if (aoan_engine_Link.connect_status != COMP_NOEXIST)
  206. {
  207. decode_aoan_engine(uart_info.uart3_recv_buf, uart_info.uart_dma_recv_counts);
  208. }
  209. else if (vkv3_engine_link.connect_status != COMP_NOEXIST)
  210. {
  211. decode_vkv3_engine(uart_info.uart3_recv_buf, uart_info.uart_dma_recv_counts);
  212. }
  213. else
  214. {
  215. //根据协议选择设备
  216. decode_vkv3_engine(uart_info.uart3_recv_buf, uart_info.uart_dma_recv_counts);
  217. decode_aoan_engine(uart_info.uart3_recv_buf, uart_info.uart_dma_recv_counts);
  218. }
  219. HAL_UART_Receive_DMA(&huart3, (uint8_t *)uart_info.uart3_recv_buf, MAX_UART_BUF/2);
  220. }
  221. }
  222. }
  223. /**
  224. * @file HAL_UART_ErrorCallback
  225. * @brief uart错误中断回调函数
  226. * @param
  227. * @details
  228. * @author Zhang Sir
  229. **/
  230. void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
  231. {
  232. if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) //接收溢出检测
  233. {
  234. __HAL_UART_CLEAR_OREFLAG(huart);
  235. }
  236. if (__HAL_UART_GET_FLAG (huart, UART_FLAG_RXNE) != RESET)//接收数据
  237. {
  238. __HAL_UART_CLEAR_FLAG (huart, UART_FLAG_RXNE);
  239. }
  240. __HAL_UART_CLEAR_PEFLAG (huart);
  241. if (huart == &huart2)
  242. {
  243. HAL_UART_Receive_DMA(&huart2, (uint8_t *)uart_info.uart2_recv_buf, MAX_UART_BUF);
  244. }
  245. else if (huart == &huart3)
  246. {
  247. HAL_UART_Receive_DMA(&huart3, (uint8_t *)uart_info.uart3_recv_buf, MAX_UART_BUF/2);
  248. }
  249. }
  250. /**
  251. * @file HAL_UART_TxCpltCallback
  252. * @brief uart发送回调
  253. * @param
  254. * @details
  255. * @author Zhang Sir
  256. **/
  257. void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
  258. {
  259. if (huart == &huart2)
  260. {
  261. }
  262. }
  263. /**
  264. * @file check_uart_data
  265. * @brief 接收数据组包解析
  266. * @param
  267. * @details
  268. * @author Zhang Sir
  269. **/
  270. Msg_Rx_Stage recv_step;
  271. Vk_protocol fcu_protocol;
  272. Vk_protocol vk_data = {.head = 0XFE,
  273. .system_id = 0,
  274. .head_bytes = 6,
  275. .check_bytes = 2};
  276. void check_uart_data(rkfifo_t *fifo)
  277. {
  278. uint8_t c = 0;
  279. static uint32_t vk_recv_time = 0;
  280. static uint8_t i = 0;
  281. while (rkfifo_out(fifo, &c, 1) != 0)
  282. {
  283. if(recv_step != RX_HEAD && HAL_GetTick() - vk_recv_time > 200)
  284. {
  285. recv_step = RX_HEAD;
  286. }
  287. //解析出一包完整的数据
  288. switch (recv_step)
  289. {
  290. case RX_HEAD:
  291. if(c == vk_data.head)
  292. {
  293. vk_recv_time = HAL_GetTick();
  294. recv_step = RX_PAYLOAD_LEN;
  295. }
  296. break;
  297. case RX_PAYLOAD_LEN:
  298. vk_data.len = c;
  299. recv_step = RX_SEQ;
  300. break;
  301. case RX_SEQ:
  302. vk_data.seq = c;
  303. recv_step = RX_SYSID;
  304. break;
  305. case RX_SYSID:
  306. if(c == vk_data.system_id)
  307. {
  308. recv_step = RX_GROUPID;
  309. }
  310. else
  311. {
  312. recv_step = RX_HEAD;
  313. }
  314. break;
  315. case RX_GROUPID:
  316. if(c == GROUP_ID_FCU || c == GROUP_ID_PMU_UPDATE || c == GROUP_ID_F_UPDATE ||
  317. c == GROUP_ID_B_UPDATE || c == GROUP_ID_T_UPDATE|| c == GROUP_ID_WEIGHT_UPDATE)
  318. {
  319. vk_data.group_id = c;
  320. recv_step = RX_MSGID;
  321. }
  322. else
  323. {
  324. recv_step = RX_HEAD;
  325. }
  326. break;
  327. case RX_MSGID:
  328. vk_data.msg_id = c;
  329. if(c == 27)
  330. {
  331. time_heart[2] = HAL_GetTick();
  332. time_count[2]++;
  333. }
  334. recv_step = RX_PAYLOAD;
  335. i = 0;
  336. break;
  337. case RX_PAYLOAD:
  338. vk_data.payload[vk_data.head_bytes + i] = c;
  339. i++;
  340. if(i == vk_data.len)
  341. {
  342. recv_step = RX_CHECK_LOW;
  343. }
  344. else if(vk_data.len == 0) //没有payload
  345. {
  346. recv_step = RX_CHECK_HIGH;
  347. }
  348. break;
  349. case RX_CHECK_LOW:
  350. vk_data.payload[vk_data.head_bytes + i] = c;
  351. i++;
  352. recv_step = RX_CHECK_HIGH;
  353. break;
  354. case RX_CHECK_HIGH:
  355. vk_data.payload[vk_data.head_bytes + i] = c;
  356. vk_data.payload[0] = vk_data.head;
  357. vk_data.payload[1] = vk_data.len;
  358. vk_data.payload[2] = vk_data.seq;
  359. vk_data.payload[3] = vk_data.system_id;
  360. vk_data.payload[4] = vk_data.group_id;
  361. vk_data.payload[5] = vk_data.msg_id;
  362. if(0 == Get_Crc16(&vk_data.payload[0],vk_data.len + vk_data.head_bytes + vk_data.check_bytes))
  363. {
  364. if(vk_data.group_id == GROUP_ID_FCU || vk_data.group_id == GROUP_ID_PMU_UPDATE)
  365. {
  366. fcu_protocol.msg_id = vk_data.msg_id;
  367. memcpy(&fcu_protocol.payload[0],&vk_data.payload[0],vk_data.len + vk_data.head_bytes + vk_data.check_bytes);
  368. uart_info.fcu_buf_flag = true;
  369. }
  370. //莫之比雷达升级
  371. else if(((vk_data.group_id == GROUP_ID_F_UPDATE && uavr11_info.Link.connect_status != COMP_NOEXIST) ||
  372. (vk_data.group_id == GROUP_ID_B_UPDATE && uavr12_info.Link.connect_status != COMP_NOEXIST) ||
  373. (vk_data.group_id == GROUP_ID_T_UPDATE && uavr56_info.Link.connect_status != COMP_NOEXIST)) &&
  374. (Dev.Part_Bradar_Link.connect_status == COMP_NOEXIST && Dev.Part_Fradar_Link.connect_status == COMP_NOEXIST))
  375. {
  376. if(uart_info.use_update_buf_flag == false)
  377. {
  378. uart_info.update_time = HAL_GetTick();
  379. memcpy(&Update_buf[0],&vk_data.payload[0],vk_data.len + vk_data.head_bytes + vk_data.check_bytes);
  380. uart_info.use_update_buf_flag = true;
  381. if (vk_data.msg_id == 200)
  382. {
  383. {
  384. radar_update_flag = true;
  385. update_count = 0;
  386. }
  387. }
  388. }
  389. else
  390. {
  391. if(HAL_GetTick() - uart_info.update_time > 3000)
  392. {
  393. uart_info.use_update_buf_flag = false;
  394. }
  395. }
  396. }
  397. //VK协议设备升级
  398. else if (vk_data.group_id == GROUP_ID_WEIGHT_UPDATE ||
  399. (vk_data.group_id == GROUP_ID_F_UPDATE /*&& mimo_f_info.Link.connect_status != COMP_NOEXIST*/) || //mimo
  400. (vk_data.group_id == GROUP_ID_B_UPDATE /*&& mimo_b_info.Link.connect_status != COMP_NOEXIST*/) || //mimo
  401. (vk_data.group_id == GROUP_ID_T_UPDATE /*&& mimo_ter_info.Link.connect_status != COMP_NOEXIST*/)) //mimo
  402. {
  403. #ifdef mimo_update
  404. if(vk_data.msg_id == 200)
  405. {
  406. if(EZup_par.step == STEP_DEFAULT)//mimo
  407. {//mimo
  408. memset(&EZup_par,0,sizeof(ez_update));//mimo
  409. memset(&uart_info.fcu_buf_flag,0,sizeof(Uart));
  410. memcpy(&uart_info.bin_size,&vk_data.payload[6],4);
  411. uart_info.vk_dev_pack_num = 1;
  412. uart_info.vk_dev_update_flag = true;
  413. EZup_par.update_flag = true;//mimo
  414. EZup_par.step = STEP_FIND_NODE;//mimo
  415. }
  416. }
  417. #else
  418. if(vk_data.msg_id == 200)
  419. {
  420. memset(&uart_info.fcu_buf_flag,0,sizeof(Uart));
  421. memcpy(&uart_info.bin_size,&vk_data.payload[6],4);
  422. uart_info.vk_dev_pack_num = 1;
  423. uart_info.vk_dev_update_flag = true;
  424. }
  425. #endif
  426. //if(uart_info.use_update_buf_flag == false)
  427. //{
  428. memcpy(&Update_buf[0],&vk_data.payload[0],vk_data.len + vk_data.head_bytes + vk_data.check_bytes);
  429. //判断是否是需要的包序号
  430. if(uart_info.vk_dev_pack_num > (Update_buf[PACK_NUM] + Update_buf[PACK_NUM + 1] * 256) &&
  431. vk_data.msg_id == 201)
  432. {
  433. Update_ack_func(Update_buf[DEVICE],201,&Update_buf[PACK_NUM]);
  434. }
  435. uart_info.use_update_buf_flag = true;
  436. //}
  437. }
  438. }
  439. else
  440. {
  441. //vk_protocol_test[4]++;
  442. }
  443. recv_step = RX_HEAD;
  444. break;
  445. default:
  446. recv_step = RX_HEAD;
  447. //vk_protocol_test[5]++;
  448. break;
  449. }
  450. if( uart_info.fcu_buf_flag == true)
  451. break;
  452. }
  453. }