From fef21144047201d639b2692e3a55083c7180cb29 Mon Sep 17 00:00:00 2001 From: Damien George Date: Mon, 26 Jul 2021 13:03:42 +1000 Subject: [PATCH] stm32/uart: Fix LPUART1 baudrate set/get. It needs to use a different function because the formula to compute the baudrate on LPUART1 is different to a normal UART. Fixes issue #7466. Signed-off-by: Damien George --- ports/stm32/boards/stm32h7xx_hal_conf_base.h | 1 + ports/stm32/boards/stm32l0xx_hal_conf_base.h | 1 + ports/stm32/boards/stm32l4xx_hal_conf_base.h | 1 + ports/stm32/boards/stm32wbxx_hal_conf_base.h | 1 + ports/stm32/uart.c | 19 +++++++++++++++++++ 5 files changed, 23 insertions(+) diff --git a/ports/stm32/boards/stm32h7xx_hal_conf_base.h b/ports/stm32/boards/stm32h7xx_hal_conf_base.h index c07ae93e37..08928ed593 100644 --- a/ports/stm32/boards/stm32h7xx_hal_conf_base.h +++ b/ports/stm32/boards/stm32h7xx_hal_conf_base.h @@ -54,6 +54,7 @@ #include "stm32h7xx_hal_usart.h" #include "stm32h7xx_hal_wwdg.h" #include "stm32h7xx_ll_adc.h" +#include "stm32h7xx_ll_lpuart.h" #include "stm32h7xx_ll_pwr.h" #include "stm32h7xx_ll_rtc.h" #include "stm32h7xx_ll_usart.h" diff --git a/ports/stm32/boards/stm32l0xx_hal_conf_base.h b/ports/stm32/boards/stm32l0xx_hal_conf_base.h index cc033666af..7b569907e8 100644 --- a/ports/stm32/boards/stm32l0xx_hal_conf_base.h +++ b/ports/stm32/boards/stm32l0xx_hal_conf_base.h @@ -47,6 +47,7 @@ #include "stm32l0xx_hal_usart.h" #include "stm32l0xx_hal_wwdg.h" #include "stm32l0xx_ll_adc.h" +#include "stm32l0xx_ll_lpuart.h" #include "stm32l0xx_ll_rtc.h" #include "stm32l0xx_ll_usart.h" diff --git a/ports/stm32/boards/stm32l4xx_hal_conf_base.h b/ports/stm32/boards/stm32l4xx_hal_conf_base.h index 8d77a80a70..4f3a78d509 100644 --- a/ports/stm32/boards/stm32l4xx_hal_conf_base.h +++ b/ports/stm32/boards/stm32l4xx_hal_conf_base.h @@ -51,6 +51,7 @@ #include "stm32l4xx_hal_usart.h" #include "stm32l4xx_hal_wwdg.h" #include "stm32l4xx_ll_adc.h" +#include "stm32l4xx_ll_lpuart.h" #include "stm32l4xx_ll_rtc.h" #include "stm32l4xx_ll_usart.h" diff --git a/ports/stm32/boards/stm32wbxx_hal_conf_base.h b/ports/stm32/boards/stm32wbxx_hal_conf_base.h index 72af0262a2..b03ad26864 100644 --- a/ports/stm32/boards/stm32wbxx_hal_conf_base.h +++ b/ports/stm32/boards/stm32wbxx_hal_conf_base.h @@ -42,6 +42,7 @@ #include "stm32wbxx_hal_uart.h" #include "stm32wbxx_hal_usart.h" #include "stm32wbxx_ll_adc.h" +#include "stm32wbxx_ll_lpuart.h" #include "stm32wbxx_ll_rtc.h" #include "stm32wbxx_ll_usart.h" diff --git a/ports/stm32/uart.c b/ports/stm32/uart.c index b15be85336..002b1f168d 100644 --- a/ports/stm32/uart.c +++ b/ports/stm32/uart.c @@ -746,6 +746,15 @@ uint32_t uart_get_source_freq(pyb_uart_obj_t *self) { } uint32_t uart_get_baudrate(pyb_uart_obj_t *self) { + #if defined(LPUART1) + if (self->uart_id == PYB_LPUART_1) { + return LL_LPUART_GetBaudRate(self->uartx, uart_get_source_freq(self) + #if defined(STM32H7) || defined(STM32WB) + , self->uartx->PRESC + #endif + ); + } + #endif return LL_USART_GetBaudRate(self->uartx, uart_get_source_freq(self), #if defined(STM32H7) || defined(STM32WB) self->uartx->PRESC, @@ -754,6 +763,16 @@ uint32_t uart_get_baudrate(pyb_uart_obj_t *self) { } void uart_set_baudrate(pyb_uart_obj_t *self, uint32_t baudrate) { + #if defined(LPUART1) + if (self->uart_id == PYB_LPUART_1) { + LL_LPUART_SetBaudRate(self->uartx, uart_get_source_freq(self), + #if defined(STM32H7) || defined(STM32WB) + LL_LPUART_PRESCALER_DIV1, + #endif + baudrate); + return; + } + #endif LL_USART_SetBaudRate(self->uartx, uart_get_source_freq(self), #if defined(STM32H7) || defined(STM32WB) LL_USART_PRESCALER_DIV1,