Skip to content

Commit cfe2cfd

Browse files
committed
[STM32] Ensure UART Tx completion
As explained in UART of STM32 reference manuals: After writing the last data into the USART_DR register, it is mandatory to wait for TC=1 before disabling the USART or causing the microcontroller to enter the low-power mode.
1 parent 0d3c835 commit cfe2cfd

File tree

8 files changed

+87
-8
lines changed

8 files changed

+87
-8
lines changed

hal/targets/hal/TARGET_STM/TARGET_STM32F0/serial_api.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,15 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) {
459459
* READ/WRITE
460460
******************************************************************************/
461461

462+
int serial_TxComplete(serial_t *obj)
463+
{
464+
int status;
465+
UartHandle.Instance = (USART_TypeDef *)(obj->uart);
466+
// Check if data is transmitted
467+
status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TC) != RESET) ? 1 : 0);
468+
return status;
469+
}
470+
462471
int serial_getc(serial_t *obj) {
463472
USART_TypeDef *uart = (USART_TypeDef *)(obj->uart);
464473
while (!serial_readable(obj));
@@ -469,6 +478,7 @@ void serial_putc(serial_t *obj, int c) {
469478
USART_TypeDef *uart = (USART_TypeDef *)(obj->uart);
470479
while (!serial_writable(obj));
471480
uart->TDR = (uint32_t)(c & (uint16_t)0xFF);
481+
while(!serial_TxComplete(obj));
472482
}
473483

474484
int serial_readable(serial_t *obj) {
@@ -482,7 +492,7 @@ int serial_readable(serial_t *obj) {
482492
int serial_writable(serial_t *obj) {
483493
int status;
484494
UartHandle.Instance = (USART_TypeDef *)(obj->uart);
485-
// Check if data is transmitted
495+
// Check if data has moved to internal buffer
486496
status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TXE) != RESET) ? 1 : 0);
487497
return status;
488498
}

hal/targets/hal/TARGET_STM/TARGET_STM32F1/serial_api.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,14 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
287287
/******************************************************************************
288288
* READ/WRITE
289289
******************************************************************************/
290+
int serial_TxComplete(serial_t *obj)
291+
{
292+
int status;
293+
UartHandle.Instance = (USART_TypeDef *)(obj->uart);
294+
// Check if data is transmitted
295+
status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TC) != RESET) ? 1 : 0);
296+
return status;
297+
}
290298

291299
int serial_getc(serial_t *obj)
292300
{
@@ -308,6 +316,7 @@ void serial_putc(serial_t *obj, int c)
308316
} else {
309317
uart->DR = (uint16_t)(c & (uint16_t)0x1FF);
310318
}
319+
while(!serial_TxComplete(obj));
311320
}
312321

313322
int serial_readable(serial_t *obj)
@@ -323,7 +332,7 @@ int serial_writable(serial_t *obj)
323332
{
324333
int status;
325334
UartHandle.Instance = (USART_TypeDef *)(obj->uart);
326-
// Check if data is transmitted
335+
// Check if data has moved to internal buffer
327336
status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TXE) != RESET) ? 1 : 0);
328337
return status;
329338
}

hal/targets/hal/TARGET_STM/TARGET_STM32F3/serial_api.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,15 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
351351
* READ/WRITE
352352
******************************************************************************/
353353

354+
int serial_TxComplete(serial_t *obj)
355+
{
356+
int status;
357+
UartHandle.Instance = (USART_TypeDef *)(obj->uart);
358+
// Check if data is transmitted
359+
status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TC) != RESET) ? 1 : 0);
360+
return status;
361+
}
362+
354363
int serial_getc(serial_t *obj)
355364
{
356365
USART_TypeDef *uart = (USART_TypeDef *)(obj->uart);
@@ -371,6 +380,7 @@ void serial_putc(serial_t *obj, int c)
371380
} else {
372381
uart->TDR = (uint16_t)(c & (uint16_t)0x1FF);
373382
}
383+
while(!serial_TxComplete(obj));
374384
}
375385

376386
int serial_readable(serial_t *obj)
@@ -386,7 +396,7 @@ int serial_writable(serial_t *obj)
386396
{
387397
int status;
388398
UartHandle.Instance = (USART_TypeDef *)(obj->uart);
389-
// Check if data is transmitted
399+
// Check if data has moved to internal buffer
390400
status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TXE) != RESET) ? 1 : 0);
391401
return status;
392402
}

hal/targets/hal/TARGET_STM/TARGET_STM32F4/serial_api.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -807,6 +807,15 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
807807
* READ/WRITE
808808
******************************************************************************/
809809

810+
int serial_TxComplete(serial_t *obj)
811+
{
812+
int status;
813+
UART_HandleTypeDef *handle = &UartHandle[SERIAL_OBJ(index)];
814+
// Check if data is transmitted
815+
status = ((__HAL_UART_GET_FLAG(handle, UART_FLAG_TC) != RESET) ? 1 : 0);
816+
return status;
817+
}
818+
810819
int serial_getc(serial_t *obj)
811820
{
812821
UART_HandleTypeDef *handle = &UartHandle[SERIAL_OBJ(index)];
@@ -819,6 +828,7 @@ void serial_putc(serial_t *obj, int c)
819828
UART_HandleTypeDef *handle = &UartHandle[SERIAL_OBJ(index)];
820829
while (!serial_writable(obj));
821830
handle->Instance->DR = (uint32_t)(c & 0x1FF);
831+
while(!serial_TxComplete(obj));
822832
}
823833

824834
int serial_readable(serial_t *obj)
@@ -834,7 +844,7 @@ int serial_writable(serial_t *obj)
834844
{
835845
int status;
836846
UART_HandleTypeDef *handle = &UartHandle[SERIAL_OBJ(index)];
837-
// Check if data is transmitted
847+
// Check if data has moved to internal buffer
838848
status = ((__HAL_UART_GET_FLAG(handle, UART_FLAG_TXE) != RESET) ? 1 : 0);
839849
return status;
840850
}

hal/targets/hal/TARGET_STM/TARGET_STM32F7/serial_api.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,15 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
417417
* READ/WRITE
418418
******************************************************************************/
419419

420+
int serial_TxComplete(serial_t *obj)
421+
{
422+
int status;
423+
UartHandle.Instance = (USART_TypeDef *)(obj->uart);
424+
// Check if data is transmitted
425+
status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TC) != RESET) ? 1 : 0);
426+
return status;
427+
}
428+
420429
int serial_getc(serial_t *obj)
421430
{
422431
USART_TypeDef *uart = (USART_TypeDef *)(obj->uart);
@@ -429,6 +438,7 @@ void serial_putc(serial_t *obj, int c)
429438
USART_TypeDef *uart = (USART_TypeDef *)(obj->uart);
430439
while (!serial_writable(obj));
431440
uart->TDR = (uint32_t)(c & 0x1FF);
441+
while(!serial_TxComplete(obj));
432442
}
433443

434444
int serial_readable(serial_t *obj)
@@ -444,7 +454,7 @@ int serial_writable(serial_t *obj)
444454
{
445455
int status;
446456
UartHandle.Instance = (USART_TypeDef *)(obj->uart);
447-
// Check if data is transmitted
457+
// Check if data has moved to internal buffer
448458
status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TXE) != RESET) ? 1 : 0);
449459
return status;
450460
}

hal/targets/hal/TARGET_STM/TARGET_STM32L0/serial_api.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,15 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
360360
* READ/WRITE
361361
******************************************************************************/
362362

363+
int serial_TxComplete(serial_t *obj)
364+
{
365+
int status;
366+
UartHandle.Instance = (USART_TypeDef *)(obj->uart);
367+
// Check if data is transmitted
368+
status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TC) != RESET) ? 1 : 0);
369+
return status;
370+
}
371+
363372
int serial_getc(serial_t *obj)
364373
{
365374
USART_TypeDef *uart = (USART_TypeDef *)(obj->uart);
@@ -372,6 +381,7 @@ void serial_putc(serial_t *obj, int c)
372381
USART_TypeDef *uart = (USART_TypeDef *)(obj->uart);
373382
while (!serial_writable(obj));
374383
uart->TDR = (uint32_t)(c & (uint32_t)0xFF);
384+
while(!serial_TxComplete(obj));
375385
}
376386

377387
int serial_readable(serial_t *obj)
@@ -387,7 +397,7 @@ int serial_writable(serial_t *obj)
387397
{
388398
int status;
389399
UartHandle.Instance = (USART_TypeDef *)(obj->uart);
390-
// Check if data is transmitted
400+
// Check if data has moved to internal buffer
391401
status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TXE) != RESET) ? 1 : 0);
392402
return status;
393403
}

hal/targets/hal/TARGET_STM/TARGET_STM32L1/serial_api.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,15 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
355355
* READ/WRITE
356356
******************************************************************************/
357357

358+
int serial_TxComplete(serial_t *obj)
359+
{
360+
int status;
361+
UartHandle.Instance = (USART_TypeDef *)(obj->uart);
362+
// Check if data is transmitted
363+
status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TC) != RESET) ? 1 : 0);
364+
return status;
365+
}
366+
358367
int serial_getc(serial_t *obj)
359368
{
360369
USART_TypeDef *uart = (USART_TypeDef *)(obj->uart);
@@ -367,6 +376,7 @@ void serial_putc(serial_t *obj, int c)
367376
USART_TypeDef *uart = (USART_TypeDef *)(obj->uart);
368377
while (!serial_writable(obj));
369378
uart->DR = (uint32_t)(c & 0xFF);
379+
while(!serial_TxComplete(obj));
370380
}
371381

372382
int serial_readable(serial_t *obj)
@@ -382,7 +392,7 @@ int serial_writable(serial_t *obj)
382392
{
383393
int status;
384394
UartHandle.Instance = (USART_TypeDef *)(obj->uart);
385-
// Check if data is transmitted
395+
// Check if data has moved to internal buffer
386396
status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TXE) != RESET) ? 1 : 0);
387397
return status;
388398
}

hal/targets/hal/TARGET_STM/TARGET_STM32L4/serial_api.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,15 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
423423
* READ/WRITE
424424
******************************************************************************/
425425

426+
int serial_TxComplete(serial_t *obj)
427+
{
428+
int status;
429+
UartHandle.Instance = (USART_TypeDef *)(obj->uart);
430+
// Check if data is transmitted
431+
status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TC) != RESET) ? 1 : 0);
432+
return status;
433+
}
434+
426435
int serial_getc(serial_t *obj)
427436
{
428437
USART_TypeDef *uart = (USART_TypeDef *)(obj->uart);
@@ -435,6 +444,7 @@ void serial_putc(serial_t *obj, int c)
435444
USART_TypeDef *uart = (USART_TypeDef *)(obj->uart);
436445
while (!serial_writable(obj));
437446
uart->TDR = (uint32_t)(c & (uint32_t)0xFF);
447+
while(!serial_TxComplete(obj));
438448
}
439449

440450
int serial_readable(serial_t *obj)
@@ -450,7 +460,7 @@ int serial_writable(serial_t *obj)
450460
{
451461
int status;
452462
UartHandle.Instance = (USART_TypeDef *)(obj->uart);
453-
// Check if data is transmitted
463+
// Check if data has moved to internal buffer
454464
status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TXE) != RESET) ? 1 : 0);
455465
return status;
456466
}

0 commit comments

Comments
 (0)