
stm32f4xx_hal_uart.c 中的HAL_UART_IRQHandler 函数,增加如下代码 /* UART Idle interrupt occurred --------------------------------------------*/ if (((isrflags & USART_SR_IDLE) != RESET) && ((cr1its & USART_CR1_IDLEIE) != RESET)) { __HAL_UART_CLEAR_IDLEFLAG(huart); __HAL_UART_DISABLE_IT(huart, UART_IT_IDLE); HAL_UART_RxIdleCallback(huart); return; } 以下__weak 函数也在stm32f4xx_hal_uart.c 中定义 /** * @brief Rx Idle callbacks. * @param huart: Pointer to a UART_HandleTypeDef structure that contains * the configuration information for the specified UART module. * @retval None */ __weak void HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart) { /* Prevent unused argument(s) compilation warning */ UNUSED(huart); /* NOTE: This function should not be modified, when the callback is needed, the HAL_UART_RxIdleCallback can be implemented in the user file */ } 同时,stm32f4xx_hal_uart.h中增加如下函数声明,算是给最新的HAL库打补丁了。 void HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart); 最后,在生成的代码中,增加如下实际函数。 /* USER CODE BEGIN 1 */ /** * @brief Rx Transfer completed callbacks. * @param huart Pointer to a UART_HandleTypeDef structure that contains * the configuration information for the specified UART module. * @retval None */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart->Instance == USART1) { USART1_Rx_Buf[USART1_Rx_Count] = USART1_Rx_temp; HAL_UART_Receive_IT(huart, (uint8_t *)&USART1_Rx_temp, 1); if (++USART1_Rx_Count >= USART1_Rx_Buf_Size) { USART1_Rx_Count = 0; } __HAL_UART_CLEAR_IDLEFLAG(&huart1); __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); } } /** * @brief Rx Idle callbacks. * @param huart: Pointer to a UART_HandleTypeDef structure that contains * the configuration information for the specified UART module. * @retval None */ void HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart) { if (huart->Instance == USART1) { __HAL_UART_CLEAR_IDLEFLAG(huart); __HAL_UART_ENABLE_IT(huart, UART_IT_IDLE); if(USART1_Rx_Buf[1] == 0x55){ __NOP(); __NOP(); __NOP(); } else if(USART1_Rx_Buf[1] == 0xA5){ __NOP(); __NOP(); __NOP(); } memset((uint8_t *)USART1_Rx_Buf, 0, 1024); USART1_Rx_Count = 0; } } /* USER CODE END 1 */ 经测试,不管连发多少个字符,都会进空闲中断回调函数,这样应用程序就非常好处理了。 2019/05/10 wjandsq@163.com |
很好用,多谢分享