van_bsp_debug_uart.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. /******************************************************************
  2. * Copyright (C) 2023 - 2023 OneChip, Inc. All rights reserved.
  3. * File name: van_bsp_debug_uart.c
  4. * Author: fanyidong Date:2020.11.21
  5. * Description: STM32调试串口接口函数
  6. * Others:
  7. * History:
  8. 1. Date:
  9. Author:
  10. Modification:
  11. *****************************************************************/
  12. #include <string.h>
  13. #include "van_bsp_debug_uart.h"
  14. /* USER CODE BEGIN Private defines */
  15. #define RECEIVELEN 1024
  16. #define USART_DMA_SENDING 1 //发送未完成
  17. #define USART_DMA_SENDOVER 0 //发送完成
  18. typedef struct
  19. {
  20. unsigned int receive_flag; //空闲接收标记
  21. unsigned int dmaSend_flag; //发送完成标记
  22. unsigned short rx_len; //接收长度
  23. unsigned short tx_len; //接收长度
  24. unsigned char usartDMA_rxBuf[RECEIVELEN]; // DMA接收缓存
  25. unsigned char usartDMA_TXBuf[RECEIVELEN]; // DMA接收缓存
  26. unsigned char usartDMA_TXtempBuf[RECEIVELEN]; // DMA接收缓存
  27. } USART_RECEIVETYPE;
  28. USART_RECEIVETYPE debug_rec_type1;
  29. UART_HandleTypeDef *debugUart;
  30. // DMA发送完成中断回调函数
  31. void Van_Debug_UART_TxCpltCallback(UART_HandleTypeDef *huart)
  32. {
  33. __HAL_DMA_DISABLE(huart->hdmatx);
  34. if (debug_rec_type1.tx_len)
  35. {
  36. memcpy(debug_rec_type1.usartDMA_TXBuf, debug_rec_type1.usartDMA_TXtempBuf,
  37. debug_rec_type1.tx_len);
  38. debug_rec_type1.dmaSend_flag = USART_DMA_SENDING;
  39. HAL_UART_Transmit_DMA((UART_HandleTypeDef *)debugUart,
  40. debug_rec_type1.usartDMA_TXBuf, debug_rec_type1.tx_len);
  41. debug_rec_type1.tx_len = 0;
  42. }
  43. else
  44. {
  45. debug_rec_type1.dmaSend_flag = USART_DMA_SENDOVER;
  46. }
  47. }
  48. void Van_Debug_UART_Send_DMA(unsigned char *pdata, unsigned int Length)
  49. {
  50. /*超长不拷贝*/
  51. if (debug_rec_type1.tx_len + Length < RECEIVELEN)
  52. {
  53. memcpy(debug_rec_type1.usartDMA_TXtempBuf + debug_rec_type1.tx_len, pdata,
  54. Length);
  55. debug_rec_type1.tx_len += Length;
  56. }
  57. if (debug_rec_type1.dmaSend_flag == USART_DMA_SENDOVER)
  58. {
  59. memcpy(debug_rec_type1.usartDMA_TXBuf, debug_rec_type1.usartDMA_TXtempBuf,
  60. debug_rec_type1.tx_len);
  61. debug_rec_type1.dmaSend_flag = USART_DMA_SENDING;
  62. // HAL_UART_Transmit_DMA(&huart1, debug_rec_type1.usartDMA_TXBuf,
  63. // debug_rec_type1.tx_len);
  64. HAL_UART_Transmit_DMA((UART_HandleTypeDef *)debugUart,
  65. debug_rec_type1.usartDMA_TXBuf, debug_rec_type1.tx_len);
  66. debug_rec_type1.tx_len = 0;
  67. }
  68. }
  69. //串口接收空闲中断
  70. void Van_Debug_UART_Rec_IDLE(UART_HandleTypeDef *huart)
  71. {
  72. uint32_t temp;
  73. if ((__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE) != RESET))
  74. {
  75. __HAL_UART_CLEAR_IDLEFLAG(huart);
  76. // UART_EndRxTransfer(huart);
  77. // HAL_UART_DMA_Stop(huart);
  78. // DMA_HandleTypeDef *dma = ;
  79. temp = __HAL_DMA_GET_COUNTER(huart->hdmarx);
  80. debug_rec_type1.rx_len = RECEIVELEN - temp;
  81. debug_rec_type1.receive_flag = 1;
  82. addinputtocmdbuf(debug_rec_type1.usartDMA_rxBuf, debug_rec_type1.rx_len);
  83. for(unsigned int i=0;i<debug_rec_type1.rx_len;i++){
  84. if (cmd_rx_last == CMD_BUF_SIZE)cmd_rx_last = 0;
  85. g_cmd_rx_buf[cmd_rx_last] = debug_rec_type1.usartDMA_rxBuf[i];
  86. cmd_rx_last++;
  87. }
  88. HAL_UART_DMAStop(huart);
  89. HAL_UART_Receive_DMA(huart, debug_rec_type1.usartDMA_rxBuf, RECEIVELEN);
  90. // if (debug_rec_type1.dmaSend_flag == USART_DMA_SENDING)
  91. // {
  92. // debug_rec_type1.dmaSend_flag = USART_DMA_SENDOVER;
  93. // }
  94. }
  95. }
  96. /*串口终端后处理*/
  97. void Van_Debug_UART_ErrorCallback(UART_HandleTypeDef *huart)
  98. {
  99. DMA_HandleTypeDef *pdma;
  100. pdma = huart->hdmatx;
  101. __HAL_UART_CLEAR_FLAG(huart,UART_FLAG_RXNE);
  102. if (pdma->ErrorCode)
  103. {
  104. __HAL_DMA_DISABLE(huart->hdmatx);
  105. if (debug_rec_type1.tx_len)
  106. {
  107. memcpy(debug_rec_type1.usartDMA_TXBuf, debug_rec_type1.usartDMA_TXtempBuf,
  108. debug_rec_type1.tx_len);
  109. debug_rec_type1.dmaSend_flag = USART_DMA_SENDING;
  110. // HAL_UART_Transmit_DMA(&huart1, debug_rec_type1.usartDMA_TXBuf,
  111. //debug_rec_type1.tx_len);
  112. HAL_UART_Transmit_DMA(
  113. (UART_HandleTypeDef *)debugUart,
  114. (unsigned char *)"Van_Debug_UART_ErrorCallback hdmaTx\n\r",
  115. sizeof("Van_Debug_UART_ErrorCallback\n\r"));
  116. // debug_rec_type1.tx_len = 0;
  117. }
  118. else
  119. {
  120. debug_rec_type1.dmaSend_flag = USART_DMA_SENDOVER;
  121. }
  122. }
  123. pdma = huart->hdmarx;
  124. if (pdma->ErrorCode)
  125. {
  126. __HAL_DMA_DISABLE(huart->hdmarx);
  127. HAL_UART_Receive_DMA((UART_HandleTypeDef *)debugUart,
  128. debug_rec_type1.usartDMA_rxBuf, RECEIVELEN);
  129. __HAL_UART_ENABLE_IT((UART_HandleTypeDef *)debugUart,
  130. UART_IT_IDLE);
  131. HAL_UART_Transmit_DMA(
  132. (UART_HandleTypeDef *)debugUart,
  133. (unsigned char *)"Van_Debug_UART_ErrorCallback hdmaRx\n\r",
  134. sizeof("Van_Debug_UART_ErrorCallback\n\r"));
  135. }
  136. }
  137. /****************************************************************
  138. * 函数名: Van_Debug_UART_Init
  139. * 创建时间: 2022/02/18
  140. * 创建人: 范义东
  141. * 函数说明:配置串口,初始化,开中断,在系统初始化里面进行
  142. * 输入参数: 无
  143. * 输出参数:
  144. * 返回值 : void
  145. ****************************************************************/
  146. void Van_Debug_UART_Init(UART_HandleTypeDef * puart)
  147. {
  148. debugUart = puart;
  149. HAL_UART_Receive_DMA(debugUart, debug_rec_type1.usartDMA_rxBuf,
  150. RECEIVELEN);
  151. __HAL_UART_ENABLE_IT(debugUart, UART_IT_IDLE);
  152. }
  153. void Van_Debug_UART1_test(void)
  154. {
  155. if (debug_rec_type1.receive_flag) //如果产生了空闲中断
  156. {
  157. debug_rec_type1.receive_flag = 0; //清零标记
  158. decodedebugfunction();
  159. decodedebugvariable();
  160. }
  161. }
  162. /* USER CODE END Private defines */