From cc7772e2e192420fbbb582599d3ae23faf15a09a Mon Sep 17 00:00:00 2001 From: Laurent MEUNIER Date: Thu, 8 Jun 2017 16:51:33 +0200 Subject: [PATCH] STM32: serial: clear Overrun flag if it is set when checking if readable Note that this could have side effects on the application as it would not be aware that data has been missed. This may be later solved by adding an error management parameter to the Serial API in mbed. The advantage is that the serial link can work again. --- targets/TARGET_STM/TARGET_STM32F0/serial_device.c | 7 ++++++- 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 | 7 ++++++- targets/TARGET_STM/TARGET_STM32F4/serial_device.c | 7 ++++++- targets/TARGET_STM/TARGET_STM32F7/serial_device.c | 7 ++++++- targets/TARGET_STM/TARGET_STM32L0/serial_device.c | 7 ++++++- targets/TARGET_STM/TARGET_STM32L1/serial_device.c | 7 ++++++- targets/TARGET_STM/TARGET_STM32L4/serial_device.c | 7 ++++++- 9 files changed, 54 insertions(+), 9 deletions(-) diff --git a/targets/TARGET_STM/TARGET_STM32F0/serial_device.c b/targets/TARGET_STM/TARGET_STM32F0/serial_device.c index ca9f1239a1..cbaee8db2b 100644 --- a/targets/TARGET_STM/TARGET_STM32F0/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32F0/serial_device.c @@ -472,7 +472,12 @@ int serial_readable(serial_t *obj) { struct serial_s *obj_s = SERIAL_S(obj); UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - + /* To avoid a target blocking case, let's check for + * possible OVERRUN error and discard it + */ + if(__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE)) { + __HAL_UART_CLEAR_OREFLAG(huart); + } // Check if data is received return (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) ? 1 : 0; } diff --git a/targets/TARGET_STM/TARGET_STM32F1/serial_device.c b/targets/TARGET_STM/TARGET_STM32F1/serial_device.c index 938df98674..226d88cd60 100644 --- a/targets/TARGET_STM/TARGET_STM32F1/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32F1/serial_device.c @@ -289,7 +289,12 @@ int serial_readable(serial_t *obj) { struct serial_s *obj_s = SERIAL_S(obj); UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - + /* To avoid a target blocking case, let's check for + * possible OVERRUN error and discard it + */ + if(__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE)) { + __HAL_UART_CLEAR_OREFLAG(huart); + } // Check if data is received return (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) ? 1 : 0; } diff --git a/targets/TARGET_STM/TARGET_STM32F2/serial_device.c b/targets/TARGET_STM/TARGET_STM32F2/serial_device.c index 3d173e5917..a869fbc2ee 100644 --- a/targets/TARGET_STM/TARGET_STM32F2/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32F2/serial_device.c @@ -438,7 +438,12 @@ int serial_readable(serial_t *obj) { struct serial_s *obj_s = SERIAL_S(obj); UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - + /* To avoid a target blocking case, let's check for + * possible OVERRUN error and discard it + */ + if(__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE)) { + __HAL_UART_CLEAR_OREFLAG(huart); + } // Check if data is received return (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) ? 1 : 0; } diff --git a/targets/TARGET_STM/TARGET_STM32F3/serial_device.c b/targets/TARGET_STM/TARGET_STM32F3/serial_device.c index 5e1ce117e5..4f377d385c 100644 --- a/targets/TARGET_STM/TARGET_STM32F3/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32F3/serial_device.c @@ -373,7 +373,12 @@ int serial_readable(serial_t *obj) { struct serial_s *obj_s = SERIAL_S(obj); UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - + /* To avoid a target blocking case, let's check for + * possible OVERRUN error and discard it + */ + if(__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE)) { + __HAL_UART_CLEAR_OREFLAG(huart); + } // Check if data is received return (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) ? 1 : 0; } diff --git a/targets/TARGET_STM/TARGET_STM32F4/serial_device.c b/targets/TARGET_STM/TARGET_STM32F4/serial_device.c index 0d5ad8c890..17c59618c9 100644 --- a/targets/TARGET_STM/TARGET_STM32F4/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32F4/serial_device.c @@ -435,7 +435,12 @@ int serial_readable(serial_t *obj) { struct serial_s *obj_s = SERIAL_S(obj); UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - + /* To avoid a target blocking case, let's check for + * possible OVERRUN error and discard it + */ + if(__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE)) { + __HAL_UART_CLEAR_OREFLAG(huart); + } // Check if data is received return (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) ? 1 : 0; } diff --git a/targets/TARGET_STM/TARGET_STM32F7/serial_device.c b/targets/TARGET_STM/TARGET_STM32F7/serial_device.c index f5b2f3da27..8530b867b9 100644 --- a/targets/TARGET_STM/TARGET_STM32F7/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32F7/serial_device.c @@ -426,7 +426,12 @@ int serial_readable(serial_t *obj) { struct serial_s *obj_s = SERIAL_S(obj); UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - + /* To avoid a target blocking case, let's check for + * possible OVERRUN error and discard it + */ + if(__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE)) { + __HAL_UART_CLEAR_OREFLAG(huart); + } // Check if data is received return (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) ? 1 : 0; } diff --git a/targets/TARGET_STM/TARGET_STM32L0/serial_device.c b/targets/TARGET_STM/TARGET_STM32L0/serial_device.c index 06ac4d31b6..f94457605b 100644 --- a/targets/TARGET_STM/TARGET_STM32L0/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32L0/serial_device.c @@ -355,7 +355,12 @@ int serial_readable(serial_t *obj) { struct serial_s *obj_s = SERIAL_S(obj); UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - + /* To avoid a target blocking case, let's check for + * possible OVERRUN error and discard it + */ + if(__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE)) { + __HAL_UART_CLEAR_OREFLAG(huart); + } // Check if data is received return (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) ? 1 : 0; } diff --git a/targets/TARGET_STM/TARGET_STM32L1/serial_device.c b/targets/TARGET_STM/TARGET_STM32L1/serial_device.c index 01cced3260..b86936aba6 100755 --- a/targets/TARGET_STM/TARGET_STM32L1/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32L1/serial_device.c @@ -345,7 +345,12 @@ int serial_readable(serial_t *obj) { struct serial_s *obj_s = SERIAL_S(obj); UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - + /* To avoid a target blocking case, let's check for + * possible OVERRUN error and discard it + */ + if(__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE)) { + __HAL_UART_CLEAR_OREFLAG(huart); + } // Check if data is received return (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) ? 1 : 0; } diff --git a/targets/TARGET_STM/TARGET_STM32L4/serial_device.c b/targets/TARGET_STM/TARGET_STM32L4/serial_device.c index 61657cf1dc..970d1b770f 100644 --- a/targets/TARGET_STM/TARGET_STM32L4/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32L4/serial_device.c @@ -391,7 +391,12 @@ int serial_readable(serial_t *obj) { struct serial_s *obj_s = SERIAL_S(obj); UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - + /* To avoid a target blocking case, let's check for + * possible OVERRUN error and discard it + */ + if(__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE)) { + __HAL_UART_CLEAR_OREFLAG(huart); + } // Check if data is received return (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) ? 1 : 0; }