diff --git a/hal/targets/hal/TARGET_STM/TARGET_STM32F0/serial_api.c b/hal/targets/hal/TARGET_STM/TARGET_STM32F0/serial_api.c index afd98f83b33..8f0472ac891 100644 --- a/hal/targets/hal/TARGET_STM/TARGET_STM32F0/serial_api.c +++ b/hal/targets/hal/TARGET_STM/TARGET_STM32F0/serial_api.c @@ -459,6 +459,15 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) { * READ/WRITE ******************************************************************************/ +int serial_TxComplete(serial_t *obj) +{ + int status; + UartHandle.Instance = (USART_TypeDef *)(obj->uart); + // Check if data is transmitted + status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TC) != RESET) ? 1 : 0); + return status; +} + int serial_getc(serial_t *obj) { USART_TypeDef *uart = (USART_TypeDef *)(obj->uart); while (!serial_readable(obj)); @@ -469,6 +478,7 @@ void serial_putc(serial_t *obj, int c) { USART_TypeDef *uart = (USART_TypeDef *)(obj->uart); while (!serial_writable(obj)); uart->TDR = (uint32_t)(c & (uint16_t)0xFF); + while(!serial_TxComplete(obj)); } int serial_readable(serial_t *obj) { @@ -482,7 +492,7 @@ int serial_readable(serial_t *obj) { int serial_writable(serial_t *obj) { int status; UartHandle.Instance = (USART_TypeDef *)(obj->uart); - // Check if data is transmitted + // Check if data has moved to internal buffer status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TXE) != RESET) ? 1 : 0); return status; } diff --git a/hal/targets/hal/TARGET_STM/TARGET_STM32F1/serial_api.c b/hal/targets/hal/TARGET_STM/TARGET_STM32F1/serial_api.c index dffaf315a47..fe542450729 100644 --- a/hal/targets/hal/TARGET_STM/TARGET_STM32F1/serial_api.c +++ b/hal/targets/hal/TARGET_STM/TARGET_STM32F1/serial_api.c @@ -287,6 +287,14 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) /****************************************************************************** * READ/WRITE ******************************************************************************/ +int serial_TxComplete(serial_t *obj) +{ + int status; + UartHandle.Instance = (USART_TypeDef *)(obj->uart); + // Check if data is transmitted + status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TC) != RESET) ? 1 : 0); + return status; +} int serial_getc(serial_t *obj) { @@ -308,6 +316,7 @@ void serial_putc(serial_t *obj, int c) } else { uart->DR = (uint16_t)(c & (uint16_t)0x1FF); } + while(!serial_TxComplete(obj)); } int serial_readable(serial_t *obj) @@ -323,7 +332,7 @@ int serial_writable(serial_t *obj) { int status; UartHandle.Instance = (USART_TypeDef *)(obj->uart); - // Check if data is transmitted + // Check if data has moved to internal buffer status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TXE) != RESET) ? 1 : 0); return status; } diff --git a/hal/targets/hal/TARGET_STM/TARGET_STM32F3/serial_api.c b/hal/targets/hal/TARGET_STM/TARGET_STM32F3/serial_api.c index a035b33ad05..ba96f58466c 100644 --- a/hal/targets/hal/TARGET_STM/TARGET_STM32F3/serial_api.c +++ b/hal/targets/hal/TARGET_STM/TARGET_STM32F3/serial_api.c @@ -351,6 +351,15 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) * READ/WRITE ******************************************************************************/ +int serial_TxComplete(serial_t *obj) +{ + int status; + UartHandle.Instance = (USART_TypeDef *)(obj->uart); + // Check if data is transmitted + status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TC) != RESET) ? 1 : 0); + return status; +} + int serial_getc(serial_t *obj) { USART_TypeDef *uart = (USART_TypeDef *)(obj->uart); @@ -371,6 +380,7 @@ void serial_putc(serial_t *obj, int c) } else { uart->TDR = (uint16_t)(c & (uint16_t)0x1FF); } + while(!serial_TxComplete(obj)); } int serial_readable(serial_t *obj) @@ -386,7 +396,7 @@ int serial_writable(serial_t *obj) { int status; UartHandle.Instance = (USART_TypeDef *)(obj->uart); - // Check if data is transmitted + // Check if data has moved to internal buffer status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TXE) != RESET) ? 1 : 0); return status; } diff --git a/hal/targets/hal/TARGET_STM/TARGET_STM32F4/serial_api.c b/hal/targets/hal/TARGET_STM/TARGET_STM32F4/serial_api.c index 27361731aaf..9c1a596e789 100644 --- a/hal/targets/hal/TARGET_STM/TARGET_STM32F4/serial_api.c +++ b/hal/targets/hal/TARGET_STM/TARGET_STM32F4/serial_api.c @@ -807,6 +807,15 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) * READ/WRITE ******************************************************************************/ +int serial_TxComplete(serial_t *obj) +{ + int status; + UART_HandleTypeDef *handle = &UartHandle[SERIAL_OBJ(index)]; + // Check if data is transmitted + status = ((__HAL_UART_GET_FLAG(handle, UART_FLAG_TC) != RESET) ? 1 : 0); + return status; +} + int serial_getc(serial_t *obj) { UART_HandleTypeDef *handle = &UartHandle[SERIAL_OBJ(index)]; @@ -819,6 +828,7 @@ void serial_putc(serial_t *obj, int c) UART_HandleTypeDef *handle = &UartHandle[SERIAL_OBJ(index)]; while (!serial_writable(obj)); handle->Instance->DR = (uint32_t)(c & 0x1FF); + while(!serial_TxComplete(obj)); } int serial_readable(serial_t *obj) @@ -834,7 +844,7 @@ int serial_writable(serial_t *obj) { int status; UART_HandleTypeDef *handle = &UartHandle[SERIAL_OBJ(index)]; - // Check if data is transmitted + // Check if data has moved to internal buffer status = ((__HAL_UART_GET_FLAG(handle, UART_FLAG_TXE) != RESET) ? 1 : 0); return status; } diff --git a/hal/targets/hal/TARGET_STM/TARGET_STM32F7/serial_api.c b/hal/targets/hal/TARGET_STM/TARGET_STM32F7/serial_api.c index b0468ac5d10..fa16a2fc374 100644 --- a/hal/targets/hal/TARGET_STM/TARGET_STM32F7/serial_api.c +++ b/hal/targets/hal/TARGET_STM/TARGET_STM32F7/serial_api.c @@ -417,6 +417,15 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) * READ/WRITE ******************************************************************************/ +int serial_TxComplete(serial_t *obj) +{ + int status; + UartHandle.Instance = (USART_TypeDef *)(obj->uart); + // Check if data is transmitted + status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TC) != RESET) ? 1 : 0); + return status; +} + int serial_getc(serial_t *obj) { USART_TypeDef *uart = (USART_TypeDef *)(obj->uart); @@ -429,6 +438,7 @@ void serial_putc(serial_t *obj, int c) USART_TypeDef *uart = (USART_TypeDef *)(obj->uart); while (!serial_writable(obj)); uart->TDR = (uint32_t)(c & 0x1FF); + while(!serial_TxComplete(obj)); } int serial_readable(serial_t *obj) @@ -444,7 +454,7 @@ int serial_writable(serial_t *obj) { int status; UartHandle.Instance = (USART_TypeDef *)(obj->uart); - // Check if data is transmitted + // Check if data has moved to internal buffer status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TXE) != RESET) ? 1 : 0); return status; } diff --git a/hal/targets/hal/TARGET_STM/TARGET_STM32L0/serial_api.c b/hal/targets/hal/TARGET_STM/TARGET_STM32L0/serial_api.c index 5d61d99e82c..1332dc68d30 100644 --- a/hal/targets/hal/TARGET_STM/TARGET_STM32L0/serial_api.c +++ b/hal/targets/hal/TARGET_STM/TARGET_STM32L0/serial_api.c @@ -360,6 +360,15 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) * READ/WRITE ******************************************************************************/ +int serial_TxComplete(serial_t *obj) +{ + int status; + UartHandle.Instance = (USART_TypeDef *)(obj->uart); + // Check if data is transmitted + status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TC) != RESET) ? 1 : 0); + return status; +} + int serial_getc(serial_t *obj) { USART_TypeDef *uart = (USART_TypeDef *)(obj->uart); @@ -372,6 +381,7 @@ void serial_putc(serial_t *obj, int c) USART_TypeDef *uart = (USART_TypeDef *)(obj->uart); while (!serial_writable(obj)); uart->TDR = (uint32_t)(c & (uint32_t)0xFF); + while(!serial_TxComplete(obj)); } int serial_readable(serial_t *obj) @@ -387,7 +397,7 @@ int serial_writable(serial_t *obj) { int status; UartHandle.Instance = (USART_TypeDef *)(obj->uart); - // Check if data is transmitted + // Check if data has moved to internal buffer status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TXE) != RESET) ? 1 : 0); return status; } diff --git a/hal/targets/hal/TARGET_STM/TARGET_STM32L1/serial_api.c b/hal/targets/hal/TARGET_STM/TARGET_STM32L1/serial_api.c index 434bd4344d5..2730c85f337 100755 --- a/hal/targets/hal/TARGET_STM/TARGET_STM32L1/serial_api.c +++ b/hal/targets/hal/TARGET_STM/TARGET_STM32L1/serial_api.c @@ -355,6 +355,15 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) * READ/WRITE ******************************************************************************/ +int serial_TxComplete(serial_t *obj) +{ + int status; + UartHandle.Instance = (USART_TypeDef *)(obj->uart); + // Check if data is transmitted + status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TC) != RESET) ? 1 : 0); + return status; +} + int serial_getc(serial_t *obj) { USART_TypeDef *uart = (USART_TypeDef *)(obj->uart); @@ -367,6 +376,7 @@ void serial_putc(serial_t *obj, int c) USART_TypeDef *uart = (USART_TypeDef *)(obj->uart); while (!serial_writable(obj)); uart->DR = (uint32_t)(c & 0xFF); + while(!serial_TxComplete(obj)); } int serial_readable(serial_t *obj) @@ -382,7 +392,7 @@ int serial_writable(serial_t *obj) { int status; UartHandle.Instance = (USART_TypeDef *)(obj->uart); - // Check if data is transmitted + // Check if data has moved to internal buffer status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TXE) != RESET) ? 1 : 0); return status; } diff --git a/hal/targets/hal/TARGET_STM/TARGET_STM32L4/serial_api.c b/hal/targets/hal/TARGET_STM/TARGET_STM32L4/serial_api.c index 0bf46092c42..bc46fef6e0a 100644 --- a/hal/targets/hal/TARGET_STM/TARGET_STM32L4/serial_api.c +++ b/hal/targets/hal/TARGET_STM/TARGET_STM32L4/serial_api.c @@ -423,6 +423,15 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) * READ/WRITE ******************************************************************************/ +int serial_TxComplete(serial_t *obj) +{ + int status; + UartHandle.Instance = (USART_TypeDef *)(obj->uart); + // Check if data is transmitted + status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TC) != RESET) ? 1 : 0); + return status; +} + int serial_getc(serial_t *obj) { USART_TypeDef *uart = (USART_TypeDef *)(obj->uart); @@ -435,6 +444,7 @@ void serial_putc(serial_t *obj, int c) USART_TypeDef *uart = (USART_TypeDef *)(obj->uart); while (!serial_writable(obj)); uart->TDR = (uint32_t)(c & (uint32_t)0xFF); + while(!serial_TxComplete(obj)); } int serial_readable(serial_t *obj) @@ -450,7 +460,7 @@ int serial_writable(serial_t *obj) { int status; UartHandle.Instance = (USART_TypeDef *)(obj->uart); - // Check if data is transmitted + // Check if data has moved to internal buffer status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TXE) != RESET) ? 1 : 0); return status; }