diff --git a/targets/TARGET_STM/TARGET_STM32F0/serial_device.c b/targets/TARGET_STM/TARGET_STM32F0/serial_device.c index 788e15b5804..65d56f65a90 100644 --- a/targets/TARGET_STM/TARGET_STM32F0/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32F0/serial_device.c @@ -281,8 +281,9 @@ void serial_clear(serial_t *obj) struct serial_s *obj_s = SERIAL_S(obj); UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - huart->TxXferCount = 0; - huart->RxXferCount = 0; + /* Clear RXNE and error flags */ + volatile uint32_t tmpval __attribute__((unused)) = huart->Instance->RDR; + HAL_UART_ErrorCallback(huart); } void serial_break_set(serial_t *obj) diff --git a/targets/TARGET_STM/TARGET_STM32F1/serial_device.c b/targets/TARGET_STM/TARGET_STM32F1/serial_device.c index 849676cd467..eb7a66b7063 100644 --- a/targets/TARGET_STM/TARGET_STM32F1/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32F1/serial_device.c @@ -196,8 +196,9 @@ void serial_clear(serial_t *obj) struct serial_s *obj_s = SERIAL_S(obj); UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - huart->TxXferCount = 0; - huart->RxXferCount = 0; + /* Clear RXNE and error flags */ + volatile uint32_t tmpval __attribute__((unused)) = huart->Instance->DR; + HAL_UART_ErrorCallback(huart); } void serial_break_set(serial_t *obj) @@ -576,7 +577,7 @@ void serial_rx_abort_asynch(serial_t *obj) // clear flags __HAL_UART_CLEAR_FLAG(huart, UART_FLAG_RXNE); - volatile uint32_t tmpval __attribute__((unused)) = huart->Instance->DR; // Clear errors flag + volatile uint32_t tmpval __attribute__((unused)) = huart->Instance->DR; // Clear Rx empty flag // reset states huart->RxXferCount = 0; diff --git a/targets/TARGET_STM/TARGET_STM32F2/serial_device.c b/targets/TARGET_STM/TARGET_STM32F2/serial_device.c index 2cd79b1044b..4f9d32eaf86 100644 --- a/targets/TARGET_STM/TARGET_STM32F2/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32F2/serial_device.c @@ -253,8 +253,9 @@ void serial_clear(serial_t *obj) struct serial_s *obj_s = SERIAL_S(obj); UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - huart->TxXferCount = 0; - huart->RxXferCount = 0; + /* Clear RXNE and error flags */ + volatile uint32_t tmpval __attribute__((unused)) = huart->Instance->DR; + HAL_UART_ErrorCallback(huart); } void serial_break_set(serial_t *obj) @@ -659,7 +660,7 @@ void serial_rx_abort_asynch(serial_t *obj) // clear flags __HAL_UART_CLEAR_FLAG(huart, UART_FLAG_RXNE); - volatile uint32_t tmpval __attribute__((unused)) = huart->Instance->DR; // Clear error flags + volatile uint32_t tmpval __attribute__((unused)) = huart->Instance->DR; // Clear Rx empty flags // reset states huart->RxXferCount = 0; diff --git a/targets/TARGET_STM/TARGET_STM32F3/serial_device.c b/targets/TARGET_STM/TARGET_STM32F3/serial_device.c index b7e47ff2d52..4b7b5087af7 100644 --- a/targets/TARGET_STM/TARGET_STM32F3/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32F3/serial_device.c @@ -228,7 +228,9 @@ void serial_clear(serial_t *obj) struct serial_s *obj_s = SERIAL_S(obj); UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST); + /* Clear RXNE and error flags */ + volatile uint32_t tmpval __attribute__((unused)) = huart->Instance->RDR; + HAL_UART_ErrorCallback(huart); } void serial_break_set(serial_t *obj) diff --git a/targets/TARGET_STM/TARGET_STM32F4/serial_device.c b/targets/TARGET_STM/TARGET_STM32F4/serial_device.c index 07e4e505bf6..42296cdd601 100644 --- a/targets/TARGET_STM/TARGET_STM32F4/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32F4/serial_device.c @@ -289,8 +289,9 @@ void serial_clear(serial_t *obj) struct serial_s *obj_s = SERIAL_S(obj); UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - huart->TxXferCount = 0; - huart->RxXferCount = 0; + /* Clear RXNE and error flags */ + volatile uint32_t tmpval __attribute__((unused)) = huart->Instance->DR; + HAL_UART_ErrorCallback(huart); } void serial_break_set(serial_t *obj) diff --git a/targets/TARGET_STM/TARGET_STM32F7/serial_device.c b/targets/TARGET_STM/TARGET_STM32F7/serial_device.c index 01545d43854..a2a9f9327ac 100644 --- a/targets/TARGET_STM/TARGET_STM32F7/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32F7/serial_device.c @@ -252,8 +252,9 @@ void serial_clear(serial_t *obj) struct serial_s *obj_s = SERIAL_S(obj); UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - __HAL_UART_CLEAR_IT(huart, UART_FLAG_TXE); - __HAL_UART_CLEAR_IT(huart, UART_FLAG_RXNE); + /* Clear RXNE and error flags */ + volatile uint32_t tmpval __attribute__((unused)) = huart->Instance->RDR; + HAL_UART_ErrorCallback(huart); } void serial_break_set(serial_t *obj) diff --git a/targets/TARGET_STM/TARGET_STM32H7/serial_device.c b/targets/TARGET_STM/TARGET_STM32H7/serial_device.c index e29634334ae..7acdfc8f64a 100644 --- a/targets/TARGET_STM/TARGET_STM32H7/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32H7/serial_device.c @@ -265,8 +265,9 @@ void serial_clear(serial_t *obj) struct serial_s *obj_s = SERIAL_S(obj); UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - __HAL_UART_CLEAR_IT(huart, UART_FLAG_TXE); - __HAL_UART_CLEAR_IT(huart, UART_FLAG_RXNE); + /* Clear RXNE and error flags */ + volatile uint32_t tmpval __attribute__((unused)) = huart->Instance->RDR; + HAL_UART_ErrorCallback(huart); } void serial_break_set(serial_t *obj) diff --git a/targets/TARGET_STM/TARGET_STM32L0/serial_device.c b/targets/TARGET_STM/TARGET_STM32L0/serial_device.c index 2345e585483..3df454d63b5 100644 --- a/targets/TARGET_STM/TARGET_STM32L0/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32L0/serial_device.c @@ -222,8 +222,9 @@ void serial_clear(serial_t *obj) struct serial_s *obj_s = SERIAL_S(obj); UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - huart->TxXferCount = 0; - huart->RxXferCount = 0; + /* Clear RXNE and error flags */ + volatile uint32_t tmpval __attribute__((unused)) = huart->Instance->RDR; + HAL_UART_ErrorCallback(huart); } void serial_break_set(serial_t *obj) diff --git a/targets/TARGET_STM/TARGET_STM32L1/serial_device.c b/targets/TARGET_STM/TARGET_STM32L1/serial_device.c index 743ce4815db..5ec25dfb24c 100644 --- a/targets/TARGET_STM/TARGET_STM32L1/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32L1/serial_device.c @@ -222,8 +222,9 @@ void serial_clear(serial_t *obj) struct serial_s *obj_s = SERIAL_S(obj); UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - huart->TxXferCount = 0; - huart->RxXferCount = 0; + /* Clear RXNE and error flags */ + volatile uint32_t tmpval __attribute__((unused)) = huart->Instance->DR; + HAL_UART_ErrorCallback(huart); } void serial_break_set(serial_t *obj) diff --git a/targets/TARGET_STM/TARGET_STM32L4/serial_device.c b/targets/TARGET_STM/TARGET_STM32L4/serial_device.c index 594a13e8ad9..a43233df460 100644 --- a/targets/TARGET_STM/TARGET_STM32L4/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32L4/serial_device.c @@ -241,8 +241,9 @@ void serial_clear(serial_t *obj) struct serial_s *obj_s = SERIAL_S(obj); UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - huart->TxXferCount = 0; - huart->RxXferCount = 0; + /* Clear RXNE and error flags */ + volatile uint32_t tmpval __attribute__((unused)) = huart->Instance->RDR; + HAL_UART_ErrorCallback(huart); } void serial_break_set(serial_t *obj) diff --git a/targets/TARGET_STM/TARGET_STM32WB/serial_device.c b/targets/TARGET_STM/TARGET_STM32WB/serial_device.c index 3891a6c2f5d..7128c8e9f81 100644 --- a/targets/TARGET_STM/TARGET_STM32WB/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32WB/serial_device.c @@ -186,8 +186,9 @@ void serial_clear(serial_t *obj) struct serial_s *obj_s = SERIAL_S(obj); UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - huart->TxXferCount = 0; - huart->RxXferCount = 0; + /* Clear RXNE and error flags */ + volatile uint32_t tmpval __attribute__((unused)) = huart->Instance->RDR; + HAL_UART_ErrorCallback(huart); } void serial_break_set(serial_t *obj)