From da7e882c13fa70b2a9a7118d14e278df3fae629a Mon Sep 17 00:00:00 2001 From: Laurent MEUNIER Date: Thu, 8 Jun 2017 17:18:05 +0200 Subject: [PATCH] STM32: Put some serial code in common between families --- .../TARGET_STM/TARGET_STM32F0/serial_device.c | 37 +----------------- .../TARGET_STM/TARGET_STM32F1/serial_device.c | 37 +----------------- .../TARGET_STM/TARGET_STM32F2/serial_device.c | 37 +----------------- .../TARGET_STM/TARGET_STM32F3/serial_device.c | 35 +---------------- .../TARGET_STM/TARGET_STM32F4/serial_device.c | 33 ---------------- .../TARGET_STM/TARGET_STM32F7/serial_device.c | 39 ++----------------- .../TARGET_STM/TARGET_STM32L0/serial_device.c | 35 +---------------- .../TARGET_STM/TARGET_STM32L1/serial_device.c | 37 +----------------- .../TARGET_STM/TARGET_STM32L4/serial_device.c | 37 +----------------- targets/TARGET_STM/serial_api.c | 38 ++++++++++++++++++ 10 files changed, 53 insertions(+), 312 deletions(-) diff --git a/targets/TARGET_STM/TARGET_STM32F0/serial_device.c b/targets/TARGET_STM/TARGET_STM32F0/serial_device.c index cbaee8db2b..15df1b003c 100644 --- a/targets/TARGET_STM/TARGET_STM32F0/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32F0/serial_device.c @@ -468,54 +468,21 @@ void serial_putc(serial_t *obj, int c) huart->Instance->TDR = (uint32_t)(c & (uint16_t)0xFF); } -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; -} - -int serial_writable(serial_t *obj) -{ - struct serial_s *obj_s = SERIAL_S(obj); - UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - - // Check if data is transmitted - return (__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE) != RESET) ? 1 : 0; -} - 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; } -void serial_pinout_tx(PinName tx) -{ - pinmap_pinout(tx, PinMap_UART_TX); -} - void serial_break_set(serial_t *obj) { struct serial_s *obj_s = SERIAL_S(obj); UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - - //HAL_LIN_SendBreak(huart); -} -void serial_break_clear(serial_t *obj) -{ - (void)obj; + //HAL_LIN_SendBreak(huart); } #if DEVICE_SERIAL_ASYNCH diff --git a/targets/TARGET_STM/TARGET_STM32F1/serial_device.c b/targets/TARGET_STM/TARGET_STM32F1/serial_device.c index 226d88cd60..d541a0d584 100644 --- a/targets/TARGET_STM/TARGET_STM32F1/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32F1/serial_device.c @@ -285,54 +285,21 @@ void serial_putc(serial_t *obj, int c) } } -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; -} - -int serial_writable(serial_t *obj) -{ - struct serial_s *obj_s = SERIAL_S(obj); - UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - - // Check if data is transmitted - return (__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE) != RESET) ? 1 : 0; -} - 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; } -void serial_pinout_tx(PinName tx) -{ - pinmap_pinout(tx, PinMap_UART_TX); -} - void serial_break_set(serial_t *obj) { struct serial_s *obj_s = SERIAL_S(obj); UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - - HAL_LIN_SendBreak(huart); -} -void serial_break_clear(serial_t *obj) -{ - (void)obj; + HAL_LIN_SendBreak(huart); } #if DEVICE_SERIAL_ASYNCH diff --git a/targets/TARGET_STM/TARGET_STM32F2/serial_device.c b/targets/TARGET_STM/TARGET_STM32F2/serial_device.c index a869fbc2ee..8e2fc3b365 100644 --- a/targets/TARGET_STM/TARGET_STM32F2/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32F2/serial_device.c @@ -434,54 +434,21 @@ void serial_putc(serial_t *obj, int c) huart->Instance->DR = (uint32_t)(c & (uint16_t)0x1FF); } -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; -} - -int serial_writable(serial_t *obj) -{ - struct serial_s *obj_s = SERIAL_S(obj); - UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - - // Check if data is transmitted - return (__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE) != RESET) ? 1 : 0; -} - 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; } -void serial_pinout_tx(PinName tx) -{ - pinmap_pinout(tx, PinMap_UART_TX); -} - void serial_break_set(serial_t *obj) { struct serial_s *obj_s = SERIAL_S(obj); UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - - HAL_LIN_SendBreak(huart); -} -void serial_break_clear(serial_t *obj) -{ - (void)obj; + HAL_LIN_SendBreak(huart); } #if DEVICE_SERIAL_ASYNCH diff --git a/targets/TARGET_STM/TARGET_STM32F3/serial_device.c b/targets/TARGET_STM/TARGET_STM32F3/serial_device.c index 4f377d385c..a1136b97c5 100644 --- a/targets/TARGET_STM/TARGET_STM32F3/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32F3/serial_device.c @@ -369,29 +369,6 @@ void serial_putc(serial_t *obj, int c) } } -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; -} - -int serial_writable(serial_t *obj) -{ - struct serial_s *obj_s = SERIAL_S(obj); - UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - - // Check if data is transmitted - return (__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE) != RESET) ? 1 : 0; -} - void serial_clear(serial_t *obj) { struct serial_s *obj_s = SERIAL_S(obj); @@ -401,22 +378,12 @@ void serial_clear(serial_t *obj) __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST); } -void serial_pinout_tx(PinName tx) -{ - pinmap_pinout(tx, PinMap_UART_TX); -} - void serial_break_set(serial_t *obj) { struct serial_s *obj_s = SERIAL_S(obj); UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - - HAL_LIN_SendBreak(huart); -} -void serial_break_clear(serial_t *obj) -{ - (void)obj; + HAL_LIN_SendBreak(huart); } #if DEVICE_SERIAL_ASYNCH diff --git a/targets/TARGET_STM/TARGET_STM32F4/serial_device.c b/targets/TARGET_STM/TARGET_STM32F4/serial_device.c index 17c59618c9..7b2930af36 100644 --- a/targets/TARGET_STM/TARGET_STM32F4/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32F4/serial_device.c @@ -431,29 +431,6 @@ void serial_putc(serial_t *obj, int c) huart->Instance->DR = (uint32_t)(c & 0x1FF); } -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; -} - -int serial_writable(serial_t *obj) -{ - struct serial_s *obj_s = SERIAL_S(obj); - UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - - // Check if data is transmitted - return (__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE) != RESET) ? 1 : 0; -} - void serial_clear(serial_t *obj) { struct serial_s *obj_s = SERIAL_S(obj); @@ -463,11 +440,6 @@ void serial_clear(serial_t *obj) huart->RxXferCount = 0; } -void serial_pinout_tx(PinName tx) -{ - pinmap_pinout(tx, PinMap_UART_TX); -} - void serial_break_set(serial_t *obj) { struct serial_s *obj_s = SERIAL_S(obj); @@ -476,11 +448,6 @@ void serial_break_set(serial_t *obj) HAL_LIN_SendBreak(huart); } -void serial_break_clear(serial_t *obj) -{ - (void)obj; -} - #if DEVICE_SERIAL_ASYNCH /****************************************************************************** diff --git a/targets/TARGET_STM/TARGET_STM32F7/serial_device.c b/targets/TARGET_STM/TARGET_STM32F7/serial_device.c index 8530b867b9..b1bc49744d 100644 --- a/targets/TARGET_STM/TARGET_STM32F7/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32F7/serial_device.c @@ -408,7 +408,7 @@ int serial_getc(serial_t *obj) { struct serial_s *obj_s = SERIAL_S(obj); UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - + while (!serial_readable(obj)); return (int)(huart->Instance->RDR & 0x1FF); } @@ -417,34 +417,11 @@ void serial_putc(serial_t *obj, int c) { struct serial_s *obj_s = SERIAL_S(obj); UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - + while (!serial_writable(obj)); huart->Instance->TDR = (uint32_t)(c & 0x1FF); } -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; -} - -int serial_writable(serial_t *obj) -{ - struct serial_s *obj_s = SERIAL_S(obj); - UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - - // Check if data is transmitted - return (__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE) != RESET) ? 1 : 0; -} - void serial_clear(serial_t *obj) { struct serial_s *obj_s = SERIAL_S(obj); @@ -454,22 +431,12 @@ void serial_clear(serial_t *obj) __HAL_UART_CLEAR_IT(huart, UART_FLAG_RXNE); } -void serial_pinout_tx(PinName tx) -{ - pinmap_pinout(tx, PinMap_UART_TX); -} - void serial_break_set(serial_t *obj) { struct serial_s *obj_s = SERIAL_S(obj); UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - - HAL_LIN_SendBreak(huart); -} -void serial_break_clear(serial_t *obj) -{ - (void)obj; + HAL_LIN_SendBreak(huart); } #if DEVICE_SERIAL_ASYNCH diff --git a/targets/TARGET_STM/TARGET_STM32L0/serial_device.c b/targets/TARGET_STM/TARGET_STM32L0/serial_device.c index f94457605b..e973f1262e 100644 --- a/targets/TARGET_STM/TARGET_STM32L0/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32L0/serial_device.c @@ -351,43 +351,15 @@ void serial_putc(serial_t *obj, int c) huart->Instance->TDR = (uint32_t)(c & (uint16_t)0xFF); } -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; -} - -int serial_writable(serial_t *obj) -{ - struct serial_s *obj_s = SERIAL_S(obj); - UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - - // Check if data is transmitted - return (__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE) != RESET) ? 1 : 0; -} - 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; } -void serial_pinout_tx(PinName tx) -{ - pinmap_pinout(tx, PinMap_UART_TX); -} - void serial_break_set(serial_t *obj) { struct serial_s *obj_s = SERIAL_S(obj); @@ -396,11 +368,6 @@ void serial_break_set(serial_t *obj) __HAL_UART_SEND_REQ(huart, UART_SENDBREAK_REQUEST); } -void serial_break_clear(serial_t *obj) -{ - (void)obj; -} - #if DEVICE_SERIAL_ASYNCH /****************************************************************************** diff --git a/targets/TARGET_STM/TARGET_STM32L1/serial_device.c b/targets/TARGET_STM/TARGET_STM32L1/serial_device.c index b86936aba6..fef55bed57 100755 --- a/targets/TARGET_STM/TARGET_STM32L1/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32L1/serial_device.c @@ -341,54 +341,21 @@ void serial_putc(serial_t *obj, int c) } } -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; -} - -int serial_writable(serial_t *obj) -{ - struct serial_s *obj_s = SERIAL_S(obj); - UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - - // Check if data is transmitted - return (__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE) != RESET) ? 1 : 0; -} - 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; } -void serial_pinout_tx(PinName tx) -{ - pinmap_pinout(tx, PinMap_UART_TX); -} - void serial_break_set(serial_t *obj) { struct serial_s *obj_s = SERIAL_S(obj); UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - - HAL_LIN_SendBreak(huart); -} -void serial_break_clear(serial_t *obj) -{ - (void)obj; + HAL_LIN_SendBreak(huart); } #if DEVICE_SERIAL_ASYNCH diff --git a/targets/TARGET_STM/TARGET_STM32L4/serial_device.c b/targets/TARGET_STM/TARGET_STM32L4/serial_device.c index 970d1b770f..557d212d34 100644 --- a/targets/TARGET_STM/TARGET_STM32L4/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32L4/serial_device.c @@ -387,54 +387,21 @@ void serial_putc(serial_t *obj, int c) } } -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; -} - -int serial_writable(serial_t *obj) -{ - struct serial_s *obj_s = SERIAL_S(obj); - UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - - // Check if data is transmitted - return (__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE) != RESET) ? 1 : 0; -} - 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; } -void serial_pinout_tx(PinName tx) -{ - pinmap_pinout(tx, PinMap_UART_TX); -} - void serial_break_set(serial_t *obj) { struct serial_s *obj_s = SERIAL_S(obj); UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - - HAL_LIN_SendBreak(huart); -} -void serial_break_clear(serial_t *obj) -{ - (void)obj; + HAL_LIN_SendBreak(huart); } #if DEVICE_SERIAL_ASYNCH diff --git a/targets/TARGET_STM/serial_api.c b/targets/TARGET_STM/serial_api.c index c851b04bc4..5d6167b61e 100644 --- a/targets/TARGET_STM/serial_api.c +++ b/targets/TARGET_STM/serial_api.c @@ -31,6 +31,7 @@ #include "mbed_error.h" #include "serial_api.h" #include "serial_api_hal.h" +#include "PeripheralPins.h" #if DEVICE_SERIAL @@ -119,4 +120,41 @@ void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_b init_uart(obj); } +/****************************************************************************** + * READ/WRITE + ******************************************************************************/ + +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; +} + +int serial_writable(serial_t *obj) +{ + struct serial_s *obj_s = SERIAL_S(obj); + UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; + + // Check if data is transmitted + return (__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE) != RESET) ? 1 : 0; +} + +void serial_pinout_tx(PinName tx) +{ + pinmap_pinout(tx, PinMap_UART_TX); +} + +void serial_break_clear(serial_t *obj) +{ + (void)obj; +} + #endif /* DEVICE_SERIAL */