diff --git a/stmhal/boards/CERB40/mpconfigboard.h b/stmhal/boards/CERB40/mpconfigboard.h index dfff5c9716..71844d06f1 100644 --- a/stmhal/boards/CERB40/mpconfigboard.h +++ b/stmhal/boards/CERB40/mpconfigboard.h @@ -38,6 +38,10 @@ #define MICROPY_HW_UART3_CTS (GPIO_PIN_11) #define MICROPY_HW_UART4_PORT (GPIOA) #define MICROPY_HW_UART4_PINS (GPIO_PIN_0 | GPIO_PIN_1) +#define MICROPY_HW_UART5_TX_PORT (GPIOC) +#define MICROPY_HW_UART5_TX_PIN (GPIO_PIN_12) +#define MICROPY_HW_UART5_RX_PORT (GPIOD) +#define MICROPY_HW_UART5_RX_PIN (GPIO_PIN_2) #define MICROPY_HW_UART6_PORT (GPIOC) #define MICROPY_HW_UART6_PINS (GPIO_PIN_6 | GPIO_PIN_7) diff --git a/stmhal/stm32f4xx_it.c b/stmhal/stm32f4xx_it.c index 3db2019cbf..26c914da62 100644 --- a/stmhal/stm32f4xx_it.c +++ b/stmhal/stm32f4xx_it.c @@ -413,6 +413,10 @@ void UART4_IRQHandler(void) { uart_irq_handler(4); } +void UART5_IRQHandler(void) { + uart_irq_handler(5); +} + void USART6_IRQHandler(void) { uart_irq_handler(6); } diff --git a/stmhal/uart.c b/stmhal/uart.c index e1357b1f64..70b7390c0a 100644 --- a/stmhal/uart.c +++ b/stmhal/uart.c @@ -185,6 +185,31 @@ STATIC bool uart_init2(pyb_uart_obj_t *uart_obj) { break; #endif + #if defined(UART5) && \ + defined(MICROPY_HW_UART5_TX_PORT) && \ + defined(MICROPY_HW_UART5_TX_PIN) && \ + defined(MICROPY_HW_UART5_RX_PORT) && \ + defined(MICROPY_HW_UART5_RX_PIN) + case PYB_UART_5: + UARTx = UART5; + irqn = UART5_IRQn; + GPIO_AF_UARTx = GPIO_AF8_UART5; + GPIO_Port = MICROPY_HW_UART5_TX_PORT; + GPIO_Pin = MICROPY_HW_UART5_TX_PIN; + __UART5_CLK_ENABLE(); + + // The code after the case only deals with the case where the TX & RX + // pins are on the same port. UART5 has them on different ports. + GPIO_InitTypeDef GPIO_InitStructure; + GPIO_InitStructure.Pin = MICROPY_HW_UART5_RX_PIN; + GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; + GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; + GPIO_InitStructure.Pull = GPIO_PULLUP; + GPIO_InitStructure.Alternate = GPIO_AF_UARTx; + HAL_GPIO_Init(MICROPY_HW_UART5_RX_PORT, &GPIO_InitStructure); + break; + #endif + #if defined(MICROPY_HW_UART6_PORT) && defined(MICROPY_HW_UART6_PINS) // USART6 is on PC6/PC7 (CK on PC8) case PYB_UART_6: @@ -596,6 +621,13 @@ STATIC mp_obj_t pyb_uart_deinit(mp_obj_t self_in) { __UART4_RELEASE_RESET(); __UART4_CLK_DISABLE(); #endif + #if defined(UART5) + } else if (uart->Instance == UART5) { + HAL_NVIC_DisableIRQ(UART5_IRQn); + __UART5_FORCE_RESET(); + __UART5_RELEASE_RESET(); + __UART5_CLK_DISABLE(); + #endif } else if (uart->Instance == USART6) { HAL_NVIC_DisableIRQ(USART6_IRQn); __USART6_FORCE_RESET();