123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499 |
- #include "soft_uart.h"
- #include "usart.h"
- #include "stdbool.h"
- #include "soft_timer.h"
- #include "soft_adc.h"
- #include "soft_flow.h"
- #include "soft_crc.h"
- #include <string.h>
- #include "stdbool.h"
- #include "tim.h"
- #include "hard_led.h"
- #include "soft_can.h"
- #include "stdio.h"
- #include "soft_bms.h"
- #include "soft_terrain.h"
- #include "soft_obstacle.h"
- #include "soft_okcell.h"
- #include "soft_adc.h"
- #include "soft_p_2_c.h"
- #include "soft_engine.h"
- #include "stm32f1xx_it.h"
- #include "bsp_serial.h"
- #include "rkfifo.h"
- #include "stm32f1xx_hal_def.h"
- #include "soft_update.h"
- #include "common.h"
- #include "soft_water_device.h"
- #include "config.h"
- uint8_t Update_buf[150] = {0};
- Vk_protocol vk_protocol;
- rkfifo_t send_uart_rkfifo;
- bool radar_update_flag = false; //雷达升级标志
- Uart uart_info = {.vk_dev_pack_num = 1};
- /**
- * @file printf
- * @brief 串口发送重定向
- * @param
- * @details
- * @author Zhang Sir
- **/
- int _write(int fd, char *pBuffer, int size)
- {
- uint32_t uart3_send_count_time = HAL_GetTick();
- while (__HAL_UART_GET_FLAG(&huart3, UART_FLAG_TC) == 0 &&
- HAL_GetTick() - uart3_send_count_time < 5)
- ;
- HAL_UART_Transmit(&huart3, (uint8_t *)pBuffer, size, 0xff);
- return size;
- }
- /**
- * @file uart_send_is_ok
- * @brief 检测串口是否可用
- * @param uart_num 串口号
- * @details
- * @author Zhang Sir
- **/
- bool uart_send_is_ok(uint8_t uart_num)
- {
- //设备升级不发送
- //if(radar_update_flag == true)
- // return false;
- // if(uart_info.vk_dev_update_flag == true)
- // return false;
- if (uart_num == USART_2)
- {
- 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))
- {
- }
- else
- {
- return false;
- }
- //延迟1ms发送,防止如果是空闲中断接收,连续发送变成一包
- if(HAL_GetTick() - uart2_send_delay_time <= 1)
- {
- return false;
- }
- }
- else if (uart_num == USART_3)
- {
- 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))
- {
- }
- else
- {
- return false;
- }
- if(HAL_GetTick() - uart3_send_delay_time <= 1)
- {
- return false;
- }
- }
- return true;
- }
- /**
- * @file uart2_send_msg
- * @brief 串口2发送
- * @param
- * @details
- * @author Zhang Sir
- **/
- uint32_t uart2_send_delay_time = 0;
- uint32_t uart3_send_delay_time = 0;
- void uart2_send_msg(uint8_t *data, uint8_t size)
- {
- // static uint32_t send_time = 0;
- // send_time = HAL_GetTick();
- // //防止连续发送使多个数据变成一个
- // while (HAL_GetTick() - send_time <= 1)
- // ;
- rkfifo_in(&send_uart_rkfifo,data,size);
- // HAL_UART_Transmit_DMA(&huart2, data, size);
- // uart2_send_delay_time = HAL_GetTick();
- //bspSerialWrite(&serial2,data,size);
- }
- uint8_t send_uart_buf[256] = {0};
- void send_uartfifo_msg(void)
- {
- uint16_t len = 0;
- if(uart_send_is_ok(USART_2) == true)
- {
- len = rkfifo_out(&send_uart_rkfifo, &send_uart_buf, 256);
- if(len > 0)
- {
- HAL_UART_Transmit_DMA(&huart2, send_uart_buf, len);
- uart2_send_delay_time = HAL_GetTick();
- }
- }
- }
- //uart3 发送调用函数
- void uart3_send_msg(uint8_t *data, uint8_t size)
- {
- static uint32_t send_time3 = 0;
- send_time3 = HAL_GetTick();
- while (HAL_GetTick() - send_time3 <= 1)
- ;
- HAL_UART_Transmit_DMA(&huart3, data, size);
- uart3_send_delay_time = HAL_GetTick();
- }
- /**
- * @file UART_Init
- * @brief UART23初始化接收空闲中断 开起DMA
- * @param
- * @details
- * @author Zhang Sir
- **/
- void UART_Init(void)
- {
- //uart2
- //__HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE); //接收到一个字节产生一次中断
- //HAL_UART_Receive_IT(&huart2, &test_buf, 1);
- __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE); //uart2 空闲中断
- HAL_UART_Receive_DMA(&huart2, (uint8_t *)uart_info.uart2_recv_buf, MAX_UART_BUF);
- //开启错误处理机制
- __HAL_UART_ENABLE_IT(&huart2, UART_IT_ERR);
- //uart3
- //HAL_UART_Receive_IT(&huart3, (uint8_t *)uart_info.uart3_recv_buf, 1);
- __HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);
- HAL_UART_Receive_DMA(&huart3, (uint8_t *)uart_info.uart3_recv_buf, MAX_UART_BUF/2);
- //开启错误处理机制
- __HAL_UART_ENABLE_IT(&huart3, UART_IT_ERR);
- }
- /**
- * @file USER_UART_IRQHandler
- * @brief user用户中断函数
- * @param
- * @details
- * @author Zhang Sir
- **/
- uint32_t read_DR;
- rkfifo_t recv_rkfifo;
- void USER_UART_IRQHandler(UART_HandleTypeDef *huart)
- {
- if (huart == &huart2)
- {
- if (RESET != __HAL_UART_GET_FLAG(&huart2, UART_FLAG_IDLE))
- {
- read_DR = huart2.Instance->DR;
- __HAL_UART_CLEAR_IDLEFLAG(&huart2);
- HAL_UART_AbortReceive(&huart2);//HAL_UART_DMAStop 有问题
- uart_info.uart_dma_recv_counts = MAX_UART_BUF - __HAL_DMA_GET_COUNTER(huart->hdmarx);
- rkfifo_in(&recv_rkfifo,uart_info.uart2_recv_buf,uart_info.uart_dma_recv_counts);
-
- memset(uart_info.uart2_recv_buf,0,MAX_UART_BUF);
- HAL_UART_Receive_DMA(&huart2, uart_info.uart2_recv_buf, MAX_UART_BUF);
- }
- }
- if(huart == &huart3)
- {
- if (RESET != __HAL_UART_GET_FLAG(&huart3, UART_FLAG_IDLE))
- {
- read_DR = huart3.Instance->DR;
- __HAL_UART_CLEAR_IDLEFLAG(&huart3); //清除中断标志位,不清除一直在中断里
- HAL_UART_AbortReceive(&huart3);
- uart_info.uart_dma_recv_counts = MAX_UART_BUF - __HAL_DMA_GET_COUNTER(huart->hdmarx);
- //串口三接奥安,上飞发动机
- if (aoan_engine_Link.connect_status != COMP_NOEXIST)
- {
- decode_aoan_engine(uart_info.uart3_recv_buf, uart_info.uart_dma_recv_counts);
- }
- else if (vkv3_engine_link.connect_status != COMP_NOEXIST)
- {
- decode_vkv3_engine(uart_info.uart3_recv_buf, uart_info.uart_dma_recv_counts);
- }
- else
- {
- //根据协议选择设备
- decode_vkv3_engine(uart_info.uart3_recv_buf, uart_info.uart_dma_recv_counts);
- decode_aoan_engine(uart_info.uart3_recv_buf, uart_info.uart_dma_recv_counts);
- }
- HAL_UART_Receive_DMA(&huart3, (uint8_t *)uart_info.uart3_recv_buf, MAX_UART_BUF/2);
- }
- }
- }
- /**
- * @file HAL_UART_ErrorCallback
- * @brief uart错误中断回调函数
- * @param
- * @details
- * @author Zhang Sir
- **/
- void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
- {
- if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) //接收溢出检测
- {
- __HAL_UART_CLEAR_OREFLAG(huart);
- }
- if (__HAL_UART_GET_FLAG (huart, UART_FLAG_RXNE) != RESET)//接收数据
- {
- __HAL_UART_CLEAR_FLAG (huart, UART_FLAG_RXNE);
- }
- __HAL_UART_CLEAR_PEFLAG (huart);
- if (huart == &huart2)
- {
- HAL_UART_Receive_DMA(&huart2, (uint8_t *)uart_info.uart2_recv_buf, MAX_UART_BUF);
- }
- else if (huart == &huart3)
- {
- HAL_UART_Receive_DMA(&huart3, (uint8_t *)uart_info.uart3_recv_buf, MAX_UART_BUF/2);
- }
- }
- /**
- * @file HAL_UART_TxCpltCallback
- * @brief uart发送回调
- * @param
- * @details
- * @author Zhang Sir
- **/
- void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
- {
- if (huart == &huart2)
- {
-
- }
- }
- /**
- * @file check_uart_data
- * @brief 接收数据组包解析
- * @param
- * @details
- * @author Zhang Sir
- **/
- Msg_Rx_Stage recv_step;
- Vk_protocol fcu_protocol;
- Vk_protocol vk_data = {.head = 0XFE,
- .system_id = 0,
- .head_bytes = 6,
- .check_bytes = 2};
- void check_uart_data(rkfifo_t *fifo)
- {
- uint8_t c = 0;
- static uint32_t vk_recv_time = 0;
- static uint8_t i = 0;
- while (rkfifo_out(fifo, &c, 1) != 0)
- {
- if(recv_step != RX_HEAD && HAL_GetTick() - vk_recv_time > 200)
- {
- recv_step = RX_HEAD;
- }
- //解析出一包完整的数据
- switch (recv_step)
- {
- case RX_HEAD:
- if(c == vk_data.head)
- {
- vk_recv_time = HAL_GetTick();
- recv_step = RX_PAYLOAD_LEN;
- }
- break;
- case RX_PAYLOAD_LEN:
- vk_data.len = c;
- recv_step = RX_SEQ;
- break;
- case RX_SEQ:
- vk_data.seq = c;
- recv_step = RX_SYSID;
- break;
- case RX_SYSID:
- if(c == vk_data.system_id)
- {
- recv_step = RX_GROUPID;
- }
- else
- {
- recv_step = RX_HEAD;
- }
- break;
- case RX_GROUPID:
- if(c == GROUP_ID_FCU || c == GROUP_ID_PMU_UPDATE || c == GROUP_ID_F_UPDATE ||
- c == GROUP_ID_B_UPDATE || c == GROUP_ID_T_UPDATE|| c == GROUP_ID_WEIGHT_UPDATE)
- {
- vk_data.group_id = c;
- recv_step = RX_MSGID;
- }
- else
- {
- recv_step = RX_HEAD;
- }
- break;
- case RX_MSGID:
- vk_data.msg_id = c;
- recv_step = RX_PAYLOAD;
- i = 0;
- break;
- case RX_PAYLOAD:
- vk_data.payload[vk_data.head_bytes + i] = c;
- i++;
- if(i == vk_data.len)
- {
- recv_step = RX_CHECK_LOW;
- }
- else if(vk_data.len == 0) //没有payload
- {
- recv_step = RX_CHECK_HIGH;
- }
- break;
- case RX_CHECK_LOW:
- vk_data.payload[vk_data.head_bytes + i] = c;
- i++;
- recv_step = RX_CHECK_HIGH;
- break;
- case RX_CHECK_HIGH:
- vk_data.payload[vk_data.head_bytes + i] = c;
- vk_data.payload[0] = vk_data.head;
- vk_data.payload[1] = vk_data.len;
- vk_data.payload[2] = vk_data.seq;
- vk_data.payload[3] = vk_data.system_id;
- vk_data.payload[4] = vk_data.group_id;
- vk_data.payload[5] = vk_data.msg_id;
-
- if(0 == Get_Crc16(&vk_data.payload[0],vk_data.len + vk_data.head_bytes + vk_data.check_bytes))
- {
- if(vk_data.group_id == GROUP_ID_FCU || vk_data.group_id == GROUP_ID_PMU_UPDATE)
- {
- if(uart_info.fcu_buf_flag == false)
- {
- fcu_protocol.msg_id = vk_data.msg_id;
- memcpy(&fcu_protocol.payload[0],&vk_data.payload[0],vk_data.len + vk_data.head_bytes + vk_data.check_bytes);
- uart_info.fcu_buf_flag = true;
- }
- }
- //莫之比雷达升级
- else if((vk_data.group_id == GROUP_ID_F_UPDATE && uavr11_info.Link.connect_status != COMP_NOEXIST) ||
- (vk_data.group_id == GROUP_ID_B_UPDATE && uavr12_info.Link.connect_status != COMP_NOEXIST) ||
- (vk_data.group_id == GROUP_ID_T_UPDATE && uavr56_info.Link.connect_status != COMP_NOEXIST))
- {
- if(uart_info.use_update_buf_flag == false)
- {
- uart_info.update_time = HAL_GetTick();
- memcpy(&Update_buf[0],&vk_data.payload[0],vk_data.len + vk_data.head_bytes + vk_data.check_bytes);
- uart_info.use_update_buf_flag = true;
- if (vk_data.msg_id == 200)
- {
- {
- radar_update_flag = true;
- update_count = 0;
- }
- }
- }
- else
- {
- if(HAL_GetTick() - uart_info.update_time > 3000)
- {
- uart_info.use_update_buf_flag = false;
- }
- }
- }
- //VK协议设备升级
- else if (vk_data.group_id == GROUP_ID_WEIGHT_UPDATE ||
- (vk_data.group_id == GROUP_ID_F_UPDATE /*&& mimo_f_info.Link.connect_status != COMP_NOEXIST*/) || //mimo
- (vk_data.group_id == GROUP_ID_B_UPDATE /*&& mimo_b_info.Link.connect_status != COMP_NOEXIST*/) || //mimo
- (vk_data.group_id == GROUP_ID_T_UPDATE /*&& mimo_ter_info.Link.connect_status != COMP_NOEXIST*/)) //mimo
- {
- #ifdef mimo_update
- if(vk_data.msg_id == 200)
- {
- if(EZup_par.step == STEP_DEFAULT)//mimo
- {//mimo
- memset(&EZup_par,0,sizeof(ez_update));//mimo
- memset(&uart_info.fcu_buf_flag,0,sizeof(Uart));
- memcpy(&uart_info.bin_size,&vk_data.payload[6],4);
- uart_info.vk_dev_pack_num = 1;
- uart_info.vk_dev_update_flag = true;
- EZup_par.update_flag = true;//mimo
- EZup_par.step = STEP_FIND_NODE;//mimo
- }
- }
- #else
- if(vk_data.msg_id == 200)
- {
- memset(&uart_info.fcu_buf_flag,0,sizeof(Uart));
- memcpy(&uart_info.bin_size,&vk_data.payload[6],4);
- uart_info.vk_dev_pack_num = 1;
- uart_info.vk_dev_update_flag = true;
- }
- #endif
- //if(uart_info.use_update_buf_flag == false)
- //{
- memcpy(&Update_buf[0],&vk_data.payload[0],vk_data.len + vk_data.head_bytes + vk_data.check_bytes);
- //判断是否是需要的包序号
- if(uart_info.vk_dev_pack_num > (Update_buf[PACK_NUM] + Update_buf[PACK_NUM + 1] * 256) &&
- vk_data.msg_id == 201)
- {
- Update_ack_func(Update_buf[DEVICE],201,&Update_buf[PACK_NUM]);
- }
- uart_info.use_update_buf_flag = true;
-
- //}
- }
- }
- else
- {
- //vk_protocol_test[4]++;
- }
- recv_step = RX_HEAD;
- break;
- default:
- recv_step = RX_HEAD;
- //vk_protocol_test[5]++;
- break;
- }
- }
- }
|