usart.c 20 KB

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