Skip to content

Commit b9b7a9d

Browse files
ppescherfpistm
authored andcommitted
[UART] Fix error callback (clear flags and restart receive IT)
1 parent 9dbb03b commit b9b7a9d

File tree

1 file changed

+16
-11
lines changed

1 file changed

+16
-11
lines changed

cores/arduino/stm32/uart.c

+16-11
Original file line numberDiff line numberDiff line change
@@ -783,30 +783,35 @@ void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
783783
*/
784784
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
785785
{
786-
volatile uint32_t tmpval;
787786
#if defined(STM32F1xx) || defined(STM32F2xx) || defined(STM32F4xx) || defined(STM32L1xx)
788787
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_PE) != RESET) {
789-
tmpval = huart->Instance->DR; /* Clear PE flag */
788+
__HAL_UART_CLEAR_PEFLAG(huart); /* Clear PE flag */
790789
} else if (__HAL_UART_GET_FLAG(huart, UART_FLAG_FE) != RESET) {
791-
tmpval = huart->Instance->DR; /* Clear FE flag */
790+
__HAL_UART_CLEAR_FEFLAG(huart); /* Clear FE flag */
792791
} else if (__HAL_UART_GET_FLAG(huart, UART_FLAG_NE) != RESET) {
793-
tmpval = huart->Instance->DR; /* Clear NE flag */
792+
__HAL_UART_CLEAR_NEFLAG(huart); /* Clear NE flag */
794793
} else if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) {
795-
tmpval = huart->Instance->DR; /* Clear ORE flag */
794+
__HAL_UART_CLEAR_OREFLAG(huart); /* Clear ORE flag */
796795
}
797796
#else
798797
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_PE) != RESET) {
799-
tmpval = huart->Instance->RDR; /* Clear PE flag */
798+
__HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_PEF); /* Clear PE flag */
800799
} else if (__HAL_UART_GET_FLAG(huart, UART_FLAG_FE) != RESET) {
801-
tmpval = huart->Instance->RDR; /* Clear FE flag */
800+
__HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_FEF); /* Clear FE flag */
802801
} else if (__HAL_UART_GET_FLAG(huart, UART_FLAG_NE) != RESET) {
803-
tmpval = huart->Instance->RDR; /* Clear NE flag */
802+
__HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_NEF); /* Clear NE flag */
804803
} else if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) {
805-
tmpval = huart->Instance->RDR; /* Clear ORE flag */
804+
__HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF); /* Clear ORE flag */
806805
}
807806
#endif
808-
809-
UNUSED(tmpval);
807+
/* Restart receive interrupt after any error */
808+
uint8_t index = uart_index(huart);
809+
if (index < UART_NUM) {
810+
serial_t *obj = rx_callback_obj[index];
811+
if (obj && !serial_rx_active(obj)) {
812+
HAL_UART_Receive_IT(uart_handlers[obj->index], &(obj->recv), 1);
813+
}
814+
}
810815
}
811816

812817
/**

0 commit comments

Comments
 (0)