usart.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  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) 2023 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. static const char LIB_CRC_MODBUS_HI[] =
  24. {
  25. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
  26. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
  27. 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
  28. 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
  29. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
  30. 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
  31. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
  32. 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
  33. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
  34. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
  35. 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
  36. 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
  37. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
  38. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
  39. 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
  40. 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
  41. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
  42. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
  43. 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
  44. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
  45. 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
  46. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
  47. 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
  48. 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
  49. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
  50. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
  51. };
  52. static const char LIB_CRC_MODBUS_LO[] =
  53. {
  54. 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
  55. 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
  56. 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
  57. 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
  58. 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
  59. 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
  60. 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
  61. 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
  62. 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
  63. 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
  64. 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
  65. 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
  66. 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
  67. 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
  68. 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
  69. 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
  70. 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
  71. 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
  72. 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
  73. 0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
  74. 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
  75. 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
  76. 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
  77. 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
  78. 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
  79. 0x43, 0x83, 0x41, 0x81, 0x80, 0x40
  80. };
  81. uint8_t USART2_RX_BUF[Uart2_BUF_SIZE];
  82. uint8_t USART2_RX_BUF002[Uart2_BUF_SIZE];
  83. /* USER CODE END 0 */
  84. UART_HandleTypeDef huart1;
  85. UART_HandleTypeDef huart3;
  86. DMA_HandleTypeDef hdma_usart1_rx;
  87. DMA_HandleTypeDef hdma_usart3_rx;
  88. /* USART1 init function */
  89. void MX_USART1_UART_Init(void)
  90. {
  91. /* USER CODE BEGIN USART1_Init 0 */
  92. /* USER CODE END USART1_Init 0 */
  93. /* USER CODE BEGIN USART1_Init 1 */
  94. /* USER CODE END USART1_Init 1 */
  95. huart1.Instance = USART1;
  96. huart1.Init.BaudRate = 9600;
  97. huart1.Init.WordLength = UART_WORDLENGTH_8B;
  98. huart1.Init.StopBits = UART_STOPBITS_1;
  99. huart1.Init.Parity = UART_PARITY_NONE;
  100. huart1.Init.Mode = UART_MODE_TX_RX;
  101. huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  102. huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  103. if (HAL_UART_Init(&huart1) != HAL_OK)
  104. {
  105. Error_Handler();
  106. }
  107. /* USER CODE BEGIN USART1_Init 2 */
  108. /* USER CODE END USART1_Init 2 */
  109. }
  110. /* USART3 init function */
  111. void MX_USART3_UART_Init(void)
  112. {
  113. /* USER CODE BEGIN USART3_Init 0 */
  114. /* USER CODE END USART3_Init 0 */
  115. /* USER CODE BEGIN USART3_Init 1 */
  116. /* USER CODE END USART3_Init 1 */
  117. huart3.Instance = USART3;
  118. huart3.Init.BaudRate = 9600;
  119. huart3.Init.WordLength = UART_WORDLENGTH_8B;
  120. huart3.Init.StopBits = UART_STOPBITS_1;
  121. huart3.Init.Parity = UART_PARITY_NONE;
  122. huart3.Init.Mode = UART_MODE_TX_RX;
  123. huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  124. huart3.Init.OverSampling = UART_OVERSAMPLING_16;
  125. if (HAL_UART_Init(&huart3) != HAL_OK)
  126. {
  127. Error_Handler();
  128. }
  129. /* USER CODE BEGIN USART3_Init 2 */
  130. /* USER CODE END USART3_Init 2 */
  131. }
  132. void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
  133. {
  134. GPIO_InitTypeDef GPIO_InitStruct = {0};
  135. if(uartHandle->Instance==USART1)
  136. {
  137. /* USER CODE BEGIN USART1_MspInit 0 */
  138. /* USER CODE END USART1_MspInit 0 */
  139. /* USART1 clock enable */
  140. __HAL_RCC_USART1_CLK_ENABLE();
  141. __HAL_RCC_GPIOA_CLK_ENABLE();
  142. /**USART1 GPIO Configuration
  143. PA9 ------> USART1_TX
  144. PA10 ------> USART1_RX
  145. */
  146. GPIO_InitStruct.Pin = GPIO_PIN_9;
  147. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  148. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  149. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  150. GPIO_InitStruct.Pin = GPIO_PIN_10;
  151. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  152. GPIO_InitStruct.Pull = GPIO_NOPULL;
  153. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  154. /* USART1 DMA Init */
  155. /* USART1_RX Init */
  156. hdma_usart1_rx.Instance = DMA1_Channel5;
  157. hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
  158. hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
  159. hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE;
  160. hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  161. hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  162. hdma_usart1_rx.Init.Mode = DMA_NORMAL;
  163. hdma_usart1_rx.Init.Priority = DMA_PRIORITY_LOW;
  164. if (HAL_DMA_Init(&hdma_usart1_rx) != HAL_OK)
  165. {
  166. Error_Handler();
  167. }
  168. __HAL_LINKDMA(uartHandle,hdmarx,hdma_usart1_rx);
  169. /* USART1 interrupt Init */
  170. HAL_NVIC_SetPriority(USART1_IRQn, 5, 0);
  171. HAL_NVIC_EnableIRQ(USART1_IRQn);
  172. /* USER CODE BEGIN USART1_MspInit 1 */
  173. /* USER CODE END USART1_MspInit 1 */
  174. }
  175. else if(uartHandle->Instance==USART3)
  176. {
  177. /* USER CODE BEGIN USART3_MspInit 0 */
  178. /* USER CODE END USART3_MspInit 0 */
  179. /* USART3 clock enable */
  180. __HAL_RCC_USART3_CLK_ENABLE();
  181. __HAL_RCC_GPIOB_CLK_ENABLE();
  182. /**USART3 GPIO Configuration
  183. PB10 ------> USART3_TX
  184. PB11 ------> USART3_RX
  185. */
  186. GPIO_InitStruct.Pin = GPIO_PIN_10;
  187. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  188. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  189. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  190. GPIO_InitStruct.Pin = GPIO_PIN_11;
  191. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  192. GPIO_InitStruct.Pull = GPIO_NOPULL;
  193. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  194. /* USART3 DMA Init */
  195. /* USART3_RX Init */
  196. hdma_usart3_rx.Instance = DMA1_Channel3;
  197. hdma_usart3_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
  198. hdma_usart3_rx.Init.PeriphInc = DMA_PINC_DISABLE;
  199. hdma_usart3_rx.Init.MemInc = DMA_MINC_ENABLE;
  200. hdma_usart3_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  201. hdma_usart3_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  202. hdma_usart3_rx.Init.Mode = DMA_NORMAL;
  203. hdma_usart3_rx.Init.Priority = DMA_PRIORITY_LOW;
  204. if (HAL_DMA_Init(&hdma_usart3_rx) != HAL_OK)
  205. {
  206. Error_Handler();
  207. }
  208. __HAL_LINKDMA(uartHandle,hdmarx,hdma_usart3_rx);
  209. /* USART3 interrupt Init */
  210. HAL_NVIC_SetPriority(USART3_IRQn, 5, 0);
  211. HAL_NVIC_EnableIRQ(USART3_IRQn);
  212. /* USER CODE BEGIN USART3_MspInit 1 */
  213. /* USER CODE END USART3_MspInit 1 */
  214. }
  215. }
  216. void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
  217. {
  218. if(uartHandle->Instance==USART1)
  219. {
  220. /* USER CODE BEGIN USART1_MspDeInit 0 */
  221. /* USER CODE END USART1_MspDeInit 0 */
  222. /* Peripheral clock disable */
  223. __HAL_RCC_USART1_CLK_DISABLE();
  224. /**USART1 GPIO Configuration
  225. PA9 ------> USART1_TX
  226. PA10 ------> USART1_RX
  227. */
  228. HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
  229. /* USART1 DMA DeInit */
  230. HAL_DMA_DeInit(uartHandle->hdmarx);
  231. /* USART1 interrupt Deinit */
  232. HAL_NVIC_DisableIRQ(USART1_IRQn);
  233. /* USER CODE BEGIN USART1_MspDeInit 1 */
  234. /* USER CODE END USART1_MspDeInit 1 */
  235. }
  236. else if(uartHandle->Instance==USART3)
  237. {
  238. /* USER CODE BEGIN USART3_MspDeInit 0 */
  239. /* USER CODE END USART3_MspDeInit 0 */
  240. /* Peripheral clock disable */
  241. __HAL_RCC_USART3_CLK_DISABLE();
  242. /**USART3 GPIO Configuration
  243. PB10 ------> USART3_TX
  244. PB11 ------> USART3_RX
  245. */
  246. HAL_GPIO_DeInit(GPIOB, GPIO_PIN_10|GPIO_PIN_11);
  247. /* USART3 DMA DeInit */
  248. HAL_DMA_DeInit(uartHandle->hdmarx);
  249. /* USART3 interrupt Deinit */
  250. HAL_NVIC_DisableIRQ(USART3_IRQn);
  251. /* USER CODE BEGIN USART3_MspDeInit 1 */
  252. /* USER CODE END USART3_MspDeInit 1 */
  253. }
  254. }
  255. /* USER CODE BEGIN 1 */
  256. void change_baudrate(uint32_t baudrate){
  257. __HAL_UART_DISABLE(&huart1); // 关闭UART
  258. huart1.Init.BaudRate = baudrate; // 更改波特率
  259. if(HAL_UART_Init(&huart1) != HAL_OK){
  260. Error_Handler();
  261. }
  262. __HAL_UART_ENABLE(&huart1); // 重新打开UART
  263. }
  264. uint32_t baudrate_list[] = {1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200};
  265. void update_baudrate(uint16_t temp) {
  266. if(temp <= 7) {
  267. change_baudrate(baudrate_list[temp]);
  268. }
  269. if(temp == 0xFFFF || temp == 0x0003) {
  270. change_baudrate(9600);
  271. }
  272. }
  273. void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
  274. {
  275. __HAL_UART_CLEAR_FLAG(huart, UART_FLAG_RXNE); // 清除接收中断标志位
  276. __HAL_UART_CLEAR_FLAG(huart, UART_FLAG_ORE); // 清除接收溢出标志位
  277. }
  278. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  279. {
  280. __HAL_UART_CLEAR_FLAG(huart, UART_FLAG_RXNE); // 清除接收中断标志位
  281. __HAL_UART_CLEAR_FLAG(huart, UART_FLAG_ORE); // 清除接收溢出标志位
  282. }
  283. /*****************************************************************
  284. * 串口发送数组函数
  285. ******************************************************************/
  286. void UartWrite(UART_HandleTypeDef *uartHandle, uint8_t *buf , uint8_t len)
  287. {
  288. uint8_t i;
  289. for(i = 0; i < len; i++)
  290. {
  291. HAL_UART_Transmit(uartHandle, &buf[i], 1, 0xFFFF);
  292. }
  293. }
  294. // 重定向函数1
  295. int fputc(int ch,FILE *f)
  296. {
  297. uint8_t temp[1]={ch};
  298. HAL_UART_Transmit(&huart1,temp,1,2); //
  299. HAL_UART_Transmit(&huart3,temp,1,2); //
  300. return 0;
  301. }
  302. //16位modbusCRC校验
  303. uint16_t LIB_CRC_MODBUS(uint8_t* Buf, uint16_t srLen)
  304. {
  305. uint32_t srIndex;
  306. char ucHI = 0xFF;
  307. char ucLO = 0xFF;
  308. while(srLen--)
  309. {
  310. srIndex = ucHI ^ *Buf++;
  311. ucHI = ucLO ^ LIB_CRC_MODBUS_HI[srIndex];
  312. ucLO = LIB_CRC_MODBUS_LO[srIndex];
  313. }
  314. return ((uint16_t)ucHI<<8) + ucLO;
  315. }
  316. /* USER CODE END 1 */