stm32/uart: Fix UART timeout issue with low baudrate on G4 MCUs.
With using UART FIFO, the timeout should be long enough that FIFO becomes empty. Since previous data transfer may be ongoing, the timeout must be timeout_char multiplied by FIFO size + 1. Signed-off-by: Yuuki NAGAO <wf.yn386@gmail.com>
This commit is contained in:
parent
a175f98a65
commit
141750ff79
|
@ -1052,12 +1052,20 @@ size_t uart_tx_data(pyb_uart_obj_t *self, const void *src_in, size_t num_chars,
|
|||
// the overall timeout rather than the character timeout.
|
||||
timeout = self->timeout;
|
||||
} else {
|
||||
#if defined(STM32G4)
|
||||
// With using UART FIFO, the timeout should be long enough that FIFO becomes empty.
|
||||
// Since previous data transfer may be ongoing, the timeout must be multiplied
|
||||
// timeout_char by FIFO size + 1.
|
||||
// STM32G4 has 8 words FIFO.
|
||||
timeout = (8 + 1) * self->timeout_char;
|
||||
#else
|
||||
// The timeout specified here is for waiting for the TX data register to
|
||||
// become empty (ie between chars), as well as for the final char to be
|
||||
// completely transferred. The default value for timeout_char is long
|
||||
// enough for 1 char, but we need to double it to wait for the last char
|
||||
// to be transferred to the data register, and then to be transmitted.
|
||||
timeout = 2 * self->timeout_char;
|
||||
#endif
|
||||
}
|
||||
|
||||
const uint8_t *src = (const uint8_t *)src_in;
|
||||
|
|
Loading…
Reference in New Issue