Skip to content

Commit 6dedab3

Browse files
authored
Merge pull request #11747 from espressif/uart_user_defined_clock_source
fix(uart): always applies the user selected UART Clock Source
2 parents 6952595 + 3f3e4a6 commit 6dedab3

File tree

1 file changed

+8
-19
lines changed

1 file changed

+8
-19
lines changed

cores/esp32/esp32-hal-uart.c

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ struct uart_struct_t {
5959
uint16_t _rx_buffer_size, _tx_buffer_size; // UART RX and TX buffer sizes
6060
bool _inverted; // UART inverted signal
6161
uint8_t _rxfifo_full_thrhd; // UART RX FIFO full threshold
62-
int8_t _uart_clock_source; // UART Clock Source used when it is started using uartBegin()
62+
int8_t _uart_clock_source; // UART Clock Source that should be used if user defines an specific one with setClockSource()
6363
};
6464

6565
#if CONFIG_DISABLE_HAL_LOCKS
@@ -820,7 +820,7 @@ uart_t *uartBegin(
820820
uart_config.baud_rate = baudrate;
821821
#if SOC_UART_LP_NUM >= 1
822822
if (uart_nr >= SOC_UART_HP_NUM) { // it is a LP UART NUM
823-
if (uart->_uart_clock_source > 0) {
823+
if (uart->_uart_clock_source >= 0) {
824824
uart_config.lp_source_clk = (soc_periph_lp_uart_clk_src_t)uart->_uart_clock_source; // use user defined LP UART clock
825825
log_v("Setting UART%d to user defined LP clock source (%d) ", uart_nr, uart->_uart_clock_source);
826826
} else {
@@ -881,14 +881,7 @@ uart_t *uartBegin(
881881
uart->_tx_buffer_size = tx_buffer_size;
882882
uart->has_peek = false;
883883
uart->peek_byte = 0;
884-
#if SOC_UART_LP_NUM >= 1
885-
if (uart_nr >= SOC_UART_HP_NUM) {
886-
uart->_uart_clock_source = uart_config.lp_source_clk;
887-
} else
888-
#endif
889-
{
890-
uart->_uart_clock_source = uart_config.source_clk;
891-
}
884+
// uart->_uart_clock_source can only change by explicit user API request/call
892885
}
893886
UART_MUTEX_UNLOCK();
894887

@@ -1149,10 +1142,9 @@ bool uartSetBaudRate(uart_t *uart, uint32_t baud_rate) {
11491142
}
11501143
bool retCode = true;
11511144
soc_module_clk_t newClkSrc = UART_SCLK_DEFAULT;
1152-
int8_t previousClkSrc = uart->_uart_clock_source;
11531145
#if SOC_UART_LP_NUM >= 1
11541146
if (uart->num >= SOC_UART_HP_NUM) { // it is a LP UART NUM
1155-
if (uart->_uart_clock_source > 0) {
1147+
if (uart->_uart_clock_source >= 0) {
11561148
newClkSrc = (soc_periph_lp_uart_clk_src_t)uart->_uart_clock_source; // use user defined LP UART clock
11571149
log_v("Setting UART%d to user defined LP clock source (%d) ", uart->num, newClkSrc);
11581150
} else {
@@ -1187,13 +1179,10 @@ bool uartSetBaudRate(uart_t *uart, uint32_t baud_rate) {
11871179
}
11881180
}
11891181
UART_MUTEX_LOCK();
1190-
// if necessary, set the correct UART Clock Source before changing the baudrate
1191-
if (previousClkSrc < 0 || previousClkSrc != newClkSrc) {
1192-
HP_UART_SRC_CLK_ATOMIC() {
1193-
uart_ll_set_sclk(UART_LL_GET_HW(uart->num), newClkSrc);
1194-
}
1195-
uart->_uart_clock_source = newClkSrc;
1182+
HP_UART_SRC_CLK_ATOMIC() {
1183+
uart_ll_set_sclk(UART_LL_GET_HW(uart->num), newClkSrc);
11961184
}
1185+
// uart->_uart_clock_source can only change by explicit user API request/call
11971186
if (uart_set_baudrate(uart->num, baud_rate) == ESP_OK) {
11981187
log_v("Setting UART%d baud rate to %ld.", uart->num, baud_rate);
11991188
uart->_baudrate = baud_rate;
@@ -1312,7 +1301,7 @@ bool uartSetClockSource(uint8_t uartNum, uart_sclk_t clkSrc) {
13121301
{
13131302
uart->_uart_clock_source = clkSrc;
13141303
}
1315-
//log_i("UART%d set clock source to %d", uart->num, uart->_uart_clock_source);
1304+
log_v("UART%d set clock source to %d", uart->num, uart->_uart_clock_source);
13161305
return true;
13171306
}
13181307

0 commit comments

Comments
 (0)