diff options
author | Damien George <damien.p.george@gmail.com> | 2016-12-05 15:14:22 +1100 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2016-12-05 15:14:22 +1100 |
commit | aaab6a9921a9a874d9a974ecc5c3639002dc286b (patch) | |
tree | c8f75580a1221ae985834a87fa83a122a583b07c /stmhal/uart.c | |
parent | 27a503f63284a1751f20d7f5295690fec5e1c462 (diff) | |
download | micropython-aaab6a9921a9a874d9a974ecc5c3639002dc286b.tar.gz micropython-aaab6a9921a9a874d9a974ecc5c3639002dc286b.zip |
stmhal/uart: Add support for UART7 and UART8 on F7 MCUs.
Diffstat (limited to 'stmhal/uart.c')
-rw-r--r-- | stmhal/uart.c | 53 |
1 files changed, 50 insertions, 3 deletions
diff --git a/stmhal/uart.c b/stmhal/uart.c index ec40592a2d..93956f567f 100644 --- a/stmhal/uart.c +++ b/stmhal/uart.c @@ -37,8 +37,6 @@ #include "irq.h" #include "genhdr/pins.h" -//TODO: Add UART7/8 support for MCU_SERIES_F7 - /// \moduleref pyb /// \class UART - duplex serial communication bus /// @@ -206,6 +204,28 @@ STATIC bool uart_init2(pyb_uart_obj_t *uart_obj) { break; #endif + #if defined(MICROPY_HW_UART7_TX) && defined(MICROPY_HW_UART7_RX) + case PYB_UART_7: + uart_unit = 7; + UARTx = UART7; + irqn = UART7_IRQn; + pins[0] = &MICROPY_HW_UART7_TX; + pins[1] = &MICROPY_HW_UART7_RX; + __UART7_CLK_ENABLE(); + break; + #endif + + #if defined(MICROPY_HW_UART8_TX) && defined(MICROPY_HW_UART8_RX) + case PYB_UART_8: + uart_unit = 8; + UARTx = UART8; + irqn = UART8_IRQn; + pins[0] = &MICROPY_HW_UART8_TX; + pins[1] = &MICROPY_HW_UART8_RX; + __UART8_CLK_ENABLE(); + break; + #endif + default: // UART does not exist or is not configured for this board return false; @@ -537,7 +557,19 @@ STATIC mp_obj_t pyb_uart_init_helper(pyb_uart_obj_t *self, mp_uint_t n_args, con // compute actual baudrate that was configured // (this formula assumes UART_OVERSAMPLING_16) - uint32_t actual_baudrate; + uint32_t actual_baudrate = 0; + #if defined(MCU_SERIES_F7) + UART_ClockSourceTypeDef clocksource = UART_CLOCKSOURCE_UNDEFINED; + UART_GETCLOCKSOURCE(&self->uart, clocksource); + switch (clocksource) { + case UART_CLOCKSOURCE_PCLK1: actual_baudrate = HAL_RCC_GetPCLK1Freq(); break; + case UART_CLOCKSOURCE_PCLK2: actual_baudrate = HAL_RCC_GetPCLK2Freq(); break; + case UART_CLOCKSOURCE_HSI: actual_baudrate = HSI_VALUE; break; + case UART_CLOCKSOURCE_SYSCLK: actual_baudrate = HAL_RCC_GetSysClockFreq(); break; + case UART_CLOCKSOURCE_LSE: actual_baudrate = LSE_VALUE; break; + case UART_CLOCKSOURCE_UNDEFINED: break; + } + #else if (self->uart.Instance == USART1 #if defined(USART6) || self->uart.Instance == USART6 @@ -547,6 +579,7 @@ STATIC mp_obj_t pyb_uart_init_helper(pyb_uart_obj_t *self, mp_uint_t n_args, con } else { actual_baudrate = HAL_RCC_GetPCLK1Freq(); } + #endif actual_baudrate /= self->uart.Instance->BRR; // check we could set the baudrate within 5% @@ -694,6 +727,20 @@ STATIC mp_obj_t pyb_uart_deinit(mp_obj_t self_in) { __USART6_RELEASE_RESET(); __USART6_CLK_DISABLE(); #endif + #if defined(UART7) + } else if (uart->Instance == UART7) { + HAL_NVIC_DisableIRQ(UART7_IRQn); + __UART7_FORCE_RESET(); + __UART7_RELEASE_RESET(); + __UART7_CLK_DISABLE(); + #endif + #if defined(UART8) + } else if (uart->Instance == UART8) { + HAL_NVIC_DisableIRQ(UART8_IRQn); + __UART8_FORCE_RESET(); + __UART8_RELEASE_RESET(); + __UART8_CLK_DISABLE(); + #endif } return mp_const_none; } |