/** ****************************************************************************** * @file usart.c * @brief This file provides code for the configuration * of the USART instances. ****************************************************************************** * @attention * *

© Copyright (c) 2025 STMicroelectronics. * All rights reserved.

* * This software component is licensed by ST under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "usart.h" /* USER CODE BEGIN 0 */ #include "string.h" #include "stdio.h" #include "time.h" long timestamp = 0; /* USER CODE END 0 */ UART_HandleTypeDef huart4; UART_HandleTypeDef huart5; UART_HandleTypeDef huart1; UART_HandleTypeDef huart2; UART_HandleTypeDef huart3; /* UART4 init function */ void MX_UART4_Init(void) { /* USER CODE BEGIN UART4_Init 0 */ /* USER CODE END UART4_Init 0 */ /* USER CODE BEGIN UART4_Init 1 */ /* USER CODE END UART4_Init 1 */ huart4.Instance = UART4; huart4.Init.BaudRate = 9600; huart4.Init.WordLength = UART_WORDLENGTH_8B; huart4.Init.StopBits = UART_STOPBITS_1; huart4.Init.Parity = UART_PARITY_NONE; huart4.Init.Mode = UART_MODE_TX_RX; huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart4.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart4) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN UART4_Init 2 */ /* USER CODE END UART4_Init 2 */ } /* UART5 init function */ void MX_UART5_Init(void) { /* USER CODE BEGIN UART5_Init 0 */ /* USER CODE END UART5_Init 0 */ /* USER CODE BEGIN UART5_Init 1 */ /* USER CODE END UART5_Init 1 */ huart5.Instance = UART5; huart5.Init.BaudRate = 9600; huart5.Init.WordLength = UART_WORDLENGTH_8B; huart5.Init.StopBits = UART_STOPBITS_1; huart5.Init.Parity = UART_PARITY_NONE; huart5.Init.Mode = UART_MODE_TX_RX; huart5.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart5.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart5) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN UART5_Init 2 */ /* USER CODE END UART5_Init 2 */ } /* USART1 init function */ void MX_USART1_UART_Init(void) { /* USER CODE BEGIN USART1_Init 0 */ /* USER CODE END USART1_Init 0 */ /* USER CODE BEGIN USART1_Init 1 */ /* USER CODE END USART1_Init 1 */ huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN USART1_Init 2 */ /* USER CODE END USART1_Init 2 */ } /* USART2 init function */ void MX_USART2_UART_Init(void) { /* USER CODE BEGIN USART2_Init 0 */ /* USER CODE END USART2_Init 0 */ /* USER CODE BEGIN USART2_Init 1 */ /* USER CODE END USART2_Init 1 */ huart2.Instance = USART2; huart2.Init.BaudRate = 115200; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart2) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN USART2_Init 2 */ /* USER CODE END USART2_Init 2 */ } /* USART3 init function */ void MX_USART3_UART_Init(void) { /* USER CODE BEGIN USART3_Init 0 */ /* USER CODE END USART3_Init 0 */ /* USER CODE BEGIN USART3_Init 1 */ /* USER CODE END USART3_Init 1 */ huart3.Instance = USART3; huart3.Init.BaudRate = 9600; huart3.Init.WordLength = UART_WORDLENGTH_8B; huart3.Init.StopBits = UART_STOPBITS_1; huart3.Init.Parity = UART_PARITY_NONE; huart3.Init.Mode = UART_MODE_TX_RX; huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart3.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart3) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN USART3_Init 2 */ /* USER CODE END USART3_Init 2 */ } void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(uartHandle->Instance==UART4) { /* USER CODE BEGIN UART4_MspInit 0 */ /* USER CODE END UART4_MspInit 0 */ /* UART4 clock enable */ __HAL_RCC_UART4_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); /**UART4 GPIO Configuration PC10 ------> UART4_TX PC11 ------> UART4_RX */ GPIO_InitStruct.Pin = GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); /* UART4 interrupt Init */ HAL_NVIC_SetPriority(UART4_IRQn, 0, 0); HAL_NVIC_EnableIRQ(UART4_IRQn); /* USER CODE BEGIN UART4_MspInit 1 */ /* USER CODE END UART4_MspInit 1 */ } else if(uartHandle->Instance==UART5) { /* USER CODE BEGIN UART5_MspInit 0 */ /* USER CODE END UART5_MspInit 0 */ /* UART5 clock enable */ __HAL_RCC_UART5_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); /**UART5 GPIO Configuration PC12 ------> UART5_TX PD2 ------> UART5_RX */ GPIO_InitStruct.Pin = GPIO_PIN_12; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_2; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); /* UART5 interrupt Init */ HAL_NVIC_SetPriority(UART5_IRQn, 0, 0); HAL_NVIC_EnableIRQ(UART5_IRQn); /* USER CODE BEGIN UART5_MspInit 1 */ /* USER CODE END UART5_MspInit 1 */ } else if(uartHandle->Instance==USART1) { /* USER CODE BEGIN USART1_MspInit 0 */ /* USER CODE END USART1_MspInit 0 */ /* USART1 clock enable */ __HAL_RCC_USART1_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /**USART1 GPIO Configuration PA9 ------> USART1_TX PA10 ------> USART1_RX */ GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* USART1 interrupt Init */ HAL_NVIC_SetPriority(USART1_IRQn, 0, 0); HAL_NVIC_EnableIRQ(USART1_IRQn); /* USER CODE BEGIN USART1_MspInit 1 */ /* USER CODE END USART1_MspInit 1 */ } else if(uartHandle->Instance==USART2) { /* USER CODE BEGIN USART2_MspInit 0 */ /* USER CODE END USART2_MspInit 0 */ /* USART2 clock enable */ __HAL_RCC_USART2_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /**USART2 GPIO Configuration PA2 ------> USART2_TX PA3 ------> USART2_RX */ GPIO_InitStruct.Pin = GPIO_PIN_2; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* USART2 interrupt Init */ HAL_NVIC_SetPriority(USART2_IRQn, 0, 0); HAL_NVIC_EnableIRQ(USART2_IRQn); /* USER CODE BEGIN USART2_MspInit 1 */ /* USER CODE END USART2_MspInit 1 */ } else if(uartHandle->Instance==USART3) { /* USER CODE BEGIN USART3_MspInit 0 */ /* USER CODE END USART3_MspInit 0 */ /* USART3 clock enable */ __HAL_RCC_USART3_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /**USART3 GPIO Configuration PB10 ------> USART3_TX PB11 ------> USART3_RX */ GPIO_InitStruct.Pin = GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* USART3 interrupt Init */ HAL_NVIC_SetPriority(USART3_IRQn, 0, 0); HAL_NVIC_EnableIRQ(USART3_IRQn); /* USER CODE BEGIN USART3_MspInit 1 */ /* USER CODE END USART3_MspInit 1 */ } } void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle) { if(uartHandle->Instance==UART4) { /* USER CODE BEGIN UART4_MspDeInit 0 */ /* USER CODE END UART4_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_UART4_CLK_DISABLE(); /**UART4 GPIO Configuration PC10 ------> UART4_TX PC11 ------> UART4_RX */ HAL_GPIO_DeInit(GPIOC, GPIO_PIN_10|GPIO_PIN_11); /* UART4 interrupt Deinit */ HAL_NVIC_DisableIRQ(UART4_IRQn); /* USER CODE BEGIN UART4_MspDeInit 1 */ /* USER CODE END UART4_MspDeInit 1 */ } else if(uartHandle->Instance==UART5) { /* USER CODE BEGIN UART5_MspDeInit 0 */ /* USER CODE END UART5_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_UART5_CLK_DISABLE(); /**UART5 GPIO Configuration PC12 ------> UART5_TX PD2 ------> UART5_RX */ HAL_GPIO_DeInit(GPIOC, GPIO_PIN_12); HAL_GPIO_DeInit(GPIOD, GPIO_PIN_2); /* UART5 interrupt Deinit */ HAL_NVIC_DisableIRQ(UART5_IRQn); /* USER CODE BEGIN UART5_MspDeInit 1 */ /* USER CODE END UART5_MspDeInit 1 */ } else if(uartHandle->Instance==USART1) { /* USER CODE BEGIN USART1_MspDeInit 0 */ /* USER CODE END USART1_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_USART1_CLK_DISABLE(); /**USART1 GPIO Configuration PA9 ------> USART1_TX PA10 ------> USART1_RX */ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10); /* USART1 interrupt Deinit */ HAL_NVIC_DisableIRQ(USART1_IRQn); /* USER CODE BEGIN USART1_MspDeInit 1 */ /* USER CODE END USART1_MspDeInit 1 */ } else if(uartHandle->Instance==USART2) { /* USER CODE BEGIN USART2_MspDeInit 0 */ /* USER CODE END USART2_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_USART2_CLK_DISABLE(); /**USART2 GPIO Configuration PA2 ------> USART2_TX PA3 ------> USART2_RX */ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3); /* USART2 interrupt Deinit */ HAL_NVIC_DisableIRQ(USART2_IRQn); /* USER CODE BEGIN USART2_MspDeInit 1 */ /* USER CODE END USART2_MspDeInit 1 */ } else if(uartHandle->Instance==USART3) { /* USER CODE BEGIN USART3_MspDeInit 0 */ /* USER CODE END USART3_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_USART3_CLK_DISABLE(); /**USART3 GPIO Configuration PB10 ------> USART3_TX PB11 ------> USART3_RX */ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_10|GPIO_PIN_11); /* USART3 interrupt Deinit */ HAL_NVIC_DisableIRQ(USART3_IRQn); /* USER CODE BEGIN USART3_MspDeInit 1 */ /* USER CODE END USART3_MspDeInit 1 */ } } /* USER CODE BEGIN 1 */ #define RX_BUFFER_SIZE 128 #define TX_BUFFER_SIZE 256 // UART3 (CO2传感器) 定义 uint8_t uart3_rx_byte[1]; char uart3_rx_buffer[RX_BUFFER_SIZE]; uint16_t uart3_rx_index = 0; uint8_t uart3_data_ready = 0; int ppm_value_1 = 0; // UART1 (WiFi) 定义 uint8_t uart1_rx_byte[1]; char uart1_rx_buffer[RX_BUFFER_SIZE]; uint16_t uart1_rx_index = 0; uint8_t uart1_data_ready = 0; // UART4 (PM2.5传感器) 和 UART5 (TVOC传感器) 定义 uint8_t uart4_rx_byte[1], uart5_rx_byte[1]; uint8_t uart4_rx_buffer[32], uart5_rx_buffer[9]; uint8_t uart4_rx_index = 0, uart5_rx_index = 0; uint8_t uart4_data_ready = 0, uart5_data_ready = 0; // 传感器数据变量 uint16_t pm1_0, pm2_5, pm10; float tvoc_value = 0.0f; // WiFi接收行数据(属于UART1) char uart1_wifi_rx_line[RX_BUFFER_SIZE]; uint16_t uart1_wifi_rx_index = 0; // USART2 (蓝牙) 定义 uint8_t uart2_rx_byte; // 单字节缓冲 char uart2_rx_buffer[32]; // 接收缓冲 uint8_t uart2_rx_index = 0; extern I2C_HandleTypeDef hi2c1; #define EEPROM_ADDR (0x50 << 1) // 7bit地址0x50,HAL要左移1位 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart->Instance == USART1) // WiFi { char received_char = uart1_rx_byte[0]; if (uart1_wifi_rx_index < RX_BUFFER_SIZE - 1) { uart1_wifi_rx_line[uart1_wifi_rx_index++] = received_char; if (received_char == '\n') { uart1_wifi_rx_line[uart1_wifi_rx_index] = '\0'; if (strstr(uart1_wifi_rx_line, "+CIPSNTPTIME:") != NULL) { char weekday[4], month[4]; int day, year, hour, minute, second; struct tm timeinfo; if (sscanf(uart1_wifi_rx_line, "+CIPSNTPTIME:%s %s %d %d:%d:%d %d", weekday, month, &day, &hour, &minute, &second, &year) == 7) { memset(&timeinfo, 0, sizeof(struct tm)); const char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; for (int i = 0; i < 12; i++) { if (strcmp(month, months[i]) == 0) { timeinfo.tm_mon = i; break; } } timeinfo.tm_mday = day; timeinfo.tm_year = year - 1900; timeinfo.tm_hour = hour; timeinfo.tm_min = minute; timeinfo.tm_sec = second; timestamp = mktime(&timeinfo) - 8 * 3600; } } uart1_wifi_rx_index = 0; memset(uart1_wifi_rx_line, 0, sizeof(uart1_wifi_rx_line)); } } else { uart1_wifi_rx_index = 0; } HAL_UART_Receive_IT(&huart1, uart1_rx_byte, 1); } if (huart->Instance == USART3) // CO2 { if (uart3_rx_index < RX_BUFFER_SIZE - 1) { uart3_rx_buffer[uart3_rx_index++] = uart3_rx_byte[0]; if (uart3_rx_byte[0] == '\n') { uart3_rx_buffer[uart3_rx_index] = '\0'; uart3_data_ready = 1; uart3_rx_index = 0; } } else { uart3_rx_index = 0; } HAL_UART_Receive_IT(&huart3, uart3_rx_byte, 1); } if (huart->Instance == UART4) // PM2.5 { if (uart4_rx_index < sizeof(uart4_rx_buffer)) { uart4_rx_buffer[uart4_rx_index++] = uart4_rx_byte[0]; if (uart4_rx_index >= 2 && !(uart4_rx_buffer[0] == 0x42 && uart4_rx_buffer[1] == 0x4D)) { uart4_rx_index = 0; } if (uart4_rx_index >= 32 && uart4_rx_buffer[0] == 0x42 && uart4_rx_buffer[1] == 0x4D) { uart4_data_ready = 1; uart4_rx_index = 0; } } HAL_UART_Receive_IT(&huart4, uart4_rx_byte, 1); } if (huart->Instance == UART5) // TVOC { if (uart5_rx_index < sizeof(uart5_rx_buffer)) { uart5_rx_buffer[uart5_rx_index++] = uart5_rx_byte[0]; if (uart5_rx_index == 9 && uart5_rx_buffer[0] == 0x2C && uart5_rx_buffer[1] == 0xE4) { uart5_data_ready = 1; uart5_rx_index = 0; } } else { uart5_rx_index = 0; } HAL_UART_Receive_IT(&huart5, uart5_rx_byte, 1); } if (huart->Instance == USART2) // BLUETOOTH { uart2_rx_buffer[uart2_rx_index++] = uart2_rx_byte; if (uart2_rx_index >= sizeof(uart2_rx_buffer)) { uart2_rx_index = 0; } if (uart2_rx_index >= 4) { if ( uart2_rx_buffer[uart2_rx_index-4] == 'O' && uart2_rx_buffer[uart2_rx_index-3] == 'K' && uart2_rx_buffer[uart2_rx_index-2] == '\r' && uart2_rx_buffer[uart2_rx_index-1] == '\n' ) { EEPROM_Write_OK(); uart2_rx_index = 0; } } HAL_UART_Receive_IT(&huart2, &uart2_rx_byte, 1); } } void USART3_check(void) { if (uart3_data_ready) { uart3_data_ready = 0; char *ppm_start = strstr(uart3_rx_buffer, "ppm"); if (ppm_start) { sscanf(uart3_rx_buffer, "%d", &ppm_value_1); } } } void USART4_check(void) { if (uart4_data_ready) { uart4_data_ready = 0; pm1_0 = (uart4_rx_buffer[4] << 8) | uart4_rx_buffer[5]; pm2_5 = (uart4_rx_buffer[6] << 8) | uart4_rx_buffer[7]; pm10 = (uart4_rx_buffer[8] << 8) | uart4_rx_buffer[9]; } } void USART5_check(void) { if (uart5_data_ready) { uart5_data_ready = 0; uint8_t sum = 0; for (int i = 0; i < 8; i++) sum += uart5_rx_buffer[i]; if (sum == uart5_rx_buffer[8]) { uint16_t tvoc_raw = (uart5_rx_buffer[2] << 8) | uart5_rx_buffer[3]; tvoc_value = tvoc_raw * 0.001f; } } } /* USER CODE END 1 */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/