From 94966297ecdd34ca2b616f824e726e5a283df475 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Fri, 17 Dec 2021 20:45:57 -0300 Subject: [PATCH 1/2] Fixes baudrate with CPU Freq < 80MHz --- 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 b76d02f18f8..55b15256d9d 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 = getCpuFrequencyMhz(); + 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(); } From 4024202270ec18e1e7d8f2150ae63f884e785f6f Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Mon, 20 Dec 2021 16:07:39 -0300 Subject: [PATCH 2/2] Fixes baudrate with CPU Freq < 80MHz --- cores/esp32/esp32-hal-uart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/esp32/esp32-hal-uart.c b/cores/esp32/esp32-hal-uart.c index 55b15256d9d..c34c54b1a25 100644 --- a/cores/esp32/esp32-hal-uart.c +++ b/cores/esp32/esp32-hal-uart.c @@ -73,7 +73,7 @@ static uart_t _uart_bus_array[] = { // baudrate must be multiplied when CPU Frequency is lower than APB 80MHz uint32_t _get_effective_baudrate(uint32_t baudrate) { - uint32_t Freq = getCpuFrequencyMhz(); + uint32_t Freq = getApbFrequency()/1000000; if (Freq < 80) { return 80 / Freq * baudrate; }