From 8c335fdcf7f69ab374a985a9e2d26cdf0be3533e Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Wed, 10 Jul 2019 08:43:29 +0000 Subject: [PATCH] UART driver now compiles on G0. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@12893 27425a3e-05d8-49a3-a47f-9c15f0e5edd8 --- .../RT-STM32G071RB-NUCLEO64/cfg/halconf.h | 2 +- .../RT-STM32G071RB-NUCLEO64/cfg/mcuconf.h | 6 +- os/hal/ports/STM32/LLD/USARTv2/hal_uart_lld.c | 84 +++++++++---------- os/hal/ports/STM32/LLD/USARTv2/hal_uart_lld.h | 1 + os/hal/ports/STM32/STM32G0xx/stm32_dmamux.h | 2 + 5 files changed, 49 insertions(+), 46 deletions(-) diff --git a/demos/STM32/RT-STM32G071RB-NUCLEO64/cfg/halconf.h b/demos/STM32/RT-STM32G071RB-NUCLEO64/cfg/halconf.h index 757d5a99b..b3732bcd2 100644 --- a/demos/STM32/RT-STM32G071RB-NUCLEO64/cfg/halconf.h +++ b/demos/STM32/RT-STM32G071RB-NUCLEO64/cfg/halconf.h @@ -177,7 +177,7 @@ * @brief Enables the UART subsystem. */ #if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE +#define HAL_USE_UART TRUE #endif /** diff --git a/demos/STM32/RT-STM32G071RB-NUCLEO64/cfg/mcuconf.h b/demos/STM32/RT-STM32G071RB-NUCLEO64/cfg/mcuconf.h index 1c32c8859..8c15be8a2 100644 --- a/demos/STM32/RT-STM32G071RB-NUCLEO64/cfg/mcuconf.h +++ b/demos/STM32/RT-STM32G071RB-NUCLEO64/cfg/mcuconf.h @@ -181,10 +181,10 @@ /* * UART driver system settings. */ -#define STM32_UART_USE_USART1 FALSE +#define STM32_UART_USE_USART1 TRUE #define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_UART4 FALSE +#define STM32_UART_USE_USART3 TRUE +#define STM32_UART_USE_UART4 TRUE #define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID_ANY #define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID_ANY #define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID_ANY diff --git a/os/hal/ports/STM32/LLD/USARTv2/hal_uart_lld.c b/os/hal/ports/STM32/LLD/USARTv2/hal_uart_lld.c index e16b7f8dd..038bdb967 100644 --- a/os/hal/ports/STM32/LLD/USARTv2/hal_uart_lld.c +++ b/os/hal/ports/STM32/LLD/USARTv2/hal_uart_lld.c @@ -348,40 +348,6 @@ static void uart_lld_serve_tx_end_irq(UARTDriver *uartp, uint32_t flags) { _uart_tx1_isr_code(uartp); } -/** - * @brief USART common service routine. - * - * @param[in] uartp pointer to the @p UARTDriver object - */ -static void serve_usart_irq(UARTDriver *uartp) { - uint32_t isr; - USART_TypeDef *u = uartp->usart; - uint32_t cr1 = u->CR1; - - /* Reading and clearing status.*/ - isr = u->ISR; - u->ICR = isr; - - if (isr & (USART_ISR_LBDF | USART_ISR_ORE | USART_ISR_NE | - USART_ISR_FE | USART_ISR_PE)) { - _uart_rx_error_isr_code(uartp, translate_errors(isr)); - } - - if ((isr & USART_ISR_TC) && (cr1 & USART_CR1_TCIE)) { - /* TC interrupt disabled.*/ - u->CR1 = cr1 & ~USART_CR1_TCIE; - - /* End of transmission, a callback is generated.*/ - _uart_tx2_isr_code(uartp); - } - - /* Timeout interrupt sources are only checked if enabled in CR1.*/ - if (((cr1 & USART_CR1_IDLEIE) && (isr & USART_ISR_IDLE)) || - ((cr1 & USART_CR1_RTOIE) && (isr & USART_ISR_RTOF))) { - _uart_timeout_isr_code(uartp); - } -} - /*===========================================================================*/ /* Driver interrupt handlers. */ /*===========================================================================*/ @@ -400,7 +366,7 @@ OSAL_IRQ_HANDLER(STM32_USART1_HANDLER) { OSAL_IRQ_PROLOGUE(); - serve_usart_irq(&UARTD1); + uart_lld_serve_interrupt(&UARTD1); OSAL_IRQ_EPILOGUE(); } @@ -421,7 +387,7 @@ OSAL_IRQ_HANDLER(STM32_USART2_HANDLER) { OSAL_IRQ_PROLOGUE(); - serve_usart_irq(&UARTD2); + uart_lld_serve_interrupt(&UARTD2); OSAL_IRQ_EPILOGUE(); } @@ -442,7 +408,7 @@ OSAL_IRQ_HANDLER(STM32_USART3_HANDLER) { OSAL_IRQ_PROLOGUE(); - serve_usart_irq(&UARTD3); + uart_lld_serve_interrupt(&UARTD3); OSAL_IRQ_EPILOGUE(); } @@ -463,7 +429,7 @@ OSAL_IRQ_HANDLER(STM32_UART4_HANDLER) { OSAL_IRQ_PROLOGUE(); - serve_usart_irq(&UARTD4); + uart_lld_serve_interrupt(&UARTD4); OSAL_IRQ_EPILOGUE(); } @@ -484,7 +450,7 @@ OSAL_IRQ_HANDLER(STM32_UART5_HANDLER) { OSAL_IRQ_PROLOGUE(); - serve_usart_irq(&UARTD5); + uart_lld_serve_interrupt(&UARTD5); OSAL_IRQ_EPILOGUE(); } @@ -505,7 +471,7 @@ OSAL_IRQ_HANDLER(STM32_USART6_HANDLER) { OSAL_IRQ_PROLOGUE(); - serve_usart_irq(&UARTD6); + uart_lld_serve_interrupt(&UARTD6); OSAL_IRQ_EPILOGUE(); } @@ -526,7 +492,7 @@ OSAL_IRQ_HANDLER(STM32_UART7_HANDLER) { OSAL_IRQ_PROLOGUE(); - serve_usart_irq(&UARTD7); + uart_lld_serve_interrupt(&UARTD7); OSAL_IRQ_EPILOGUE(); } @@ -547,7 +513,7 @@ OSAL_IRQ_HANDLER(STM32_UART8_HANDLER) { OSAL_IRQ_PROLOGUE(); - serve_usart_irq(&UARTD8); + uart_lld_serve_interrupt(&UARTD8); OSAL_IRQ_EPILOGUE(); } @@ -1044,6 +1010,40 @@ size_t uart_lld_stop_receive(UARTDriver *uartp) { return n; } +/** + * @brief USART common service routine. + * + * @param[in] uartp pointer to the @p UARTDriver object + */ +void uart_lld_serve_interrupt(UARTDriver *uartp) { + uint32_t isr; + USART_TypeDef *u = uartp->usart; + uint32_t cr1 = u->CR1; + + /* Reading and clearing status.*/ + isr = u->ISR; + u->ICR = isr; + + if (isr & (USART_ISR_LBDF | USART_ISR_ORE | USART_ISR_NE | + USART_ISR_FE | USART_ISR_PE)) { + _uart_rx_error_isr_code(uartp, translate_errors(isr)); + } + + if ((isr & USART_ISR_TC) && (cr1 & USART_CR1_TCIE)) { + /* TC interrupt disabled.*/ + u->CR1 = cr1 & ~USART_CR1_TCIE; + + /* End of transmission, a callback is generated.*/ + _uart_tx2_isr_code(uartp); + } + + /* Timeout interrupt sources are only checked if enabled in CR1.*/ + if (((cr1 & USART_CR1_IDLEIE) && (isr & USART_ISR_IDLE)) || + ((cr1 & USART_CR1_RTOIE) && (isr & USART_ISR_RTOF))) { + _uart_timeout_isr_code(uartp); + } +} + #endif /* HAL_USE_UART */ /** @} */ diff --git a/os/hal/ports/STM32/LLD/USARTv2/hal_uart_lld.h b/os/hal/ports/STM32/LLD/USARTv2/hal_uart_lld.h index a734068ff..6e4c17299 100644 --- a/os/hal/ports/STM32/LLD/USARTv2/hal_uart_lld.h +++ b/os/hal/ports/STM32/LLD/USARTv2/hal_uart_lld.h @@ -826,6 +826,7 @@ extern "C" { size_t uart_lld_stop_send(UARTDriver *uartp); void uart_lld_start_receive(UARTDriver *uartp, size_t n, void *rxbuf); size_t uart_lld_stop_receive(UARTDriver *uartp); + void uart_lld_serve_interrupt(UARTDriver *uartp); #ifdef __cplusplus } #endif diff --git a/os/hal/ports/STM32/STM32G0xx/stm32_dmamux.h b/os/hal/ports/STM32/STM32G0xx/stm32_dmamux.h index a18049512..fdccb6d0b 100644 --- a/os/hal/ports/STM32/STM32G0xx/stm32_dmamux.h +++ b/os/hal/ports/STM32/STM32G0xx/stm32_dmamux.h @@ -90,6 +90,8 @@ #define STM32_DMAMUX1_USART3_TX 55 #define STM32_DMAMUX1_USART4_RX 56 #define STM32_DMAMUX1_USART4_TX 57 +#define STM32_DMAMUX1_UART4_RX STM32_DMAMUX1_USART4_RX /* Legacy. */ +#define STM32_DMAMUX1_UART4_TX STM32_DMAMUX1_USART4_TX /* Legacy. */ #define STM32_DMAMUX1_UCPD1_RX 58 #define STM32_DMAMUX1_UCPD1_TX 59 #define STM32_DMAMUX1_UCPD2_RX 60