From f20529f9e67c663234726cc4aa9ee05c107e751d Mon Sep 17 00:00:00 2001 From: Laurent Meunier Date: Mon, 25 Nov 2019 11:24:38 +0100 Subject: [PATCH] STM32: Update and align serial_clear implementations Clear RXNE flag by reading the RX register and align this implementation on all families. --- targets/TARGET_STM/TARGET_STM32F0/serial_device.c | 5 +++-- targets/TARGET_STM/TARGET_STM32F1/serial_device.c | 7 ++++--- targets/TARGET_STM/TARGET_STM32F2/serial_device.c | 7 ++++--- targets/TARGET_STM/TARGET_STM32F3/serial_device.c | 4 +++- targets/TARGET_STM/TARGET_STM32F4/serial_device.c | 5 +++-- targets/TARGET_STM/TARGET_STM32F7/serial_device.c | 5 +++-- targets/TARGET_STM/TARGET_STM32H7/serial_device.c | 5 +++-- targets/TARGET_STM/TARGET_STM32L0/serial_device.c | 5 +++-- targets/TARGET_STM/TARGET_STM32L1/serial_device.c | 5 +++-- targets/TARGET_STM/TARGET_STM32L4/serial_device.c | 5 +++-- targets/TARGET_STM/TARGET_STM32WB/serial_device.c | 5 +++-- 11 files changed, 35 insertions(+), 23 deletions(-) diff --git a/targets/TARGET_STM/TARGET_STM32F0/serial_device.c b/targets/TARGET_STM/TARGET_STM32F0/serial_device.c index 788e15b580..65d56f65a9 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 849676cd46..eb7a66b706 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 2cd79b1044..4f9d32eaf8 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 b7e47ff2d5..4b7b5087af 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 07e4e505bf..42296cdd60 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 01545d4385..a2a9f9327a 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 e29634334a..7acdfc8f64 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 2345e58548..3df454d63b 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 743ce4815d..5ec25dfb24 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 594a13e8ad..a43233df46 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 3891a6c2f5..7128c8e9f8 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)