Skip to content

Commit c3d41c9

Browse files
authored
Fixes baudrate with CPU Freq < 80MHz (#6037)
This PR fixes an issue with UART when CPUFreq is lower than 80MHz (APB Freq)
1 parent d6934a5 commit c3d41c9

File tree

1 file changed

+15
-2
lines changed

1 file changed

+15
-2
lines changed

Diff for: cores/esp32/esp32-hal-uart.c

+15-2
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,19 @@ static uart_t _uart_bus_array[] = {
6969

7070
#endif
7171

72+
// solves issue https://github.com/espressif/arduino-esp32/issues/6032
73+
// baudrate must be multiplied when CPU Frequency is lower than APB 80MHz
74+
uint32_t _get_effective_baudrate(uint32_t baudrate)
75+
{
76+
uint32_t Freq = getApbFrequency()/1000000;
77+
if (Freq < 80) {
78+
return 80 / Freq * baudrate;
79+
}
80+
else {
81+
return baudrate;
82+
}
83+
}
84+
7285
bool uartIsDriverInstalled(uart_t* uart)
7386
{
7487
if(uart == NULL) {
@@ -121,7 +134,7 @@ uart_t* uartBegin(uint8_t uart_nr, uint32_t baudrate, uint32_t config, int8_t rx
121134
UART_MUTEX_LOCK();
122135

123136
uart_config_t uart_config;
124-
uart_config.baud_rate = baudrate;
137+
uart_config.baud_rate = _get_effective_baudrate(baudrate);
125138
uart_config.data_bits = (config & 0xc) >> 2;
126139
uart_config.parity = (config & 0x3);
127140
uart_config.stop_bits = (config & 0x30) >> 4;
@@ -307,7 +320,7 @@ void uartSetBaudRate(uart_t* uart, uint32_t baud_rate)
307320
return;
308321
}
309322
UART_MUTEX_LOCK();
310-
uart_ll_set_baudrate(UART_LL_GET_HW(uart->num), baud_rate);
323+
uart_ll_set_baudrate(UART_LL_GET_HW(uart->num), _get_effective_baudrate(baud_rate));
311324
UART_MUTEX_UNLOCK();
312325
}
313326

0 commit comments

Comments
 (0)