soft_usart.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #include "soft_usart.h"
  2. #include "common.h"
  3. #include "main.h"
  4. #include "system_init.h"
  5. #include "usart_data_handle.h"
  6. #include "string.h"
  7. #include "main_task.h"
  8. extern UART_HandleTypeDef huart1;
  9. uint8_t FMU_uart_buf[MAX_UART_BUF] = {0};
  10. /**
  11. * @file USER_UART_IRQHandler
  12. * @brief 串口中断处理
  13. * @param
  14. * @details
  15. * @author Zhang Sir
  16. **/
  17. void USER_UART_IRQHandler(UART_HandleTypeDef *huart)
  18. {
  19. uint32_t recv_count = 0;
  20. if (huart == &huart1)
  21. {
  22. if (RESET != __HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE))
  23. {
  24. __HAL_UART_CLEAR_IDLEFLAG(huart);
  25. HAL_UART_AbortReceive(huart);
  26. recv_count = MAX_UART_BUF - __HAL_DMA_GET_COUNTER(huart->hdmarx);
  27. rkfifo_in(&uart_rkfifo,FMU_uart_buf,recv_count);
  28. memset(FMU_uart_buf,0,MAX_UART_BUF);
  29. HAL_UART_Receive_DMA(huart, FMU_uart_buf, MAX_UART_BUF);
  30. rt_sem_release(&uart1_sem);
  31. }
  32. }
  33. }
  34. /**
  35. * @file HAL_UART_ErrorCallback
  36. * @brief uart错误中断回调函数
  37. * @param
  38. * @details
  39. * @author Zhang Sir
  40. **/
  41. void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
  42. {
  43. if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) //接收溢出检测
  44. {
  45. __HAL_UART_CLEAR_OREFLAG(huart);
  46. }
  47. if (__HAL_UART_GET_FLAG (huart, UART_FLAG_RXNE) != RESET)//接收数据
  48. {
  49. __HAL_UART_CLEAR_FLAG (huart, UART_FLAG_RXNE);
  50. }
  51. __HAL_UART_CLEAR_PEFLAG (huart);
  52. if (huart == &huart1)
  53. {
  54. HAL_UART_Receive_DMA(huart, FMU_uart_buf, MAX_UART_BUF);
  55. }
  56. }
  57. /**
  58. * @file usart1_send_msg
  59. * @brief 串口发送数据
  60. * @param
  61. * @details
  62. * @author Zhang Sir
  63. **/
  64. uint32_t uart2_send_delay_time = 0;
  65. void usart1_send_msg(uint8_t *data, uint8_t size)
  66. {
  67. // HAL_UART_Transmit_DMA(&huart1, data, size);
  68. // uart2_send_delay_time = HAL_GetTick();
  69. rkfifo_in(&send_uart_rkfifo,data,size);
  70. }
  71. uint8_t send_uart_buf[512] = {0};
  72. void send_uartfifo_msg(void)
  73. {
  74. uint16_t len = 0;
  75. if(uart_send_is_ok(USART_1) == true)
  76. {
  77. len = rkfifo_out(&send_uart_rkfifo, &send_uart_buf, 512);
  78. if(len > 0)
  79. {
  80. HAL_UART_Transmit_DMA(&huart1, send_uart_buf, len);
  81. uart2_send_delay_time = HAL_GetTick();
  82. }
  83. }
  84. }
  85. /**
  86. * @file uart_send_is_ok
  87. * @brief 检测串口是否可用
  88. * @param uart_num 串口号
  89. * @details
  90. * @author Zhang Sir
  91. **/
  92. bool uart_send_is_ok(uint8_t uart_num)
  93. {
  94. //设备升级不发送
  95. // if(radar_update_flag == true)
  96. // return false;
  97. if (uart_num == USART_1)
  98. {
  99. if (huart1.gState == HAL_UART_STATE_READY && (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_TC) != RESET && __HAL_UART_GET_FLAG(&huart1, UART_FLAG_TXE) != RESET))
  100. {
  101. }
  102. else
  103. {
  104. return false;
  105. }
  106. //延迟1ms发送,防止如果是空闲中断接收,连续发送变成一包
  107. if(HAL_GetTick() - uart2_send_delay_time <= 1)
  108. {
  109. return false;
  110. }
  111. }
  112. return true;
  113. }