From c3d41c9b54261265966717331960aabcf4848e23 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Tue, 21 Dec 2021 05:10:31 -0300 Subject: [PATCH] Fixes baudrate with CPU Freq < 80MHz (#6037) This PR fixes an issue with UART when CPUFreq is lower than 80MHz (APB Freq) --- cores/esp32/esp32-hal-uart.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/cores/esp32/esp32-hal-uart.c b/cores/esp32/esp32-hal-uart.c index b76d02f18..c34c54b1a 100644 --- a/cores/esp32/esp32-hal-uart.c +++ b/cores/esp32/esp32-hal-uart.c @@ -69,6 +69,19 @@ static uart_t _uart_bus_array[] = { #endif +// solves issue https://github.com/espressif/arduino-esp32/issues/6032 +// baudrate must be multiplied when CPU Frequency is lower than APB 80MHz +uint32_t _get_effective_baudrate(uint32_t baudrate) +{ + uint32_t Freq = getApbFrequency()/1000000; + if (Freq < 80) { + return 80 / Freq * baudrate; + } + else { + return baudrate; + } +} + bool uartIsDriverInstalled(uart_t* uart) { if(uart == NULL) { @@ -121,7 +134,7 @@ uart_t* uartBegin(uint8_t uart_nr, uint32_t baudrate, uint32_t config, int8_t rx UART_MUTEX_LOCK(); uart_config_t uart_config; - uart_config.baud_rate = baudrate; + uart_config.baud_rate = _get_effective_baudrate(baudrate); uart_config.data_bits = (config & 0xc) >> 2; uart_config.parity = (config & 0x3); uart_config.stop_bits = (config & 0x30) >> 4; @@ -307,7 +320,7 @@ void uartSetBaudRate(uart_t* uart, uint32_t baud_rate) return; } UART_MUTEX_LOCK(); - uart_ll_set_baudrate(UART_LL_GET_HW(uart->num), baud_rate); + uart_ll_set_baudrate(UART_LL_GET_HW(uart->num), _get_effective_baudrate(baud_rate)); UART_MUTEX_UNLOCK(); } -- GitLab