van_bsp_uart_fun.c 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000
  1. /******************************************************************
  2. * Copyright (C) 2023 - 2023 OneChip, Inc. All rights reserved.
  3. * File name: van_bsp_uart_fun.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 "van_bsp_debug_uart.h"
  13. #include <string.h>
  14. /* USER CODE BEGIN Private defines */
  15. #define RECEIVELEN 1024
  16. #define USART_DMA_SENDING 1 //发送未完成
  17. #define USART_DMA_SENDOVER 0 //发送完成
  18. #define USART_DMA_COPY 1 //拷贝中
  19. #define USART_DMA_COPYOVER 0 //拷贝完成
  20. typedef struct {
  21. unsigned int receive_flag; //空闲接收标记
  22. unsigned int dmaSend_flag; //发送完成标记
  23. unsigned int dmaCopy_flag; //发送拷贝标记
  24. osMutexId_t mutex_dmaCopy;
  25. unsigned int rx_head; //接收头
  26. unsigned int tx_head; //发送头
  27. unsigned int rx_last; //接收尾
  28. unsigned int tx_last; //发送尾
  29. unsigned int rx_max_len; //接收缓冲区长度
  30. unsigned int tx_max_len; //发送缓冲区长度
  31. unsigned int rx_DMA_len; //接收长度
  32. unsigned int tx_DMA_len; //接收长度
  33. unsigned char *usartDMA_RxBuf; // DMA接收缓存
  34. unsigned char *usart_RxBuf; // 接收缓冲区
  35. unsigned char *usartDMA_TxBuf; // DMA发送缓存
  36. unsigned char *usart_TxBuf; // 发送缓冲区
  37. UART_HandleTypeDef *huart;
  38. unsigned int uartError; //串口错误
  39. } USART_COM_RECEIVETYPE, *pUSART_COM_RECEIVETYPE;
  40. #define SYS_CTR_DMA_LEN 256
  41. #define SYS_CTR_BUF_LEN 1024
  42. USART_COM_RECEIVETYPE sys_ctr_uart;
  43. unsigned char sys_ctr_tDMA_RxBuf[SYS_CTR_DMA_LEN + 4] = {0};
  44. unsigned char sys_ctr_tDMA_TxBuf[SYS_CTR_DMA_LEN + 4] = {0};
  45. unsigned char sys_ctr_RxBuf[SYS_CTR_BUF_LEN];
  46. unsigned char sys_ctr_TxBuf[SYS_CTR_BUF_LEN];
  47. CmdMessage sys_ctr_Message;
  48. unsigned char sys_ctr_data[SYS_CTR_BUF_LEN];
  49. #define THD_NTCSAMP_DMA_LEN 32
  50. #define THD_NTCSAMP_BUF_LEN 64
  51. USART_COM_RECEIVETYPE THD_NTCSAMP_uart;
  52. unsigned char THD_NTCSAMP_tDMA_RxBuf[THD_NTCSAMP_DMA_LEN + 4] = {0};
  53. unsigned char THD_NTCSAMP_tDMA_TxBuf[THD_NTCSAMP_DMA_LEN + 4] = {0};
  54. unsigned char THD_NTCSAMP_RxBuf[THD_NTCSAMP_BUF_LEN];
  55. unsigned char THD_NTCSAMP_TxBuf[THD_NTCSAMP_BUF_LEN];
  56. unsigned char THD_NTCSAMP_Message[32];
  57. unsigned char THD_NTCSAMP_data[SYS_CTR_BUF_LEN];
  58. unsigned int p_rec_flag = 0;
  59. unsigned int p_rec_data_flag = 0;
  60. unsigned int p_DecodeNew = 0;
  61. unsigned int p_Rep_flag = 0;
  62. unsigned int p_Rep_data_flag = 0;
  63. unsigned int p_Ans_flag = 0;
  64. unsigned int p_Ans_data_flag = 0;
  65. unsigned int p_Ans_flag_1 = 0;
  66. unsigned int p_Ans_data_flag_1 = 0;
  67. unsigned char sedbuf[SYS_CTR_BUF_LEN];
  68. unsigned int sedbuf_len;
  69. extern DMA_HandleTypeDef hdma_uart7_rx;
  70. extern UART_HandleTypeDef huart7;
  71. unsigned int resetSysUart ;
  72. typedef struct
  73. {
  74. __IO uint32_t ISR; /*!< DMA interrupt status register */
  75. __IO uint32_t Reserved0;
  76. __IO uint32_t IFCR; /*!< DMA interrupt flag clear register */
  77. } DMA_Base_Registers;
  78. #define osMutexPrioInherit 0x00000002U // 继承锁 继承等待线程中更高的优先级
  79. const osMutexAttr_t Mutex_attr1 = {
  80. "myThreadMutex", // human readable mutex name
  81. osMutexPrioInherit, // attr_bits
  82. NULL, // memory for control block
  83. 0U // size for control block
  84. };
  85. /****************************************************************
  86. * 函数名: Van_UART_Fun_TxCpltCallback
  87. * 创建时间: 2022/02/18
  88. * 创建人: 范义东
  89. * 函数说明: DMA 发送中断
  90. * 输入参数: 无
  91. * 输出参数:
  92. * 返回值 : void
  93. ****************************************************************/
  94. void Van_UART_Fun_TxCpltCallback_Base(pUSART_COM_RECEIVETYPE uartinf) {
  95. UART_HandleTypeDef *huart = uartinf->huart;
  96. __HAL_DMA_DISABLE(huart->hdmatx);
  97. unsigned int dataleninTxbuf = (uartinf->tx_last + uartinf->tx_max_len - uartinf->tx_head) % uartinf->tx_max_len;
  98. if (dataleninTxbuf) {
  99. memset((void *)uartinf->usartDMA_TxBuf, 0, uartinf->tx_DMA_len);
  100. if (dataleninTxbuf >= uartinf->tx_DMA_len) {
  101. if (uartinf->tx_max_len >= (uartinf->tx_head + uartinf->tx_DMA_len)) {
  102. memcpy((void *)uartinf->usartDMA_TxBuf, (const void *)(uartinf->usart_TxBuf + uartinf->tx_head), uartinf->tx_DMA_len);
  103. uartinf->tx_head += uartinf->tx_DMA_len;
  104. Van_Device_Printf(VAN_LOG_DEBUG, "line:%d head:%d last:%d \n\r", __LINE__, uartinf->tx_head, uartinf->tx_last);
  105. } else {
  106. memcpy((void *)uartinf->usartDMA_TxBuf, (const void *)(uartinf->usart_TxBuf + uartinf->tx_head), (uartinf->tx_max_len - uartinf->tx_head));
  107. unsigned int secondcopelen = uartinf->tx_DMA_len - (uartinf->tx_max_len - uartinf->tx_head);
  108. memcpy((void *)(uartinf->usartDMA_TxBuf + uartinf->tx_max_len - uartinf->tx_head), (const void *)uartinf->usart_TxBuf, secondcopelen);
  109. uartinf->tx_head = secondcopelen;
  110. Van_Device_Printf(VAN_LOG_DEBUG, "line:%d head:%d last:%d \n\r", __LINE__, uartinf->tx_head, uartinf->tx_last);
  111. }
  112. Van_Device_Printf(VAN_LOG_DEBUG, "len:%d %s\n\r***", uartinf->tx_DMA_len, uartinf->usartDMA_TxBuf);
  113. HAL_UART_Transmit_DMA(huart, uartinf->usartDMA_TxBuf, uartinf->tx_DMA_len);
  114. } else {
  115. if (uartinf->tx_max_len >= (uartinf->tx_head + dataleninTxbuf)) {
  116. memcpy((void *)uartinf->usartDMA_TxBuf, (const void *)(uartinf->usart_TxBuf + uartinf->tx_head), dataleninTxbuf);
  117. uartinf->tx_head += dataleninTxbuf;
  118. Van_Device_Printf(VAN_LOG_DEBUG, "line:%d head:%d last:%d \n\r", __LINE__, uartinf->tx_head, uartinf->tx_last);
  119. } else {
  120. memcpy((void *)uartinf->usartDMA_TxBuf, (const void *)(uartinf->usart_TxBuf + uartinf->tx_head), (uartinf->tx_max_len - uartinf->tx_head));
  121. unsigned int secondcopelen = dataleninTxbuf - (uartinf->tx_max_len - uartinf->tx_head);
  122. memcpy((void *)(uartinf->usartDMA_TxBuf + uartinf->tx_max_len - uartinf->tx_head), (const void *)uartinf->usart_TxBuf, secondcopelen);
  123. uartinf->tx_head = secondcopelen;
  124. Van_Device_Printf(VAN_LOG_DEBUG, "line:%d head:%d last:%d \n\r", __LINE__, uartinf->tx_head, uartinf->tx_last);
  125. }
  126. Van_Device_Printf(VAN_LOG_DEBUG, "len:%d %s\n\r***", dataleninTxbuf, uartinf->usartDMA_TxBuf);
  127. HAL_UART_Transmit_DMA(huart, uartinf->usartDMA_TxBuf, dataleninTxbuf);
  128. }
  129. uartinf->dmaSend_flag = USART_DMA_SENDING;
  130. } else {
  131. uartinf->dmaSend_flag = USART_DMA_SENDOVER;
  132. }
  133. }
  134. /****************************************************************
  135. * 函数名: Van_UART_Fun_Send_DMA
  136. * 创建时间: 2022/02/18
  137. * 创建人: 范义东
  138. * 函数说明: DMA 发送
  139. * 输入参数: 无
  140. * 输出参数:
  141. * 返回值 : void
  142. ****************************************************************/
  143. void Van_UART_Fun_Send_DMA_Base(unsigned char *pdata, unsigned int Length, pUSART_COM_RECEIVETYPE uartinf) {
  144. UART_HandleTypeDef *huart = uartinf->huart;
  145. /*超长不拷贝*/
  146. // Van_Device_Printf(VAN_LOG_NOTICE, "head:%d last:%d Length:%d %s\n\r", uartinf->tx_head, uartinf->tx_last, Length, pdata);
  147. if (Length > uartinf->tx_max_len) {
  148. Length = uartinf->tx_max_len;
  149. }
  150. // while (uartinf->dmaCopy_flag == USART_DMA_COPY);
  151. // uartinf->dmaCopy_flag = USART_DMA_COPY;
  152. __disable_irq();
  153. osMutexAcquire(uartinf->mutex_dmaCopy,0xffffffff);
  154. if ((Length + uartinf->tx_last) < uartinf->tx_max_len) {
  155. memcpy((void *)(uartinf->usart_TxBuf + uartinf->tx_last), (const void *)pdata, Length);
  156. uartinf->tx_last += Length;
  157. // Van_Device_Printf(VAN_LOG_NOTICE, "head:%d last:%d \n\r", uartinf->tx_head, uartinf->tx_last);
  158. } else {
  159. memcpy((void *)(uartinf->usart_TxBuf + uartinf->tx_last), (const void *)pdata, (uartinf->tx_max_len - uartinf->tx_last));
  160. unsigned int secondcopelen = Length - (uartinf->tx_max_len - uartinf->tx_last);
  161. memcpy((void *)uartinf->usart_TxBuf, (const void *)(pdata + (uartinf->tx_max_len - uartinf->tx_last)), secondcopelen);
  162. uartinf->tx_last = secondcopelen;
  163. // Van_Device_Printf(VAN_LOG_NOTICE, "head:%d last:%d \n\r", uartinf->tx_head, uartinf->tx_last);
  164. }
  165. // osMutexRelease(uartinf->mutex_dmaCopy);
  166. // uartinf->dmaCopy_flag = USART_DMA_COPYOVER;
  167. if (uartinf->dmaSend_flag == USART_DMA_SENDOVER) {
  168. unsigned int dataleninTxbuf = (uartinf->tx_last + uartinf->tx_max_len - uartinf->tx_head) % uartinf->tx_max_len;
  169. if (dataleninTxbuf)
  170. {
  171. memset((void *)uartinf->usartDMA_TxBuf, 0, uartinf->tx_DMA_len);
  172. if (dataleninTxbuf >= uartinf->tx_DMA_len)
  173. {
  174. if (uartinf->tx_max_len >= (uartinf->tx_head + uartinf->tx_DMA_len))
  175. {
  176. memcpy((void *)uartinf->usartDMA_TxBuf, (const void *)(uartinf->usart_TxBuf + uartinf->tx_head), uartinf->tx_DMA_len);
  177. uartinf->tx_head += uartinf->tx_DMA_len;
  178. // Van_Device_Printf(VAN_LOG_NOTICE, "line:%d head:%d last:%d \n\r", __LINE__, uartinf->tx_head, uartinf->tx_last);
  179. }
  180. else
  181. {
  182. memcpy((void *)uartinf->usartDMA_TxBuf, (const void *)(uartinf->usart_TxBuf + uartinf->tx_head), (uartinf->tx_max_len - uartinf->tx_head));
  183. unsigned int secondcopelen = uartinf->tx_DMA_len - (uartinf->tx_max_len - uartinf->tx_head);
  184. memcpy((void *)(uartinf->usartDMA_TxBuf + uartinf->tx_max_len - uartinf->tx_head), (const void *)uartinf->usart_TxBuf, secondcopelen);
  185. uartinf->tx_head = secondcopelen;
  186. // Van_Device_Printf(VAN_LOG_NOTICE, "line:%d head:%d last:%d \n\r", __LINE__, uartinf->tx_head, uartinf->tx_last);
  187. }
  188. // Van_Device_Printf(VAN_LOG_NOTICE, "len:%d %s\n\r***", uartinf->tx_DMA_len, uartinf->usartDMA_TxBuf);
  189. HAL_UART_Transmit_DMA(huart, uartinf->usartDMA_TxBuf, uartinf->tx_DMA_len);
  190. }
  191. else
  192. {
  193. if (uartinf->tx_max_len >= (uartinf->tx_head + dataleninTxbuf))
  194. {
  195. memcpy((void *)uartinf->usartDMA_TxBuf, (const void *)(uartinf->usart_TxBuf + uartinf->tx_head), dataleninTxbuf);
  196. uartinf->tx_head += dataleninTxbuf;
  197. // Van_Device_Printf(VAN_LOG_NOTICE, "line:%d head:%d last:%d \n\r", __LINE__, uartinf->tx_head, uartinf->tx_last);
  198. }
  199. else
  200. {
  201. memcpy((void *)uartinf->usartDMA_TxBuf, (const void *)(uartinf->usart_TxBuf + uartinf->tx_head), (uartinf->tx_max_len - uartinf->tx_head));
  202. unsigned int secondcopelen = dataleninTxbuf - (uartinf->tx_max_len - uartinf->tx_head);
  203. memcpy((void *)(uartinf->usartDMA_TxBuf + uartinf->tx_max_len - uartinf->tx_head), (const void *)uartinf->usart_TxBuf, secondcopelen);
  204. uartinf->tx_head = secondcopelen;
  205. // Van_Device_Printf(VAN_LOG_NOTICE, "line:%d head:%d last:%d \n\r", __LINE__, uartinf->tx_head, uartinf->tx_last);
  206. }
  207. // Van_Device_Printf(VAN_LOG_NOTICE, "len:%d %s\n\r***", dataleninTxbuf, uartinf->usartDMA_TxBuf);
  208. HAL_UART_Transmit_DMA(huart, uartinf->usartDMA_TxBuf, dataleninTxbuf);
  209. }
  210. uartinf->dmaSend_flag = USART_DMA_SENDING;
  211. }
  212. // else
  213. // Van_Device_Printf(VAN_LOG_INFO, "HAL_UART_Transmit_DMA dataleninTxbuf == 0\n");
  214. }
  215. osMutexRelease(uartinf->mutex_dmaCopy);
  216. __enable_irq();
  217. }
  218. /****************************************************************
  219. * 函数名: Van_UART_Fun_RxCpltCallback
  220. * 创建时间: 2022/02/18
  221. * 创建人: 范义东
  222. * 函数说明: DMA接收处理
  223. * 输入参数: 无
  224. * 输出参数:
  225. * 返回值 : void
  226. ****************************************************************/
  227. void Van_UART_Fun_RxCplt_Base(pUSART_COM_RECEIVETYPE uartinf) {
  228. UART_HandleTypeDef *huart = uartinf->huart;
  229. uint32_t temp;
  230. HAL_UART_DMA_RX_Stop(huart);
  231. // 停止DMA接收
  232. DMA_Stream_TypeDef *dma = huart->hdmarx->Instance;
  233. temp = dma->NDTR;
  234. unsigned int dataleninRxDMAbuf = uartinf->rx_DMA_len - temp;
  235. uint32_t isrst = huart->Instance->ISR;
  236. uint32_t dmacr = dma->CR;
  237. // Van_Device_Printf(VAN_LOG_NOTICE, "%s %d addr:%x %d-%d=%d\n\r", __func__, __LINE__, (unsigned int)uartinf->usartDMA_RxBuf, uartinf->rx_DMA_len, temp,
  238. // dataleninRxDMAbuf);
  239. // Van_Device_Printf(VAN_LOG_NOTICE, "%x %x\n\r", isrst, dmacr);
  240. if (dataleninRxDMAbuf) {
  241. if(dataleninRxDMAbuf > uartinf->rx_max_len){
  242. Van_Device_Printf(VAN_LOG_NOTICE, "*******************rec %d clean*******************\n\r", dataleninRxDMAbuf);
  243. }else{
  244. // Van_Device_Printf(VAN_LOG_NOTICE, "Cplt len:%d %s\n\r***",dataleninRxDMAbuf,uartinf->usartDMA_RxBuf);
  245. if ((dataleninRxDMAbuf + uartinf->rx_last) <= uartinf->rx_max_len) {
  246. memcpy((void *)(uartinf->usart_RxBuf + uartinf->rx_last), (const void *)uartinf->usartDMA_RxBuf, dataleninRxDMAbuf);
  247. uartinf->rx_last += dataleninRxDMAbuf;
  248. //Van_Device_Printf(VAN_LOG_NOTICE, "rx_last 1:%d %d \n\r", uartinf->rx_last, uartinf->rx_head);
  249. } else {
  250. memcpy((void *)(uartinf->usart_RxBuf + uartinf->rx_last), (const void *)uartinf->usartDMA_RxBuf, (uartinf->rx_max_len - uartinf->rx_last));
  251. unsigned int secondcopelen = dataleninRxDMAbuf - (uartinf->rx_max_len - uartinf->rx_last);
  252. memcpy((void *)uartinf->usart_RxBuf, (const void *)(uartinf->usartDMA_RxBuf + (uartinf->rx_max_len - uartinf->rx_last)), secondcopelen);
  253. uartinf->rx_last = secondcopelen;
  254. // Van_Device_Printf(VAN_LOG_NOTICE, "rx_last 2 :%d %d \n\r", uartinf->rx_last, uartinf->rx_head,dataleninRxDMAbuf,uartinf->rx_max_len );
  255. }
  256. uartinf->receive_flag = 1;
  257. sysinf.reccmd_conter = sysinf.ms_conter;
  258. }
  259. memset((void *)uartinf->usartDMA_RxBuf, 0, uartinf->rx_DMA_len);
  260. // 重启DMA接收
  261. HAL_UART_Receive_DMA((UART_HandleTypeDef *)huart, uartinf->usartDMA_RxBuf, uartinf->rx_DMA_len);
  262. dmacr = dma->CR;
  263. // Van_Device_Printf(VAN_LOG_NOTICE, "rx len %d\n\r", uartinf->rx_DMA_len);
  264. }
  265. }
  266. /****************************************************************
  267. * 函数名: Van_UART_Fun_Rec_IDLE
  268. * 创建时间: 2022/02/18
  269. * 创建人: 范义东
  270. * 函数说明: 接收处理
  271. * 输入参数: 无
  272. * 输出参数:
  273. * 返回值 : void
  274. ****************************************************************/
  275. void Van_UART_Fun_Rec_IDLE_Base(pUSART_COM_RECEIVETYPE uartinf) {
  276. UART_HandleTypeDef *huart = uartinf->huart;
  277. if ((__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE) != RESET)) {
  278. __HAL_UART_CLEAR_IDLEFLAG(huart);
  279. Van_UART_Fun_RxCplt_Base(uartinf);
  280. // Van_Device_Printf(VAN_LOG_NOTICE, "%s %d\n\r", __func__, __LINE__);
  281. }
  282. }
  283. /****************************************************************
  284. * 函数名: Van_UART_Fun_ErrorCallback
  285. * 创建时间: 2022/02/18
  286. * 创建人: 范义东
  287. * 函数说明:异常后处理
  288. * 输入参数: 无
  289. * 输出参数:
  290. * 返回值 : void
  291. ****************************************************************/
  292. void Van_UART_Fun_ErrorCallback_Base(pUSART_COM_RECEIVETYPE uartinf) {
  293. UART_HandleTypeDef *huart = uartinf->huart;
  294. DMA_HandleTypeDef *pdma;
  295. Van_Device_Printf(VAN_LOG_ERROR, "Van_UART_Fun_ErrorCallback_Base %8x dmaTX%8x dmaRX%8x\n\r",huart->ErrorCode, huart->hdmatx->ErrorCode, huart->hdmarx->ErrorCode);
  296. //if (huart->ErrorCode == (HAL_UART_ERROR_NE | HAL_UART_ERROR_ORE))
  297. //{
  298. uartinf->uartError = True;
  299. __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF);
  300. // }
  301. pdma = huart->hdmatx;
  302. if (pdma->ErrorCode) {
  303. __HAL_DMA_DISABLE(huart->hdmatx);
  304. uartinf->dmaSend_flag = USART_DMA_SENDOVER;
  305. }
  306. pdma = huart->hdmarx;
  307. if ( pdma->ErrorCode) {
  308. __HAL_DMA_DISABLE(huart->hdmarx);
  309. HAL_UART_Receive_DMA((UART_HandleTypeDef *)huart, uartinf->usartDMA_RxBuf, RECEIVELEN);
  310. __HAL_UART_ENABLE_IT((UART_HandleTypeDef *)huart, UART_IT_IDLE);
  311. // Van_Device_Printf(VAN_LOG_ERROR, "huart rx dma reset\n\r");
  312. }
  313. }
  314. /****************************************************************
  315. * 函数名: Van_UART_Fun_Rec_IDLE
  316. * 创建时间: 2022/02/18
  317. * 创建人: 范义东
  318. * 函数说明:空闲中断回调处理
  319. * 输入参数: 无
  320. * 输出参数:
  321. * 返回值 : void
  322. ****************************************************************/
  323. void Van_UART_Fun_TxCpltCallback(UART_HandleTypeDef *huart) {
  324. UART_HandleTypeDef *pUart = sys_ctr_uart.huart;
  325. UART_HandleTypeDef *pTHD_NTCSAMPUart = THD_NTCSAMP_uart.huart;
  326. if (huart->Instance == pUart->Instance) {
  327. Van_UART_Fun_TxCpltCallback_Base(&sys_ctr_uart);
  328. }else if (huart->Instance == pTHD_NTCSAMPUart->Instance) {
  329. Van_UART_Fun_TxCpltCallback_Base(&THD_NTCSAMP_uart);
  330. }
  331. return;
  332. }
  333. /****************************************************************
  334. * 函数名: Van_UART_Fun_Rec_IDLE
  335. * 创建时间: 2022/02/18
  336. * 创建人: 范义东
  337. * 函数说明:空闲中断回调处理
  338. * 输入参数: 无
  339. * 输出参数:
  340. * 返回值 : void
  341. ****************************************************************/
  342. void Van_UART_Fun_RxCpltCallback(UART_HandleTypeDef *huart) {
  343. UART_HandleTypeDef *pUart = sys_ctr_uart.huart;
  344. UART_HandleTypeDef *pTHD_NTCSAMPUart = THD_NTCSAMP_uart.huart;
  345. if (huart->Instance == pUart->Instance) {
  346. Van_UART_Fun_RxCplt_Base(&sys_ctr_uart);
  347. // Van_Device_Printf(VAN_LOG_NOTICE, "%s %d\n\r", __func__, __LINE__);
  348. }else if (huart->Instance == pTHD_NTCSAMPUart->Instance) {
  349. Van_UART_Fun_RxCplt_Base(&THD_NTCSAMP_uart);
  350. }
  351. return;
  352. }
  353. /****************************************************************
  354. * 函数名: Van_UART_Fun_Rec_IDLE
  355. * 创建时间: 2022/02/18
  356. * 创建人: 范义东
  357. * 函数说明:空闲中断回调处理
  358. * 输入参数: 无
  359. * 输出参数:
  360. * 返回值 : void
  361. ****************************************************************/
  362. void Van_UART_Fun_ErrorCallback(UART_HandleTypeDef *huart) {
  363. UART_HandleTypeDef *pUart = sys_ctr_uart.huart;
  364. UART_HandleTypeDef *pTHD_NTCSAMPUart = THD_NTCSAMP_uart.huart;
  365. if (huart->Instance == pUart->Instance) {
  366. Van_UART_Fun_ErrorCallback_Base(&sys_ctr_uart);
  367. }else if (huart->Instance == pTHD_NTCSAMPUart->Instance) {
  368. Van_UART_Fun_ErrorCallback_Base(&THD_NTCSAMP_uart);
  369. }
  370. return;
  371. }
  372. /****************************************************************
  373. * 函数名: Van_UART_Fun_Rec_IDLE
  374. * 创建时间: 2022/02/18
  375. * 创建人: 范义东
  376. * 函数说明:空闲中断回调处理
  377. * 输入参数: 无
  378. * 输出参数:
  379. * 返回值 : void
  380. ****************************************************************/
  381. void Van_UART_Fun_Rec_IDLE(UART_HandleTypeDef *huart) {
  382. UART_HandleTypeDef *pUart = sys_ctr_uart.huart;
  383. UART_HandleTypeDef *pTHD_NTCSAMPUart = THD_NTCSAMP_uart.huart;
  384. if (huart->Instance == pUart->Instance) {
  385. Van_UART_Fun_Rec_IDLE_Base(&sys_ctr_uart);
  386. // Van_Device_Printf(VAN_LOG_NOTICE, "%s %d\n\r", __func__, __LINE__);
  387. }else if (huart->Instance == pTHD_NTCSAMPUart->Instance) {
  388. Van_UART_Fun_Rec_IDLE_Base(&THD_NTCSAMP_uart);
  389. // Van_Device_Printf(VAN_LOG_NOTICE, "%s %d\n\r", __func__, __LINE__);
  390. }else{
  391. if ((__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE) != RESET)) {
  392. char Name[16] = {0};
  393. __HAL_UART_CLEAR_IDLEFLAG(huart);
  394. find_stm32_Peripherals(huart,Name);
  395. Van_Device_Printf(VAN_LOG_NOTICE, "%s %s %d\n\r", Name,__func__);
  396. }
  397. }
  398. return;
  399. }
  400. /****************************************************************
  401. * 函数名: Van_UART_Fun_Send_DMA
  402. * 创建时间: 2022/02/18
  403. * 创建人: 范义东
  404. * 函数说明: DMA 发送
  405. * 输入参数: 无
  406. * 输出参数:
  407. * 返回值 : void
  408. ****************************************************************/
  409. void Van_UART_Fun_Send_DMA(unsigned char *pdata, unsigned int Length, UART_HandleTypeDef *huart) {
  410. UART_HandleTypeDef *pUart = sys_ctr_uart.huart;
  411. UART_HandleTypeDef *pTHD_NTCSAMPUart = THD_NTCSAMP_uart.huart;
  412. if (huart->Instance == pUart->Instance) {
  413. Van_UART_Fun_Send_DMA_Base(pdata, Length, &sys_ctr_uart);
  414. }else if (huart->Instance == pTHD_NTCSAMPUart->Instance) {
  415. Van_UART_Fun_Send_DMA_Base(pdata, Length, &THD_NTCSAMP_uart);
  416. }
  417. return;
  418. }
  419. /****************************************************************
  420. * 函数名: Van_UART_Sys_Ctr_Send_type
  421. * 创建时间: 2022/02/18
  422. * 创建人: 范义东
  423. * 函数说明:系统命令发送
  424. * 输入参数: 无
  425. * 输出参数:
  426. * 返回值 : void
  427. ****************************************************************/
  428. void Van_UART_Sys_Ctr_Send_type(unsigned char type, unsigned char *pdata, unsigned int Length) {
  429. struct CmdMessage msg = {0};
  430. unsigned char sedbuf[SYS_CTR_BUF_LEN];
  431. unsigned int checksum = 0;
  432. combine_cmdMessage(msg, VAN_COM_HEADER_FALG, type, VAN_CFG_NONE, VAN_COM_TAIL_FALG);
  433. msg.len = Length;
  434. *(unsigned short *)sedbuf = msg.head;
  435. sedbuf[2] = msg.type;
  436. sedbuf[3] = msg.cmd;
  437. *(unsigned short *)(sedbuf + 4) = msg.len;
  438. for (unsigned int i = 0; i < msg.len; i++) {
  439. sedbuf[6 + i] = pdata[i];
  440. }
  441. checksum = checkSum(&sedbuf[2], msg.len + 4);
  442. sedbuf[6 + msg.len] = checksum & 0xff; /*结尾标记高位*/
  443. sedbuf[7 + msg.len] = checksum >> 8; /*结尾标记低位*/
  444. if(p_Rep_flag){
  445. unsigned int alllen = msg.len + 8;
  446. Van_Device_Printf(VAN_LOG_NOTICE, "ans: len%:d \n\r",alllen);
  447. if(p_Rep_data_flag){
  448. for(int i=0; i <alllen; i++){
  449. Van_Device_Printf(VAN_LOG_NOTICE, "%2x ", sedbuf[i]);
  450. if(i%32==31){
  451. Van_Device_Printf(VAN_LOG_NOTICE, "\n\r");
  452. }
  453. }
  454. Van_Device_Printf(VAN_LOG_NOTICE, "\n\r");
  455. }
  456. }
  457. Van_UART_Fun_Send_DMA(sedbuf, Length + 8, sys_ctr_uart.huart);
  458. }
  459. /****************************************************************
  460. * 函数名: Van_UART_Sys_Ctr_Send
  461. * 创建时间: 2022/02/18
  462. * 创建人: 范义东
  463. * 函数说明:系统命令发送
  464. * 输入参数: 无
  465. * 输出参数:
  466. * 返回值 : void
  467. ****************************************************************/
  468. void Van_UART_Sys_Ctr_Send(unsigned char *pdata, unsigned int Length) {
  469. struct CmdMessage msg = {0};
  470. unsigned int checksum = 0;
  471. combine_cmdMessage(msg, VAN_COM_HEADER_FALG, MSG_SYS_CTR, VAN_CFG_NONE, VAN_COM_TAIL_FALG);
  472. sedbuf_len = Length + 8;
  473. msg.len = Length;
  474. *(unsigned short *)sedbuf = msg.head;
  475. sedbuf[2] = msg.type;
  476. sedbuf[3] = msg.cmd;
  477. *(unsigned short *)(sedbuf + 4) = msg.len;
  478. for (unsigned int i = 0; i < msg.len; i++) {
  479. sedbuf[6 + i] = pdata[i];
  480. }
  481. checksum = checkSum(&sedbuf[2], msg.len + 4);
  482. sedbuf[6 + msg.len] = checksum & 0xff; /*结尾标记高位*/
  483. sedbuf[7 + msg.len] = checksum >> 8; /*结尾标记低位*/
  484. if(p_Ans_flag){
  485. unsigned int alllen = msg.len + 8;
  486. Van_Device_Printf(VAN_LOG_NOTICE, "ans len: %d \n\r",alllen);
  487. if(p_Ans_data_flag){
  488. for(int i=0; i <alllen; i++){
  489. Van_Device_Printf(VAN_LOG_NOTICE, "%2x ", sedbuf[i]);
  490. if(i%32==31){
  491. Van_Device_Printf(VAN_LOG_NOTICE, "\n\r");
  492. }
  493. }
  494. Van_Device_Printf(VAN_LOG_NOTICE, "\n\r");
  495. }
  496. }
  497. Van_UART_Fun_Send_DMA(sedbuf, sedbuf_len, sys_ctr_uart.huart);
  498. }
  499. /****************************************************************
  500. * 函数名: Van_UART_Sys_Ctr_SendNoBuf
  501. * 创建时间: 2022/02/18
  502. * 创建人: 范义东
  503. * 函数说明:主动上报,不缓存
  504. * 输入参数: 无
  505. * 输出参数:
  506. * 返回值 : void
  507. ****************************************************************/
  508. void Van_UART_Sys_Ctr_SendNoBuf(unsigned char *pdata, unsigned int Length) {
  509. struct CmdMessage msg = {0};
  510. unsigned int checksum = 0;
  511. combine_cmdMessage(msg, VAN_COM_HEADER_FALG, MSG_SYS_CTR, VAN_CFG_NONE, VAN_COM_TAIL_FALG);
  512. unsigned char sedbuf[SYS_CTR_BUF_LEN];
  513. unsigned int sedbuf_len;
  514. sedbuf_len = Length + 8;
  515. msg.len = Length;
  516. *(unsigned short *)sedbuf = msg.head;
  517. sedbuf[2] = msg.type;
  518. sedbuf[3] = msg.cmd;
  519. *(unsigned short *)(sedbuf + 4) = msg.len;
  520. for (unsigned int i = 0; i < msg.len; i++) {
  521. sedbuf[6 + i] = pdata[i];
  522. }
  523. checksum = checkSum(&sedbuf[2], msg.len + 4);
  524. sedbuf[6 + msg.len] = checksum & 0xff; /*结尾标记高位*/
  525. sedbuf[7 + msg.len] = checksum >> 8; /*结尾标记低位*/
  526. if(p_Ans_flag_1){
  527. unsigned int alllen = msg.len + 8;
  528. Van_Device_Printf(VAN_LOG_NOTICE, "ans len: %d \n\r",alllen);
  529. if(p_Ans_data_flag_1){
  530. for(int i=0; i <alllen; i++){
  531. Van_Device_Printf(VAN_LOG_NOTICE, "%2x ", sedbuf[i]);
  532. if(i%32==31){
  533. Van_Device_Printf(VAN_LOG_NOTICE, "\n\r");
  534. }
  535. }
  536. Van_Device_Printf(VAN_LOG_NOTICE, "\n\r");
  537. }
  538. }
  539. Van_UART_Fun_Send_DMA(sedbuf, sedbuf_len, sys_ctr_uart.huart);
  540. }
  541. /****************************************************************
  542. * 函数名: Van_UART_Sys_Ctr_Send_Again
  543. * 创建时间: 2022/02/18
  544. * 创建人: 范义东
  545. * 函数说明:应答消息重新发送
  546. * 输入参数: 无
  547. * 输出参数:
  548. * 返回值 : void
  549. ****************************************************************/
  550. void Van_UART_Sys_Ctr_Send_Again(void) {
  551. Van_UART_Fun_Send_DMA(sedbuf, sedbuf_len, sys_ctr_uart.huart);
  552. }
  553. /****************************************************************
  554. * 函数名: Van_UART_Sys_Ttr_Init
  555. * 创建时间: 2022/02/18
  556. * 创建人: 范义东
  557. * 函数说明:系统命令串口挂载
  558. * 输入参数: 无
  559. * 输出参数:
  560. * 返回值 : void
  561. ****************************************************************/
  562. void Van_UART_Sys_Ctr_Init(UART_HandleTypeDef *puart) {
  563. sys_ctr_uart.huart = puart;
  564. sys_ctr_uart.usartDMA_RxBuf = sys_ctr_tDMA_RxBuf;
  565. sys_ctr_uart.usartDMA_TxBuf = sys_ctr_tDMA_TxBuf;
  566. sys_ctr_uart.usart_RxBuf = sys_ctr_RxBuf;
  567. sys_ctr_uart.usart_TxBuf = sys_ctr_TxBuf;
  568. sys_ctr_uart.tx_DMA_len = SYS_CTR_DMA_LEN;
  569. sys_ctr_uart.rx_DMA_len = SYS_CTR_DMA_LEN;
  570. sys_ctr_uart.rx_max_len = SYS_CTR_BUF_LEN;
  571. sys_ctr_uart.tx_max_len = SYS_CTR_BUF_LEN;
  572. sys_ctr_uart.rx_last = 0;
  573. sys_ctr_uart.rx_head = 0;
  574. sys_ctr_uart.tx_last = 0;
  575. sys_ctr_uart.tx_head = 0;
  576. sys_ctr_uart.uartError = False;
  577. memset((void *)sys_ctr_uart.usartDMA_RxBuf, 0, sys_ctr_uart.rx_DMA_len + 4);
  578. HAL_UART_Receive_DMA(puart, sys_ctr_uart.usartDMA_RxBuf, SYS_CTR_DMA_LEN);
  579. __HAL_UART_CLEAR_IDLEFLAG(puart);
  580. __HAL_UART_CLEAR_FLAG(puart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF);
  581. // __HAL_UART_CLEAR_OREFLAG(puart);
  582. __HAL_UART_ENABLE_IT(puart, UART_IT_IDLE);
  583. __HAL_UART_ENABLE_IT(puart, UART_IT_ERR);
  584. sys_ctr_uart.mutex_dmaCopy = osMutexNew(&Mutex_attr1);
  585. }
  586. /****************************************************************
  587. * 函数名: Van_UART_Fun_RawdataDeal
  588. * 创建时间: 2022/02/18
  589. * 创建人: 范义东
  590. * 函数说明:串口接收元数据处理
  591. * 输入参数: 无
  592. * 输出参数:
  593. * 返回值 : void
  594. ****************************************************************/
  595. void Van_RawdataDeal_dispatch(void* pram)
  596. {
  597. unsigned int anslen = 0;
  598. P_RawdataMessage pcmd = (P_RawdataMessage)pram;
  599. RawdataMessage Ans ;
  600. Ans.fuid = pcmd->fuid;
  601. Ans.cmd = 0;
  602. anslen = sizeof(Ans) - sizeof(Ans.data);
  603. switch(pcmd->cmd){
  604. case RAW_V1_SET_PID_SEC_OFFSET:
  605. Ans.cmd = PidSetSectionOffsetDirect((void*)pcmd->data,(void*)Ans.data);
  606. anslen = 8+sizeof(pidSectionOffset_ST_Def);
  607. break;
  608. case RAW_V1_GET_PID_SEC_OFFSET:
  609. Ans.cmd = PidGetSectionOffsetDirect((void*)pcmd->data,(void*)Ans.data);
  610. if(Ans.cmd){
  611. P_pidSectionOffset_ST_Def poffset = (P_pidSectionOffset_ST_Def)Ans.data;
  612. anslen = 8+sizeof(pidSectionOffset_ST_Def);
  613. Van_Device_Printf(VAN_LOG_NOTICE, "mPidNum:%d sectionNum:%d\n\r***", poffset->mPidNum ,poffset->sectionNum );
  614. }
  615. break;
  616. case RAW_V1_SET_PID_SINGEPIDOFFSET:
  617. Ans.cmd = PidSetSinglPIDDirect((void*)pcmd->data,(void*)Ans.data);
  618. break;
  619. case RAW_V1_GET_PID_SINGEPIDOFFSET:
  620. Ans.cmd = PidGetSinglPIDDirect((void*)pcmd->data,(void*)Ans.data);
  621. if(Ans.cmd){
  622. P_pidSectionOffset_ST_Def poffset = (P_pidSectionOffset_ST_Def)Ans.data;
  623. anslen += sizeof(P_pidSignlePidPram_ST_Def);
  624. Van_Device_Printf(VAN_LOG_NOTICE, "mPidNum:%d sectionNum:%d\n\r***", poffset->mPidNum ,poffset->sectionNum );
  625. }
  626. break;
  627. case RAW_V1_SET_QUADRATICFIT:
  628. Ans.cmd = PidSetQuadraticfitDirect((void*)pcmd->data,(void*)Ans.data);
  629. break;
  630. case RAW_V1_GET_QUADRATICFIT:
  631. Ans.cmd = PidGetQuadraticfitDirect((void*)pcmd->data,(void*)Ans.data);
  632. if(Ans.cmd){
  633. P_quadraticfit_ST_Def poffset = (P_quadraticfit_ST_Def)Ans.data;
  634. anslen += sizeof(quadraticfit_ST_Def);
  635. }
  636. break;
  637. case RAW_V1_GET_PID_MULT_PRAM:{
  638. Ans.cmd = PidMultSectionPramGetDirect((void*)pcmd->data,(void*)Ans.data);
  639. if(Ans.cmd){
  640. anslen += 64;
  641. }
  642. }
  643. break;
  644. case RAW_V1_SET_PID_MULT_PRAM:{
  645. Ans.cmd = PidMultSectionPramSetDirect((void*)pcmd->data,(void*)Ans.data);
  646. if(Ans.cmd){
  647. anslen += 64;
  648. }
  649. }
  650. break;
  651. }
  652. Van_UART_Sys_Ctr_Send_type(MSG_RAW_DATA_1,(void *)&Ans,anslen);
  653. }
  654. /****************************************************************
  655. * 函数名: Van_UART_Fun_RawdataDeal
  656. * 创建时间: 2022/02/18
  657. * 创建人: 范义东
  658. * 函数说明:串口接收元数据处理
  659. * 输入参数: 无
  660. * 输出参数:
  661. * 返回值 : void
  662. ****************************************************************/
  663. void Van_UART_Fun_RawdataDeal(void) {
  664. static int conter10ms = 0;
  665. if (sys_ctr_uart.receive_flag) //如果产生了空闲中断
  666. {
  667. sys_ctr_uart.receive_flag = 0; //清零标记
  668. unsigned int dataleninRxbuf = (sys_ctr_uart.rx_last + sys_ctr_uart.rx_max_len - sys_ctr_uart.rx_head) % sys_ctr_uart.rx_max_len;
  669. if(dataleninRxbuf > 64){
  670. Van_Device_Printf(VAN_LOG_NOTICE, "buffer have:%d\n\r***", dataleninRxbuf);
  671. }
  672. if(p_rec_flag){
  673. Van_Device_Printf(VAN_LOG_NOTICE, "last:%d head:%d buflen:%d have:%d\n\r***", sys_ctr_uart.rx_last,sys_ctr_uart.rx_head,sys_ctr_uart.rx_max_len,dataleninRxbuf);
  674. if(p_rec_data_flag){
  675. for(int i=0; i <dataleninRxbuf; i++){
  676. Van_Device_Printf(VAN_LOG_NOTICE, "%2x ", sys_ctr_uart.usart_RxBuf[(i+sys_ctr_uart.rx_head)%sys_ctr_uart.rx_max_len]);
  677. if(i%32==31){
  678. Van_Device_Printf(VAN_LOG_NOTICE, "\n\r");
  679. }
  680. }
  681. Van_Device_Printf(VAN_LOG_NOTICE, "\n\r");
  682. }
  683. }
  684. if (dataleninRxbuf > (sizeof(CmdMessage)-4)) {
  685. pbRawdef raw = {0};
  686. if (DecodeNew(&sys_ctr_Message, raw.data, sys_ctr_uart.usart_RxBuf, &sys_ctr_uart.rx_head, sys_ctr_uart.rx_last, sys_ctr_uart.rx_max_len)) {
  687. raw.datalen = sys_ctr_Message.len;
  688. if(p_DecodeNew){
  689. Van_Device_Printf(VAN_LOG_NOTICE, "DecodeNew is ok\n\r");
  690. }
  691. if(sys_ctr_Message.type == MSG_RAW_DATA_1){
  692. Van_RawdataDeal_dispatch(raw.data);
  693. }else{
  694. pb_CtrlProto_v1_decode(raw.data, raw.datalen);
  695. }
  696. }
  697. }
  698. dataleninRxbuf = (sys_ctr_uart.rx_last + sys_ctr_uart.rx_max_len - sys_ctr_uart.rx_head) % sys_ctr_uart.rx_max_len;
  699. if(dataleninRxbuf > (sizeof(CmdMessage)-4)) {
  700. sys_ctr_uart.receive_flag = 1; //缓冲区存在数据,接续解析
  701. }
  702. }
  703. if(resetSysUart){
  704. resetSysUart = 0;
  705. sys_ctr_uart.uartError = True;
  706. }
  707. if( sys_ctr_uart.uartError){
  708. Van_Device_Printf(VAN_LOG_NOTICE, "reinit sysUart\n\r");
  709. HAL_UART_DMAStop(sys_ctr_uart.huart);
  710. sys_ctr_uart.uartError = False;
  711. osDelay(100U);
  712. if(sysinf.devdesc.deveice_type == deviceType_deviceETA_004){
  713. MX_UART4_Init();
  714. }else{
  715. MX_UART7_Init();
  716. }
  717. memset((void *)sys_ctr_uart.usartDMA_RxBuf, 0, sys_ctr_uart.rx_DMA_len + 4);
  718. HAL_UART_Receive_DMA(sys_ctr_uart.huart, sys_ctr_uart.usartDMA_RxBuf, SYS_CTR_DMA_LEN);
  719. __HAL_UART_CLEAR_IDLEFLAG(sys_ctr_uart.huart);
  720. __HAL_UART_ENABLE_IT(sys_ctr_uart.huart, UART_IT_IDLE);
  721. __HAL_UART_ENABLE_IT(sys_ctr_uart.huart, UART_IT_ERR);
  722. }
  723. conter10ms++;
  724. if(conter10ms==200){
  725. if ((__HAL_UART_GET_FLAG(sys_ctr_uart.huart, UART_FLAG_ORE) != RESET)||
  726. (__HAL_UART_GET_FLAG(sys_ctr_uart.huart, UART_FLAG_NE) != RESET)||
  727. (__HAL_UART_GET_FLAG(sys_ctr_uart.huart, UART_FLAG_FE) != RESET)||
  728. (__HAL_UART_GET_FLAG(sys_ctr_uart.huart, UART_FLAG_PE) != RESET)){
  729. Van_Device_Printf(VAN_LOG_NOTICE, "sysUart error\n\r");
  730. Van_Device_Printf(VAN_LOG_NOTICE, "ISR:%8x \n\r",sys_ctr_uart.huart->Instance->ISR);
  731. if(sysinf.devdesc.deveice_type == deviceType_deviceETA_004){
  732. MX_UART4_Init();
  733. }else{
  734. MX_UART7_Init();
  735. }
  736. HAL_UART_DMAStop(sys_ctr_uart.huart);
  737. memset((void *)sys_ctr_uart.usartDMA_RxBuf, 0, sys_ctr_uart.rx_DMA_len + 4);
  738. HAL_UART_Receive_DMA(sys_ctr_uart.huart, sys_ctr_uart.usartDMA_RxBuf, SYS_CTR_DMA_LEN);
  739. __HAL_UART_CLEAR_IDLEFLAG(sys_ctr_uart.huart);
  740. __HAL_UART_ENABLE_IT(sys_ctr_uart.huart, UART_IT_IDLE);
  741. __HAL_UART_ENABLE_IT(sys_ctr_uart.huart, UART_IT_ERR);
  742. }
  743. }
  744. }
  745. /****************************************************************
  746. * 函数名: Van_UART_Fun_RawdataDeal
  747. * 创建时间: 2022/02/18
  748. * 创建人: 范义东
  749. * 函数说明:串口接收元数据处理
  750. * 输入参数: 无
  751. * 输出参数:
  752. * 返回值 : void
  753. ****************************************************************/
  754. void Van_UART_Sys_Ctr_SendTest(void) {
  755. unsigned char sendtestbuf[128] = {0};
  756. for (int i = 0; i < 100; i++) {
  757. sendtestbuf[i] = '0' + i % 10;
  758. }
  759. Van_UART_Sys_Ctr_Send(sendtestbuf, 100);
  760. Van_UART_Sys_Ctr_Send((unsigned char*)"\n\r", 2);
  761. }
  762. /****************************************************************
  763. * 函数名: Van_UART_Sys_Get_Debuging
  764. * 创建时间: 2022/02/18
  765. * 创建人: 范义东
  766. * 函数说明:获取调试信息
  767. * 输入参数: 无
  768. * 输出参数:
  769. * 返回值 : void
  770. ****************************************************************/
  771. void Van_UART_Sys_Get_Debuging(void) {
  772. DMA_Base_Registers *regs_dma = (DMA_Base_Registers *)hdma_uart7_rx.StreamBaseAddress;
  773. BDMA_Channel_TypeDef *dma_instance = (BDMA_Channel_TypeDef *)hdma_uart7_rx.Instance;
  774. Van_Device_Printf(VAN_LOG_NOTICE, "ISR:%8x IFCR:%8x \n\r",regs_dma->ISR,regs_dma->IFCR);
  775. Van_Device_Printf(VAN_LOG_NOTICE, "CCR:%8x CNDTR:%8x CPAR:%8x CM0AR:%8x CM1AR:%8x \n\r",
  776. dma_instance->CCR,dma_instance->CNDTR,dma_instance->CPAR,dma_instance->CM0AR,dma_instance->CM1AR);
  777. Van_Device_Printf(VAN_LOG_NOTICE, "huart7 ISR:%8x \n\r",huart7.Instance->ISR);
  778. }
  779. #if defined(DEVICETYPE_IS_ATCG)
  780. /****************************************************************
  781. * 函数名: Van_THD_NTCSAMP_Fun_RawdataDeal
  782. * 创建时间: 2022/02/18
  783. * 创建人: 范义东
  784. * 函数说明:串口接收元数据处理
  785. * 输入参数: 无
  786. * 输出参数:
  787. * 返回值 : void
  788. ****************************************************************/
  789. void Van_THD_NTCSAMP_Fun_RawdataDeal(void) {
  790. if (THD_NTCSAMP_uart.receive_flag) //如果产生了空闲中断
  791. {
  792. THD_NTCSAMP_uart.receive_flag = 0; //清零标记
  793. unsigned int dataleninRxbuf = (THD_NTCSAMP_uart.rx_last + THD_NTCSAMP_uart.rx_max_len - THD_NTCSAMP_uart.rx_head) % THD_NTCSAMP_uart.rx_max_len;
  794. if(p_rec_flag){
  795. Van_Device_Printf(VAN_LOG_NOTICE, "last:%d head:%d buflen:%d have:%d\n\r***", THD_NTCSAMP_uart.rx_last,THD_NTCSAMP_uart.rx_head,THD_NTCSAMP_uart.rx_max_len,dataleninRxbuf);
  796. if(p_rec_data_flag){
  797. for(int i=0; i <dataleninRxbuf; i++){
  798. Van_Device_Printf(VAN_LOG_NOTICE, "%2x ", THD_NTCSAMP_uart.usart_RxBuf[(i+THD_NTCSAMP_uart.rx_head)%THD_NTCSAMP_uart.rx_max_len]);
  799. if(i%32==31){
  800. Van_Device_Printf(VAN_LOG_NOTICE, "\n\r");
  801. }
  802. }
  803. Van_Device_Printf(VAN_LOG_NOTICE, "\n\r");
  804. }
  805. }
  806. if (dataleninRxbuf >= (sizeof(RTUMessage))) {
  807. unsigned int msgLen = DecodeModbud_RTU(THD_NTCSAMP_Message, THD_NTCSAMP_uart.usart_RxBuf, &THD_NTCSAMP_uart.rx_head, THD_NTCSAMP_uart.rx_last, THD_NTCSAMP_uart.rx_max_len);
  808. if (msgLen) {
  809. // for(int i=0;i<msgLen;i++){
  810. // Van_Device_Printf(VAN_LOG_NOTICE, "%2x ",THD_NTCSAMP_Message[i]);
  811. // if( i%32 == 31){
  812. // Van_Device_Printf(VAN_LOG_NOTICE, "\n\r");
  813. // }
  814. // }
  815. // Van_Device_Printf(VAN_LOG_NOTICE, "\n\r");
  816. }
  817. }
  818. dataleninRxbuf = (THD_NTCSAMP_uart.rx_last + THD_NTCSAMP_uart.rx_max_len - THD_NTCSAMP_uart.rx_head) % THD_NTCSAMP_uart.rx_max_len;
  819. if(dataleninRxbuf >= (sizeof(RTUMessage))) {
  820. THD_NTCSAMP_uart.receive_flag = 1; //缓冲区存在数据,接续解析
  821. }
  822. }
  823. if( THD_NTCSAMP_uart.uartError){
  824. THD_NTCSAMP_uart.uartError = False;
  825. osDelay(100U);
  826. MX_UART5_Init();
  827. Van_THD_NTCSAMP_Init(THD_NTCSAMP_uart.huart);
  828. Van_Device_Printf(VAN_LOG_ERROR, "sys_ctr_uart reset\n\r");
  829. __HAL_DMA_DISABLE(THD_NTCSAMP_uart.huart->hdmarx);
  830. HAL_UART_Receive_DMA((UART_HandleTypeDef *)&huart5, THD_NTCSAMP_uart.usartDMA_RxBuf, RECEIVELEN);
  831. __HAL_UART_CLEAR_IDLEFLAG((UART_HandleTypeDef *)&huart5);
  832. __HAL_UART_CLEAR_OREFLAG((UART_HandleTypeDef *)&huart5);
  833. __HAL_UART_ENABLE_IT((UART_HandleTypeDef *)&huart5, UART_IT_IDLE);
  834. __HAL_UART_ENABLE_IT((UART_HandleTypeDef *)&huart5, UART_IT_ERR);
  835. }
  836. }
  837. /****************************************************************
  838. * 函数名: Van_THD_NTCSAMP_Ctr_Init
  839. * 创建时间: 2022/02/18
  840. * 创建人: 范义东
  841. * 函数说明:系统命令串口挂载
  842. * 输入参数: 无
  843. * 输出参数:
  844. * 返回值 : void
  845. ****************************************************************/
  846. void Van_THD_NTCSAMP_Init(UART_HandleTypeDef *puart) {
  847. THD_NTCSAMP_uart.huart = puart;
  848. THD_NTCSAMP_uart.usartDMA_RxBuf = THD_NTCSAMP_tDMA_RxBuf;
  849. THD_NTCSAMP_uart.usartDMA_TxBuf = THD_NTCSAMP_tDMA_TxBuf;
  850. THD_NTCSAMP_uart.usart_RxBuf = THD_NTCSAMP_RxBuf;
  851. THD_NTCSAMP_uart.usart_TxBuf = THD_NTCSAMP_TxBuf;
  852. THD_NTCSAMP_uart.tx_DMA_len = THD_NTCSAMP_DMA_LEN;
  853. THD_NTCSAMP_uart.rx_DMA_len = THD_NTCSAMP_DMA_LEN;
  854. THD_NTCSAMP_uart.rx_max_len = THD_NTCSAMP_BUF_LEN;
  855. THD_NTCSAMP_uart.tx_max_len = THD_NTCSAMP_BUF_LEN;
  856. THD_NTCSAMP_uart.rx_last = 0;
  857. THD_NTCSAMP_uart.rx_head = 0;
  858. THD_NTCSAMP_uart.tx_last = 0;
  859. THD_NTCSAMP_uart.tx_head = 0;
  860. THD_NTCSAMP_uart.uartError = False;
  861. memset((void *)THD_NTCSAMP_uart.usartDMA_RxBuf, 0, THD_NTCSAMP_uart.rx_DMA_len + 4);
  862. HAL_UART_Receive_DMA(puart, THD_NTCSAMP_uart.usartDMA_RxBuf, THD_NTCSAMP_DMA_LEN);
  863. __HAL_UART_CLEAR_IDLEFLAG(puart);
  864. // __HAL_UART_CLEAR_OREFLAG(puart);
  865. __HAL_UART_ENABLE_IT(puart, UART_IT_IDLE);
  866. __HAL_UART_ENABLE_IT(puart, UART_IT_ERR);
  867. THD_NTCSAMP_uart.mutex_dmaCopy = osMutexNew(&Mutex_attr1);
  868. }
  869. /****************************************************************
  870. * 函数名: Van_UART_Sys_Ctr_Send
  871. * 创建时间: 2022/02/18
  872. * 创建人: 范义东
  873. * 函数说明:系统命令发送
  874. * 输入参数: 无
  875. * 输出参数:
  876. * 返回值 : void
  877. ****************************************************************/
  878. void Van_THD_NTCSAMP_Send(const unsigned char *pdata, unsigned int Length) {
  879. unsigned char sedbuf[SYS_CTR_BUF_LEN];
  880. unsigned int i = 0;
  881. for (; i < Length; i++) {
  882. sedbuf[i] = pdata[i];
  883. }
  884. if( THD_NTCSAMP_uart.uartError) return;
  885. // sedbuf[i++] = checksum & 0xff; /*结尾标记高位*/
  886. // sedbuf[i++] = checksum >> 8; /*结尾标记低位*/
  887. // if(1){
  888. // unsigned int alllen = msg.len + 8;
  889. // Van_Device_Printf(VAN_LOG_NOTICE, "NTC: len%:d \n\r",alllen);
  890. // if(1){
  891. // for(int i=0; i <alllen; i++){
  892. // Van_Device_Printf(VAN_LOG_NOTICE, "%2x ", sedbuf[i]);
  893. // if(i%32==31){
  894. // Van_Device_Printf(VAN_LOG_NOTICE, "\n\r");
  895. // }
  896. // }
  897. // Van_Device_Printf(VAN_LOG_NOTICE, "\n\r");
  898. // }
  899. // }
  900. Van_UART_Fun_Send_DMA(sedbuf, Length, THD_NTCSAMP_uart.huart);
  901. }
  902. #endif
  903. /* USER CODE END Private defines */