diff --git a/machine/arm/stm32l4xx/interface/uart.c b/machine/arm/stm32l4xx/interface/uart.c index abf4621..34e42f5 100644 --- a/machine/arm/stm32l4xx/interface/uart.c +++ b/machine/arm/stm32l4xx/interface/uart.c @@ -33,52 +33,80 @@ int write_debug_uart(const char *buf, int len) { } void HAL_UART_MspInit(UART_HandleTypeDef *huart) { - if (huart->Instance == LPUART1) { - - RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; - PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_LPUART1; - PeriphClkInit.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1; - - if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) { - return; - } - - __HAL_RCC_LPUART1_CLK_ENABLE(); + RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; + GPIO_InitTypeDef GPIO_InitStruct = {0}; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + + if (huart->Instance == USART1) { + // TX: PA9 (AF7), RX: PA10 (AF7) + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1; + PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) return; + __HAL_RCC_USART1_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + GPIO_InitStruct.Alternate = GPIO_AF7_USART1; + GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + } else if (huart->Instance == USART2) { + // TX: PA2 (AF7), RX: PA3 (AF7) + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2; + PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) return; + __HAL_RCC_USART2_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + GPIO_InitStruct.Alternate = GPIO_AF7_USART2; + GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + } else if (huart->Instance == USART3) { + // TX: PC10 (AF7), RX: PC11 (AF7) + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART3; + PeriphClkInit.Usart3ClockSelection = RCC_USART3CLKSOURCE_PCLK1; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) return; + __HAL_RCC_USART3_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_ENABLE(); + GPIO_InitStruct.Alternate = GPIO_AF7_USART3; + GPIO_InitStruct.Pin = GPIO_PIN_10 | GPIO_PIN_11; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - GPIO_InitTypeDef GPIO_InitStruct = {0}; - GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7; // LPUART1_TX, LPUART1_RX - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF8_LPUART1; + } else if (huart->Instance == UART4) { + // TX: PA0 (AF8), RX: PA1 (AF8) + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_UART4; + PeriphClkInit.Uart4ClockSelection = RCC_UART4CLKSOURCE_PCLK1; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) return; + __HAL_RCC_UART4_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + GPIO_InitStruct.Alternate = GPIO_AF8_UART4; + GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - HAL_PWREx_EnableVddIO2(); - __HAL_RCC_GPIOG_CLK_ENABLE(); - HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); } else if (huart->Instance == UART5) { - - RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; + // TX: PC12 (AF8), RX: PD2 (AF8) PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_UART5; PeriphClkInit.Uart5ClockSelection = RCC_UART5CLKSOURCE_PCLK1; - if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) { - return; - } - + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) return; __HAL_RCC_UART5_CLK_ENABLE(); - - // Enable GPIO clocks - HAL_PWREx_EnableVddIO2(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - GPIO_InitStruct.Pin = GPIO_PIN_12; // PC12 == UART5_TX - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF8_UART5; + GPIO_InitStruct.Pin = GPIO_PIN_12; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - // PD2 == UART5_RX GPIO_InitStruct.Pin = GPIO_PIN_2; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + + } else if (huart->Instance == LPUART1) { + // TX: PG7 (AF8), RX: PG8 (AF8) + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_LPUART1; + PeriphClkInit.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) return; + __HAL_RCC_LPUART1_CLK_ENABLE(); + HAL_PWREx_EnableVddIO2(); + __HAL_RCC_GPIOG_CLK_ENABLE(); + GPIO_InitStruct.Alternate = GPIO_AF8_LPUART1; + GPIO_InitStruct.Pin = GPIO_PIN_7 | GPIO_PIN_8; + HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); } } diff --git a/options.toml b/options.toml index 985e288..58f3392 100644 --- a/options.toml +++ b/options.toml @@ -13,7 +13,7 @@ type = "Boolean" [debug.uart] name = "Debug UART" description = "Select the UART peripheral to use for debug output." -type = { type = "String", allowed_values = ["LPUART1", "UART5"] } +type = { type = "String", allowed_values = ["USART1", "USART2", "USART3", "UART4", "UART5", "LPUART1"] } default = "LPUART1" [tuning]