diff --git a/cpu/stm32/include/periph_cpu.h b/cpu/stm32/include/periph_cpu.h index e1fbf50f9d..817ddfdd44 100644 --- a/cpu/stm32/include/periph_cpu.h +++ b/cpu/stm32/include/periph_cpu.h @@ -684,7 +684,7 @@ typedef struct { #endif #if defined(CPU_FAM_STM32L0) || defined(CPU_FAM_STM32L4) || \ defined(CPU_FAM_STM32WB) || defined(CPU_FAM_STM32G4) || \ - defined(CPU_FAM_STM32L5) + defined(CPU_FAM_STM32L5) || defined(CPU_FAM_STM32MP1) uart_type_t type; /**< hardware module type (USART or LPUART) */ uint32_t clk_src; /**< clock source used for UART */ #endif diff --git a/cpu/stm32/periph/uart.c b/cpu/stm32/periph/uart.c index 2dadad0fb0..afc7821367 100644 --- a/cpu/stm32/periph/uart.c +++ b/cpu/stm32/periph/uart.c @@ -45,7 +45,7 @@ #elif defined(CPU_FAM_STM32F0) || defined(CPU_FAM_STM32L0) || \ defined(CPU_FAM_STM32F3) || defined(CPU_FAM_STM32L4) || \ defined(CPU_FAM_STM32WB) || defined(CPU_FAM_STM32F7) || \ - defined(CPU_FAM_STM32G4) + defined(CPU_FAM_STM32G4) || defined(CPU_FAM_STM32MP1) #define ISR_REG ISR #define ISR_TXE USART_ISR_TXE #define ISR_RXNE USART_ISR_RXNE @@ -297,7 +297,24 @@ static inline void uart_init_usart(uart_t uart, uint32_t baudrate) uint32_t clk; /* calculate and apply baudrate */ +#ifdef CPU_FAM_STM32MP1 + RCC->UART35CKSELR = uart_config[uart].clk_src; + + switch (uart_config[uart].clk_src) { + case RCC_UART35CKSELR_UART35SRC_2: /* HSI */ + clk = CLOCK_HSI; + break; + case RCC_UART35CKSELR_UART35SRC_4: /* HSE */ + clk = CLOCK_HSE; + break; + default: /* return */ + return; + } + + clk /= baudrate; +#else clk = periph_apb_clk(uart_config[uart].bus) / baudrate; +#endif mantissa = (uint16_t)(clk / 16); fraction = (uint8_t)(clk - (mantissa * 16)); dev(uart)->BRR = ((mantissa & 0x0fff) << 4) | (fraction & 0x0f);