usart.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726
  1. /* USER CODE BEGIN Header */
  2. /**
  3. ******************************************************************************
  4. * @file usart.c
  5. * @brief This file provides code for the configuration
  6. * of the USART instances.
  7. ******************************************************************************
  8. * @attention
  9. *
  10. * Copyright (c) 2024 STMicroelectronics.
  11. * All rights reserved.
  12. *
  13. * This software is licensed under terms that can be found in the LICENSE file
  14. * in the root directory of this software component.
  15. * If no LICENSE file comes with this software, it is provided AS-IS.
  16. *
  17. ******************************************************************************
  18. */
  19. /* USER CODE END Header */
  20. /* Includes ------------------------------------------------------------------*/
  21. #include "usart.h"
  22. /* USER CODE BEGIN 0 */
  23. volatile uint8_t recvLength = 0; //接收一帧数据的长度
  24. uint8_t recvBuff[2048];
  25. /* USER CODE END 0 */
  26. UART_HandleTypeDef huart4;
  27. UART_HandleTypeDef huart5;
  28. UART_HandleTypeDef huart1;
  29. UART_HandleTypeDef huart2;
  30. UART_HandleTypeDef huart3;
  31. DMA_HandleTypeDef hdma_uart4_rx;
  32. DMA_HandleTypeDef hdma_uart4_tx;
  33. DMA_HandleTypeDef hdma_usart1_rx;
  34. DMA_HandleTypeDef hdma_usart1_tx;
  35. DMA_HandleTypeDef hdma_usart2_rx;
  36. DMA_HandleTypeDef hdma_usart2_tx;
  37. DMA_HandleTypeDef hdma_usart3_rx;
  38. DMA_HandleTypeDef hdma_usart3_tx;
  39. /* UART4 init function */
  40. void MX_UART4_Init(void)
  41. {
  42. /* USER CODE BEGIN UART4_Init 0 */
  43. /* USER CODE END UART4_Init 0 */
  44. /* USER CODE BEGIN UART4_Init 1 */
  45. /* USER CODE END UART4_Init 1 */
  46. huart4.Instance = UART4;
  47. huart4.Init.BaudRate = 115200;
  48. huart4.Init.WordLength = UART_WORDLENGTH_8B;
  49. huart4.Init.StopBits = UART_STOPBITS_1;
  50. huart4.Init.Parity = UART_PARITY_NONE;
  51. huart4.Init.Mode = UART_MODE_TX_RX;
  52. huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  53. huart4.Init.OverSampling = UART_OVERSAMPLING_16;
  54. if (HAL_UART_Init(&huart4) != HAL_OK)
  55. {
  56. Error_Handler();
  57. }
  58. /* USER CODE BEGIN UART4_Init 2 */
  59. /* USER CODE END UART4_Init 2 */
  60. }
  61. /* UART5 init function */
  62. void MX_UART5_Init(void)
  63. {
  64. /* USER CODE BEGIN UART5_Init 0 */
  65. /* USER CODE END UART5_Init 0 */
  66. /* USER CODE BEGIN UART5_Init 1 */
  67. /* USER CODE END UART5_Init 1 */
  68. huart5.Instance = UART5;
  69. huart5.Init.BaudRate = 115200;
  70. huart5.Init.WordLength = UART_WORDLENGTH_8B;
  71. huart5.Init.StopBits = UART_STOPBITS_1;
  72. huart5.Init.Parity = UART_PARITY_NONE;
  73. huart5.Init.Mode = UART_MODE_TX_RX;
  74. huart5.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  75. huart5.Init.OverSampling = UART_OVERSAMPLING_16;
  76. if (HAL_UART_Init(&huart5) != HAL_OK)
  77. {
  78. Error_Handler();
  79. }
  80. /* USER CODE BEGIN UART5_Init 2 */
  81. /* USER CODE END UART5_Init 2 */
  82. }
  83. /* USART1 init function */
  84. void MX_USART1_UART_Init(void)
  85. {
  86. /* USER CODE BEGIN USART1_Init 0 */
  87. /* USER CODE END USART1_Init 0 */
  88. /* USER CODE BEGIN USART1_Init 1 */
  89. /* USER CODE END USART1_Init 1 */
  90. huart1.Instance = USART1;
  91. huart1.Init.BaudRate = 115200;
  92. huart1.Init.WordLength = UART_WORDLENGTH_8B;
  93. huart1.Init.StopBits = UART_STOPBITS_1;
  94. huart1.Init.Parity = UART_PARITY_NONE;
  95. huart1.Init.Mode = UART_MODE_TX_RX;
  96. huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  97. huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  98. if (HAL_UART_Init(&huart1) != HAL_OK)
  99. {
  100. Error_Handler();
  101. }
  102. /* USER CODE BEGIN USART1_Init 2 */
  103. /* USER CODE END USART1_Init 2 */
  104. }
  105. /* USART2 init function */
  106. void MX_USART2_UART_Init(void)
  107. {
  108. /* USER CODE BEGIN USART2_Init 0 */
  109. /* USER CODE END USART2_Init 0 */
  110. /* USER CODE BEGIN USART2_Init 1 */
  111. /* USER CODE END USART2_Init 1 */
  112. huart2.Instance = USART2;
  113. huart2.Init.BaudRate = 115200;
  114. huart2.Init.WordLength = UART_WORDLENGTH_8B;
  115. huart2.Init.StopBits = UART_STOPBITS_1;
  116. huart2.Init.Parity = UART_PARITY_NONE;
  117. huart2.Init.Mode = UART_MODE_TX_RX;
  118. huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  119. huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  120. if (HAL_UART_Init(&huart2) != HAL_OK)
  121. {
  122. Error_Handler();
  123. }
  124. /* USER CODE BEGIN USART2_Init 2 */
  125. /* USER CODE END USART2_Init 2 */
  126. }
  127. /* USART3 init function */
  128. void MX_USART3_UART_Init(void)
  129. {
  130. /* USER CODE BEGIN USART3_Init 0 */
  131. /* USER CODE END USART3_Init 0 */
  132. /* USER CODE BEGIN USART3_Init 1 */
  133. /* USER CODE END USART3_Init 1 */
  134. huart3.Instance = USART3;
  135. huart3.Init.BaudRate = 115200;
  136. huart3.Init.WordLength = UART_WORDLENGTH_8B;
  137. huart3.Init.StopBits = UART_STOPBITS_1;
  138. huart3.Init.Parity = UART_PARITY_NONE;
  139. huart3.Init.Mode = UART_MODE_TX_RX;
  140. huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  141. huart3.Init.OverSampling = UART_OVERSAMPLING_16;
  142. if (HAL_UART_Init(&huart3) != HAL_OK)
  143. {
  144. Error_Handler();
  145. }
  146. /* USER CODE BEGIN USART3_Init 2 */
  147. /* USER CODE END USART3_Init 2 */
  148. }
  149. void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
  150. {
  151. GPIO_InitTypeDef GPIO_InitStruct = {0};
  152. if(uartHandle->Instance==UART4)
  153. {
  154. /* USER CODE BEGIN UART4_MspInit 0 */
  155. /* USER CODE END UART4_MspInit 0 */
  156. /* UART4 clock enable */
  157. __HAL_RCC_UART4_CLK_ENABLE();
  158. __HAL_RCC_GPIOC_CLK_ENABLE();
  159. /**UART4 GPIO Configuration
  160. PC10 ------> UART4_TX
  161. PC11 ------> UART4_RX
  162. */
  163. GPIO_InitStruct.Pin = GPIO_PIN_10;
  164. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  165. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  166. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  167. GPIO_InitStruct.Pin = GPIO_PIN_11;
  168. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  169. GPIO_InitStruct.Pull = GPIO_NOPULL;
  170. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  171. /* UART4 DMA Init */
  172. /* UART4_RX Init */
  173. hdma_uart4_rx.Instance = DMA2_Channel3;
  174. hdma_uart4_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
  175. hdma_uart4_rx.Init.PeriphInc = DMA_PINC_DISABLE;
  176. hdma_uart4_rx.Init.MemInc = DMA_MINC_ENABLE;
  177. hdma_uart4_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  178. hdma_uart4_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  179. hdma_uart4_rx.Init.Mode = DMA_NORMAL;
  180. hdma_uart4_rx.Init.Priority = DMA_PRIORITY_LOW;
  181. if (HAL_DMA_Init(&hdma_uart4_rx) != HAL_OK)
  182. {
  183. Error_Handler();
  184. }
  185. __HAL_LINKDMA(uartHandle,hdmarx,hdma_uart4_rx);
  186. /* UART4_TX Init */
  187. hdma_uart4_tx.Instance = DMA2_Channel5;
  188. hdma_uart4_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
  189. hdma_uart4_tx.Init.PeriphInc = DMA_PINC_DISABLE;
  190. hdma_uart4_tx.Init.MemInc = DMA_MINC_ENABLE;
  191. hdma_uart4_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  192. hdma_uart4_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  193. hdma_uart4_tx.Init.Mode = DMA_NORMAL;
  194. hdma_uart4_tx.Init.Priority = DMA_PRIORITY_LOW;
  195. if (HAL_DMA_Init(&hdma_uart4_tx) != HAL_OK)
  196. {
  197. Error_Handler();
  198. }
  199. __HAL_LINKDMA(uartHandle,hdmatx,hdma_uart4_tx);
  200. /* UART4 interrupt Init */
  201. HAL_NVIC_SetPriority(UART4_IRQn, 5, 0);
  202. HAL_NVIC_EnableIRQ(UART4_IRQn);
  203. /* USER CODE BEGIN UART4_MspInit 1 */
  204. /* USER CODE END UART4_MspInit 1 */
  205. }
  206. else if(uartHandle->Instance==UART5)
  207. {
  208. /* USER CODE BEGIN UART5_MspInit 0 */
  209. /* USER CODE END UART5_MspInit 0 */
  210. /* UART5 clock enable */
  211. __HAL_RCC_UART5_CLK_ENABLE();
  212. __HAL_RCC_GPIOC_CLK_ENABLE();
  213. __HAL_RCC_GPIOD_CLK_ENABLE();
  214. /**UART5 GPIO Configuration
  215. PC12 ------> UART5_TX
  216. PD2 ------> UART5_RX
  217. */
  218. GPIO_InitStruct.Pin = GPIO_PIN_12;
  219. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  220. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  221. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  222. GPIO_InitStruct.Pin = GPIO_PIN_2;
  223. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  224. GPIO_InitStruct.Pull = GPIO_NOPULL;
  225. HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
  226. /* UART5 interrupt Init */
  227. HAL_NVIC_SetPriority(UART5_IRQn, 5, 0);
  228. HAL_NVIC_EnableIRQ(UART5_IRQn);
  229. /* USER CODE BEGIN UART5_MspInit 1 */
  230. /* USER CODE END UART5_MspInit 1 */
  231. }
  232. else if(uartHandle->Instance==USART1)
  233. {
  234. /* USER CODE BEGIN USART1_MspInit 0 */
  235. /* USER CODE END USART1_MspInit 0 */
  236. /* USART1 clock enable */
  237. __HAL_RCC_USART1_CLK_ENABLE();
  238. __HAL_RCC_GPIOA_CLK_ENABLE();
  239. /**USART1 GPIO Configuration
  240. PA9 ------> USART1_TX
  241. PA10 ------> USART1_RX
  242. */
  243. GPIO_InitStruct.Pin = GPIO_PIN_9;
  244. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  245. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  246. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  247. GPIO_InitStruct.Pin = GPIO_PIN_10;
  248. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  249. GPIO_InitStruct.Pull = GPIO_NOPULL;
  250. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  251. /* USART1 DMA Init */
  252. /* USART1_RX Init */
  253. hdma_usart1_rx.Instance = DMA1_Channel5;
  254. hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
  255. hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
  256. hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE;
  257. hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  258. hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  259. hdma_usart1_rx.Init.Mode = DMA_NORMAL;
  260. hdma_usart1_rx.Init.Priority = DMA_PRIORITY_LOW;
  261. if (HAL_DMA_Init(&hdma_usart1_rx) != HAL_OK)
  262. {
  263. Error_Handler();
  264. }
  265. __HAL_LINKDMA(uartHandle,hdmarx,hdma_usart1_rx);
  266. /* USART1_TX Init */
  267. hdma_usart1_tx.Instance = DMA1_Channel4;
  268. hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
  269. hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
  270. hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;
  271. hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  272. hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  273. hdma_usart1_tx.Init.Mode = DMA_NORMAL;
  274. hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW;
  275. if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK)
  276. {
  277. Error_Handler();
  278. }
  279. __HAL_LINKDMA(uartHandle,hdmatx,hdma_usart1_tx);
  280. /* USART1 interrupt Init */
  281. HAL_NVIC_SetPriority(USART1_IRQn, 5, 0);
  282. HAL_NVIC_EnableIRQ(USART1_IRQn);
  283. /* USER CODE BEGIN USART1_MspInit 1 */
  284. /* USER CODE END USART1_MspInit 1 */
  285. }
  286. else if(uartHandle->Instance==USART2)
  287. {
  288. /* USER CODE BEGIN USART2_MspInit 0 */
  289. /* USER CODE END USART2_MspInit 0 */
  290. /* USART2 clock enable */
  291. __HAL_RCC_USART2_CLK_ENABLE();
  292. __HAL_RCC_GPIOA_CLK_ENABLE();
  293. /**USART2 GPIO Configuration
  294. PA2 ------> USART2_TX
  295. PA3 ------> USART2_RX
  296. */
  297. GPIO_InitStruct.Pin = GPIO_PIN_2;
  298. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  299. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  300. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  301. GPIO_InitStruct.Pin = GPIO_PIN_3;
  302. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  303. GPIO_InitStruct.Pull = GPIO_NOPULL;
  304. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  305. /* USART2 DMA Init */
  306. /* USART2_RX Init */
  307. hdma_usart2_rx.Instance = DMA1_Channel6;
  308. hdma_usart2_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
  309. hdma_usart2_rx.Init.PeriphInc = DMA_PINC_DISABLE;
  310. hdma_usart2_rx.Init.MemInc = DMA_MINC_ENABLE;
  311. hdma_usart2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  312. hdma_usart2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  313. hdma_usart2_rx.Init.Mode = DMA_NORMAL;
  314. hdma_usart2_rx.Init.Priority = DMA_PRIORITY_LOW;
  315. if (HAL_DMA_Init(&hdma_usart2_rx) != HAL_OK)
  316. {
  317. Error_Handler();
  318. }
  319. __HAL_LINKDMA(uartHandle,hdmarx,hdma_usart2_rx);
  320. /* USART2_TX Init */
  321. hdma_usart2_tx.Instance = DMA1_Channel7;
  322. hdma_usart2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
  323. hdma_usart2_tx.Init.PeriphInc = DMA_PINC_DISABLE;
  324. hdma_usart2_tx.Init.MemInc = DMA_MINC_ENABLE;
  325. hdma_usart2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  326. hdma_usart2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  327. hdma_usart2_tx.Init.Mode = DMA_NORMAL;
  328. hdma_usart2_tx.Init.Priority = DMA_PRIORITY_LOW;
  329. if (HAL_DMA_Init(&hdma_usart2_tx) != HAL_OK)
  330. {
  331. Error_Handler();
  332. }
  333. __HAL_LINKDMA(uartHandle,hdmatx,hdma_usart2_tx);
  334. /* USART2 interrupt Init */
  335. HAL_NVIC_SetPriority(USART2_IRQn, 5, 0);
  336. HAL_NVIC_EnableIRQ(USART2_IRQn);
  337. /* USER CODE BEGIN USART2_MspInit 1 */
  338. /* USER CODE END USART2_MspInit 1 */
  339. }
  340. else if(uartHandle->Instance==USART3)
  341. {
  342. /* USER CODE BEGIN USART3_MspInit 0 */
  343. /* USER CODE END USART3_MspInit 0 */
  344. /* USART3 clock enable */
  345. __HAL_RCC_USART3_CLK_ENABLE();
  346. __HAL_RCC_GPIOB_CLK_ENABLE();
  347. /**USART3 GPIO Configuration
  348. PB10 ------> USART3_TX
  349. PB11 ------> USART3_RX
  350. */
  351. GPIO_InitStruct.Pin = GPIO_PIN_10;
  352. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  353. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  354. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  355. GPIO_InitStruct.Pin = GPIO_PIN_11;
  356. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  357. GPIO_InitStruct.Pull = GPIO_NOPULL;
  358. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  359. /* USART3 DMA Init */
  360. /* USART3_RX Init */
  361. hdma_usart3_rx.Instance = DMA1_Channel3;
  362. hdma_usart3_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
  363. hdma_usart3_rx.Init.PeriphInc = DMA_PINC_DISABLE;
  364. hdma_usart3_rx.Init.MemInc = DMA_MINC_ENABLE;
  365. hdma_usart3_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  366. hdma_usart3_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  367. hdma_usart3_rx.Init.Mode = DMA_NORMAL;
  368. hdma_usart3_rx.Init.Priority = DMA_PRIORITY_LOW;
  369. if (HAL_DMA_Init(&hdma_usart3_rx) != HAL_OK)
  370. {
  371. Error_Handler();
  372. }
  373. __HAL_LINKDMA(uartHandle,hdmarx,hdma_usart3_rx);
  374. /* USART3_TX Init */
  375. hdma_usart3_tx.Instance = DMA1_Channel2;
  376. hdma_usart3_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
  377. hdma_usart3_tx.Init.PeriphInc = DMA_PINC_DISABLE;
  378. hdma_usart3_tx.Init.MemInc = DMA_MINC_ENABLE;
  379. hdma_usart3_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  380. hdma_usart3_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  381. hdma_usart3_tx.Init.Mode = DMA_NORMAL;
  382. hdma_usart3_tx.Init.Priority = DMA_PRIORITY_LOW;
  383. if (HAL_DMA_Init(&hdma_usart3_tx) != HAL_OK)
  384. {
  385. Error_Handler();
  386. }
  387. __HAL_LINKDMA(uartHandle,hdmatx,hdma_usart3_tx);
  388. /* USART3 interrupt Init */
  389. HAL_NVIC_SetPriority(USART3_IRQn, 5, 0);
  390. HAL_NVIC_EnableIRQ(USART3_IRQn);
  391. /* USER CODE BEGIN USART3_MspInit 1 */
  392. /* USER CODE END USART3_MspInit 1 */
  393. }
  394. }
  395. void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
  396. {
  397. if(uartHandle->Instance==UART4)
  398. {
  399. /* USER CODE BEGIN UART4_MspDeInit 0 */
  400. /* USER CODE END UART4_MspDeInit 0 */
  401. /* Peripheral clock disable */
  402. __HAL_RCC_UART4_CLK_DISABLE();
  403. /**UART4 GPIO Configuration
  404. PC10 ------> UART4_TX
  405. PC11 ------> UART4_RX
  406. */
  407. HAL_GPIO_DeInit(GPIOC, GPIO_PIN_10|GPIO_PIN_11);
  408. /* UART4 DMA DeInit */
  409. HAL_DMA_DeInit(uartHandle->hdmarx);
  410. HAL_DMA_DeInit(uartHandle->hdmatx);
  411. /* UART4 interrupt Deinit */
  412. HAL_NVIC_DisableIRQ(UART4_IRQn);
  413. /* USER CODE BEGIN UART4_MspDeInit 1 */
  414. /* USER CODE END UART4_MspDeInit 1 */
  415. }
  416. else if(uartHandle->Instance==UART5)
  417. {
  418. /* USER CODE BEGIN UART5_MspDeInit 0 */
  419. /* USER CODE END UART5_MspDeInit 0 */
  420. /* Peripheral clock disable */
  421. __HAL_RCC_UART5_CLK_DISABLE();
  422. /**UART5 GPIO Configuration
  423. PC12 ------> UART5_TX
  424. PD2 ------> UART5_RX
  425. */
  426. HAL_GPIO_DeInit(GPIOC, GPIO_PIN_12);
  427. HAL_GPIO_DeInit(GPIOD, GPIO_PIN_2);
  428. /* UART5 interrupt Deinit */
  429. HAL_NVIC_DisableIRQ(UART5_IRQn);
  430. /* USER CODE BEGIN UART5_MspDeInit 1 */
  431. /* USER CODE END UART5_MspDeInit 1 */
  432. }
  433. else if(uartHandle->Instance==USART1)
  434. {
  435. /* USER CODE BEGIN USART1_MspDeInit 0 */
  436. /* USER CODE END USART1_MspDeInit 0 */
  437. /* Peripheral clock disable */
  438. __HAL_RCC_USART1_CLK_DISABLE();
  439. /**USART1 GPIO Configuration
  440. PA9 ------> USART1_TX
  441. PA10 ------> USART1_RX
  442. */
  443. HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
  444. /* USART1 DMA DeInit */
  445. HAL_DMA_DeInit(uartHandle->hdmarx);
  446. HAL_DMA_DeInit(uartHandle->hdmatx);
  447. /* USART1 interrupt Deinit */
  448. HAL_NVIC_DisableIRQ(USART1_IRQn);
  449. /* USER CODE BEGIN USART1_MspDeInit 1 */
  450. /* USER CODE END USART1_MspDeInit 1 */
  451. }
  452. else if(uartHandle->Instance==USART2)
  453. {
  454. /* USER CODE BEGIN USART2_MspDeInit 0 */
  455. /* USER CODE END USART2_MspDeInit 0 */
  456. /* Peripheral clock disable */
  457. __HAL_RCC_USART2_CLK_DISABLE();
  458. /**USART2 GPIO Configuration
  459. PA2 ------> USART2_TX
  460. PA3 ------> USART2_RX
  461. */
  462. HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);
  463. /* USART2 DMA DeInit */
  464. HAL_DMA_DeInit(uartHandle->hdmarx);
  465. HAL_DMA_DeInit(uartHandle->hdmatx);
  466. /* USART2 interrupt Deinit */
  467. HAL_NVIC_DisableIRQ(USART2_IRQn);
  468. /* USER CODE BEGIN USART2_MspDeInit 1 */
  469. /* USER CODE END USART2_MspDeInit 1 */
  470. }
  471. else if(uartHandle->Instance==USART3)
  472. {
  473. /* USER CODE BEGIN USART3_MspDeInit 0 */
  474. /* USER CODE END USART3_MspDeInit 0 */
  475. /* Peripheral clock disable */
  476. __HAL_RCC_USART3_CLK_DISABLE();
  477. /**USART3 GPIO Configuration
  478. PB10 ------> USART3_TX
  479. PB11 ------> USART3_RX
  480. */
  481. HAL_GPIO_DeInit(GPIOB, GPIO_PIN_10|GPIO_PIN_11);
  482. /* USART3 DMA DeInit */
  483. HAL_DMA_DeInit(uartHandle->hdmarx);
  484. HAL_DMA_DeInit(uartHandle->hdmatx);
  485. /* USART3 interrupt Deinit */
  486. HAL_NVIC_DisableIRQ(USART3_IRQn);
  487. /* USER CODE BEGIN USART3_MspDeInit 1 */
  488. /* USER CODE END USART3_MspDeInit 1 */
  489. }
  490. }
  491. /* USER CODE BEGIN 1 */
  492. #ifdef __GNUC__
  493. /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
  494. set to 'Yes') calls __io_putchar() */
  495. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  496. #else
  497. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  498. #endif /* __GNUC__ */
  499. /**
  500. * @brief Retargets the C library printf function to the USART.
  501. * @param None
  502. * @retval None
  503. */
  504. PUTCHAR_PROTOTYPE
  505. {
  506. /* Place your implementation of fputc here */
  507. /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
  508. /**
  509. * @brief printf全局打印
  510. */
  511. UART_PRINT(&huart3);//TTL
  512. return ch;
  513. }
  514. uint16_t read_flash_16(uint32_t addr){
  515. uint16_t data = *(volatile uint16_t*)addr; // 从Flash中读取2个字节
  516. return data;
  517. }
  518. void erase_flash(uint32_t ADDR_FLASH){ //进行擦除
  519. FLASH_EraseInitTypeDef erase_init;
  520. erase_init.TypeErase = FLASH_TYPEERASE_PAGES; // 擦除类型为页擦除
  521. erase_init.PageAddress = ADDR_FLASH;
  522. erase_init.NbPages = 1; // 擦除的页数
  523. uint32_t page_error = 0;
  524. HAL_FLASH_Unlock(); // 解锁Flash
  525. HAL_StatusTypeDef status = HAL_FLASHEx_Erase(&erase_init, &page_error); // 执行擦除操作
  526. HAL_FLASH_Lock(); // 上锁Flash
  527. if(status == HAL_OK){
  528. if(ADDR_FLASH == resetDevAddr) {
  529. //可添加复位标志
  530. }
  531. }
  532. }
  533. void Write_Information(uint32_t addr) {
  534. uint16_t newValue = 0;
  535. erase_flash(addr);
  536. HAL_FLASH_Unlock(); // 解锁Flash
  537. if (addr == resetDevAddr) { // 写入地址到Flash
  538. newValue = 0xAAAA;
  539. HAL_StatusTypeDef status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, addr, newValue);
  540. if (status == HAL_OK) {
  541. //复位写入成功
  542. }
  543. }
  544. HAL_FLASH_Lock(); // 上锁Flash
  545. }
  546. uint8_t xorBytes(uint8_t arr[], int size) {
  547. uint8_t result = arr[0]; // 初始化结果为第一个元素
  548. for (int i = 1; i < size; i++) {
  549. result ^= arr[i]; // 将结果与当前元素进行异或操作
  550. }
  551. //printf("异或结果: %02X\n", result); // 打印异或结果
  552. return result;
  553. }
  554. uint16_t crc16(uint8_t *data, size_t len) {
  555. uint8_t flag;
  556. uint16_t wcrc = 0xffff;
  557. for (size_t i = 0; i < len; i++) {
  558. wcrc = wcrc ^ (data[i] & 0xff);
  559. for (size_t j = 0; j < 8; j++) {
  560. flag = wcrc & 0x0001;
  561. wcrc = wcrc >> 1;
  562. if (flag == 1) {
  563. wcrc ^= 0xa001;
  564. }
  565. wcrc = wcrc & 0xffff;
  566. }
  567. }
  568. return wcrc;
  569. }
  570. void USART_SendHexArray(UART_HandleTypeDef *huart, uint8_t *data, int length)
  571. {
  572. HAL_UART_Transmit(huart,data, length, 0xFFFF);
  573. HAL_UART_Transmit(&huart3, data, length, 0xFFFF);//ttl
  574. }
  575. void sendCombinedArray(uint8_t *header, size_t headerLength, uint8_t *command, size_t commandLength) {
  576. // 创建一个长度为20的数组
  577. uint8_t combinedArray[20] = {0};
  578. // 将header复制到combinedArray的前两个字节
  579. combinedArray[0] = header[0];
  580. combinedArray[1] = header[1];
  581. // 计算command的异或校验和
  582. uint8_t result_xor = xorBytes(command, commandLength);
  583. // 创建一个长度为16的数组来存储command和result_xor
  584. uint8_t cmd_array[16] = {0};
  585. // 将command复制到cmd_array中
  586. for (int i = 0; i < commandLength; i++) {
  587. cmd_array[i] = command[i];
  588. }
  589. cmd_array[commandLength] = result_xor;
  590. // 将cmd_array添加到combinedArray
  591. for (int i = 0; i < 16; i++) {
  592. combinedArray[i + headerLength] = cmd_array[i];
  593. }
  594. // 计算combinedArray的CRC校验和
  595. uint16_t result_frame = crc16(combinedArray, sizeof(combinedArray) - 2);
  596. // 将result_frame添加到combinedArray
  597. combinedArray[18] = result_frame & 0xFF; //低字节在前
  598. combinedArray[19] = (result_frame >> 8) & 0xFF;
  599. // 发送combinedArray
  600. USART_SendHexArray(&huart5, combinedArray, sizeof(combinedArray));
  601. }
  602. /* USER CODE END 1 */