From ff72647486d309683d3dc9a39921399cd5096245 Mon Sep 17 00:00:00 2001 From: jflyper Date: Wed, 18 Sep 2019 05:44:51 +0900 Subject: [PATCH] UART buffers for F4 should not be in CCM DATA RAM for DMA to work --- src/main/drivers/serial_uart_impl.h | 5 +- src/main/drivers/serial_uart_stm32f4xx.c | 74 ++++++++++++++++++++---- 2 files changed, 67 insertions(+), 12 deletions(-) diff --git a/src/main/drivers/serial_uart_impl.h b/src/main/drivers/serial_uart_impl.h index 2803809a4..f1ff2fc44 100644 --- a/src/main/drivers/serial_uart_impl.h +++ b/src/main/drivers/serial_uart_impl.h @@ -170,7 +170,7 @@ typedef struct uartHardware_s { uint8_t txPriority; uint8_t rxPriority; -#ifdef STM32H7 +#if defined(STM32H7) || defined(STM32F4) volatile uint8_t *txBuffer; volatile uint8_t *rxBuffer; uint16_t txBufferSize; @@ -188,8 +188,9 @@ typedef struct uartDevice_s { const uartHardware_t *hardware; uartPinDef_t rx; uartPinDef_t tx; -#ifdef STM32H7 +#if defined(STM32H7) || defined(STM32F4) // For H7, buffers with possible DMA access is placed in D2 SRAM. + // For F4, buffers should NOT be in CCM DATA RAM (uartDevice is). volatile uint8_t *rxBuffer; volatile uint8_t *txBuffer; #else diff --git a/src/main/drivers/serial_uart_stm32f4xx.c b/src/main/drivers/serial_uart_stm32f4xx.c index 499f3f9f5..b495e256d 100644 --- a/src/main/drivers/serial_uart_stm32f4xx.c +++ b/src/main/drivers/serial_uart_stm32f4xx.c @@ -39,6 +39,36 @@ #include "drivers/serial_uart.h" #include "drivers/serial_uart_impl.h" +#define UART_BUFFERS(n) \ + volatile uint8_t uart ## n ## RxBuffer[UART_RX_BUFFER_SIZE]; \ + volatile uint8_t uart ## n ## TxBuffer[UART_TX_BUFFER_SIZE]; struct dummy_s + +#ifdef USE_UART1 +UART_BUFFERS(1); +#endif + +#ifdef USE_UART2 +UART_BUFFERS(2); +#endif + +#ifdef USE_UART3 +UART_BUFFERS(3); +#endif + +#ifdef USE_UART4 +UART_BUFFERS(4); +#endif + +#ifdef USE_UART5 +UART_BUFFERS(5); +#endif + +#ifdef USE_UART6 +UART_BUFFERS(6); +#endif + +#undef UART_BUFFERS + const uartHardware_t uartHardware[UARTDEV_COUNT] = { #ifdef USE_UART1 { @@ -65,7 +95,11 @@ const uartHardware_t uartHardware[UARTDEV_COUNT] = { .rcc = RCC_APB2(USART1), .irqn = USART1_IRQn, .txPriority = NVIC_PRIO_SERIALUART1_TXDMA, - .rxPriority = NVIC_PRIO_SERIALUART1 + .rxPriority = NVIC_PRIO_SERIALUART1, + .txBuffer = uart1TxBuffer, + .rxBuffer = uart1RxBuffer, + .txBufferSize = sizeof(uart1TxBuffer), + .rxBufferSize = sizeof(uart1RxBuffer), }, #endif @@ -86,7 +120,11 @@ const uartHardware_t uartHardware[UARTDEV_COUNT] = { .rcc = RCC_APB1(USART2), .irqn = USART2_IRQn, .txPriority = NVIC_PRIO_SERIALUART2_TXDMA, - .rxPriority = NVIC_PRIO_SERIALUART2 + .rxPriority = NVIC_PRIO_SERIALUART2, + .txBuffer = uart2TxBuffer, + .rxBuffer = uart2RxBuffer, + .txBufferSize = sizeof(uart2TxBuffer), + .rxBufferSize = sizeof(uart2RxBuffer), }, #endif @@ -107,7 +145,11 @@ const uartHardware_t uartHardware[UARTDEV_COUNT] = { .rcc = RCC_APB1(USART3), .irqn = USART3_IRQn, .txPriority = NVIC_PRIO_SERIALUART3_TXDMA, - .rxPriority = NVIC_PRIO_SERIALUART3 + .rxPriority = NVIC_PRIO_SERIALUART3, + .txBuffer = uart3TxBuffer, + .rxBuffer = uart3RxBuffer, + .txBufferSize = sizeof(uart3TxBuffer), + .rxBufferSize = sizeof(uart3RxBuffer), }, #endif @@ -128,7 +170,11 @@ const uartHardware_t uartHardware[UARTDEV_COUNT] = { .rcc = RCC_APB1(UART4), .irqn = UART4_IRQn, .txPriority = NVIC_PRIO_SERIALUART4_TXDMA, - .rxPriority = NVIC_PRIO_SERIALUART4 + .rxPriority = NVIC_PRIO_SERIALUART4, + .txBuffer = uart4TxBuffer, + .rxBuffer = uart4RxBuffer, + .txBufferSize = sizeof(uart4TxBuffer), + .rxBufferSize = sizeof(uart4RxBuffer), }, #endif @@ -149,7 +195,11 @@ const uartHardware_t uartHardware[UARTDEV_COUNT] = { .rcc = RCC_APB1(UART5), .irqn = UART5_IRQn, .txPriority = NVIC_PRIO_SERIALUART5_TXDMA, - .rxPriority = NVIC_PRIO_SERIALUART5 + .rxPriority = NVIC_PRIO_SERIALUART5, + .txBuffer = uart5TxBuffer, + .rxBuffer = uart5RxBuffer, + .txBufferSize = sizeof(uart5TxBuffer), + .rxBufferSize = sizeof(uart5RxBuffer), }, #endif @@ -182,7 +232,11 @@ const uartHardware_t uartHardware[UARTDEV_COUNT] = { .rcc = RCC_APB2(USART6), .irqn = USART6_IRQn, .txPriority = NVIC_PRIO_SERIALUART6_TXDMA, - .rxPriority = NVIC_PRIO_SERIALUART6 + .rxPriority = NVIC_PRIO_SERIALUART6, + .txBuffer = uart6TxBuffer, + .rxBuffer = uart6RxBuffer, + .txBufferSize = sizeof(uart6TxBuffer), + .rxBufferSize = sizeof(uart6RxBuffer), }, #endif }; @@ -231,10 +285,10 @@ uartPort_t *serialUART(UARTDevice_e device, uint32_t baudRate, portMode_e mode, s->port.baudRate = baudRate; - s->port.rxBuffer = uart->rxBuffer; - s->port.txBuffer = uart->txBuffer; - s->port.rxBufferSize = sizeof(uart->rxBuffer); - s->port.txBufferSize = sizeof(uart->txBuffer); + s->port.rxBuffer = hardware->rxBuffer; + s->port.txBuffer = hardware->txBuffer; + s->port.rxBufferSize = hardware->rxBufferSize; + s->port.txBufferSize = hardware->txBufferSize; s->USARTx = hardware->reg;