diff --git a/src/main/drivers/serial_uart_hal.c b/src/main/drivers/serial_uart_hal.c index 39e7ad350..0b485da4e 100644 --- a/src/main/drivers/serial_uart_hal.c +++ b/src/main/drivers/serial_uart_hal.c @@ -176,7 +176,8 @@ void uartReconfigure(uartPort_t *uartPort) __HAL_DMA_SET_COUNTER(&uartPort->txDMAHandle, 0); } else { - __HAL_UART_ENABLE_IT(&uartPort->Handle, UART_IT_TXE); + /* Enable the UART Transmit Data Register Empty Interrupt */ + SET_BIT(uartPort->USARTx->CR1, USART_CR1_TXEIE); } } return; diff --git a/src/main/drivers/serial_uart_stm32f7xx.c b/src/main/drivers/serial_uart_stm32f7xx.c index 8ab4aa718..78c9ec880 100644 --- a/src/main/drivers/serial_uart_stm32f7xx.c +++ b/src/main/drivers/serial_uart_stm32f7xx.c @@ -47,7 +47,9 @@ const uartHardware_t uartHardware[UARTDEV_COUNT] = { #ifdef USE_UART1_RX_DMA .rxDMAStream = DMA2_Stream5, #endif +#ifdef USE_UART1_TX_DMA .txDMAStream = DMA2_Stream7, +#endif .rxPins = { DEFIO_TAG_E(PA10), DEFIO_TAG_E(PB7), IO_TAG_NONE }, .txPins = { DEFIO_TAG_E(PA9), DEFIO_TAG_E(PB6), IO_TAG_NONE }, .af = GPIO_AF7_USART1, @@ -70,7 +72,9 @@ const uartHardware_t uartHardware[UARTDEV_COUNT] = { #ifdef USE_UART2_RX_DMA .rxDMAStream = DMA1_Stream5, #endif +#ifdef USE_UART2_TX_DMA .txDMAStream = DMA1_Stream6, +#endif .rxPins = { DEFIO_TAG_E(PA3), DEFIO_TAG_E(PD6), IO_TAG_NONE }, .txPins = { DEFIO_TAG_E(PA2), DEFIO_TAG_E(PD5), IO_TAG_NONE }, .af = GPIO_AF7_USART2, @@ -93,7 +97,9 @@ const uartHardware_t uartHardware[UARTDEV_COUNT] = { #ifdef USE_UART3_RX_DMA .rxDMAStream = DMA1_Stream1, #endif +#ifdef USE_UART3_TX_DMA .txDMAStream = DMA1_Stream3, +#endif .rxPins = { DEFIO_TAG_E(PB11), DEFIO_TAG_E(PC11), DEFIO_TAG_E(PD9) }, .txPins = { DEFIO_TAG_E(PB10), DEFIO_TAG_E(PC10), DEFIO_TAG_E(PD8) }, .af = GPIO_AF7_USART3, @@ -116,7 +122,9 @@ const uartHardware_t uartHardware[UARTDEV_COUNT] = { #ifdef USE_UART4_RX_DMA .rxDMAStream = DMA1_Stream2, #endif +#ifdef USE_UART4_TX_DMA .txDMAStream = DMA1_Stream4, +#endif .rxPins = { DEFIO_TAG_E(PA1), DEFIO_TAG_E(PC11), IO_TAG_NONE }, .txPins = { DEFIO_TAG_E(PA0), DEFIO_TAG_E(PC10), IO_TAG_NONE }, .af = GPIO_AF8_UART4, @@ -139,7 +147,9 @@ const uartHardware_t uartHardware[UARTDEV_COUNT] = { #ifdef USE_UART5_RX_DMA .rxDMAStream = DMA1_Stream0, #endif +#ifdef USE_UART5_TX_DMA .txDMAStream = DMA1_Stream7, +#endif .rxPins = { DEFIO_TAG_E(PD2), IO_TAG_NONE, IO_TAG_NONE }, .txPins = { DEFIO_TAG_E(PC12), IO_TAG_NONE, IO_TAG_NONE }, .af = GPIO_AF8_UART5, @@ -162,7 +172,9 @@ const uartHardware_t uartHardware[UARTDEV_COUNT] = { #ifdef USE_UART6_RX_DMA .rxDMAStream = DMA2_Stream1, #endif +#ifdef USE_UART6_TX_DMA .txDMAStream = DMA2_Stream6, +#endif .rxPins = { DEFIO_TAG_E(PC7), DEFIO_TAG_E(PG9), IO_TAG_NONE }, .txPins = { DEFIO_TAG_E(PC6), DEFIO_TAG_E(PG14), IO_TAG_NONE }, .af = GPIO_AF8_USART6, @@ -185,7 +197,9 @@ const uartHardware_t uartHardware[UARTDEV_COUNT] = { #ifdef USE_UART7_RX_DMA .rxDMAStream = DMA1_Stream3, #endif +#ifdef USE_UART7_TX_DMA .txDMAStream = DMA1_Stream1, +#endif .rxPins = { DEFIO_TAG_E(PE7), DEFIO_TAG_E(PF6), IO_TAG_NONE }, .txPins = { DEFIO_TAG_E(PE8), DEFIO_TAG_E(PF7), IO_TAG_NONE }, .af = GPIO_AF8_UART7, @@ -208,7 +222,9 @@ const uartHardware_t uartHardware[UARTDEV_COUNT] = { #ifdef USE_UART8_RX_DMA .rxDMAStream = DMA1_Stream6, #endif +#ifdef USE_UART8_TX_DMA .txDMAStream = DMA1_Stream0, +#endif .rxPins = { DEFIO_TAG_E(PE0), IO_TAG_NONE, IO_TAG_NONE }, .txPins = { DEFIO_TAG_E(PE1), IO_TAG_NONE, IO_TAG_NONE }, .af = GPIO_AF8_UART8, @@ -228,9 +244,8 @@ void uartIrqHandler(uartPort_t *s) { UART_HandleTypeDef *huart = &s->Handle; /* UART in mode Receiver ---------------------------------------------------*/ - if ((__HAL_UART_GET_IT(huart, UART_IT_RXNE) != RESET)) - { - uint8_t rbyte = (uint8_t)(huart->Instance->RDR & (uint8_t)0xff); + if ((__HAL_UART_GET_IT(huart, UART_IT_RXNE) != RESET)) { + uint8_t rbyte = (uint8_t)(huart->Instance->RDR & (uint8_t) 0xff); if (s->port.rxCallback) { s->port.rxCallback(rbyte); @@ -247,42 +262,51 @@ void uartIrqHandler(uartPort_t *s) } /* UART parity error interrupt occurred -------------------------------------*/ - if ((__HAL_UART_GET_IT(huart, UART_IT_PE) != RESET)) - { - __HAL_UART_CLEAR_IT(huart, UART_CLEAR_PEF); + if ((__HAL_UART_GET_IT(huart, UART_IT_PE) != RESET)) { + __HAL_UART_CLEAR_IT(huart, UART_CLEAR_PEF); } /* UART frame error interrupt occurred --------------------------------------*/ - if ((__HAL_UART_GET_IT(huart, UART_IT_FE) != RESET)) - { - __HAL_UART_CLEAR_IT(huart, UART_CLEAR_FEF); + if ((__HAL_UART_GET_IT(huart, UART_IT_FE) != RESET)) { + __HAL_UART_CLEAR_IT(huart, UART_CLEAR_FEF); } /* UART noise error interrupt occurred --------------------------------------*/ - if ((__HAL_UART_GET_IT(huart, UART_IT_NE) != RESET)) - { - __HAL_UART_CLEAR_IT(huart, UART_CLEAR_NEF); + if ((__HAL_UART_GET_IT(huart, UART_IT_NE) != RESET)) { + __HAL_UART_CLEAR_IT(huart, UART_CLEAR_NEF); } /* UART Over-Run interrupt occurred -----------------------------------------*/ - if ((__HAL_UART_GET_IT(huart, UART_IT_ORE) != RESET)) - { - __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF); + if ((__HAL_UART_GET_IT(huart, UART_IT_ORE) != RESET)) { + __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF); } /* UART in mode Transmitter ------------------------------------------------*/ - if ((__HAL_UART_GET_IT(huart, UART_IT_TXE) != RESET)) - { - HAL_UART_IRQHandler(huart); + if (!s->txDMAStream && (__HAL_UART_GET_IT(huart, UART_IT_TXE) != RESET)) { + /* Check that a Tx process is ongoing */ + if (huart->gState != HAL_UART_STATE_BUSY_TX) { + if (s->port.txBufferTail == s->port.txBufferHead) { + huart->TxXferCount = 0; + /* Disable the UART Transmit Data Register Empty Interrupt */ + CLEAR_BIT(huart->Instance->CR1, USART_CR1_TXEIE); + } else { + if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) { + huart->Instance->TDR = (((uint16_t) s->port.txBuffer[s->port.txBufferTail]) & (uint16_t) 0x01FFU); + } else { + huart->Instance->TDR = (uint8_t)(s->port.txBuffer[s->port.txBufferTail]); + } + s->port.txBufferTail = (s->port.txBufferTail + 1) % s->port.txBufferSize; + } + } } /* UART in mode Transmitter (transmission end) -----------------------------*/ - if ((__HAL_UART_GET_IT(huart, UART_IT_TC) != RESET)) - { + if ((__HAL_UART_GET_IT(huart, UART_IT_TC) != RESET)) { HAL_UART_IRQHandler(huart); - handleUsartTxDma(s); + if (s->txDMAStream) { + handleUsartTxDma(s); + } } - } static void handleUsartTxDma(uartPort_t *s) @@ -329,8 +353,15 @@ uartPort_t *serialUART(UARTDevice_e device, uint32_t baudRate, portMode_e mode, s->rxDMAChannel = hardware->DMAChannel; s->rxDMAStream = hardware->rxDMAStream; } - s->txDMAChannel = hardware->DMAChannel; - s->txDMAStream = hardware->txDMAStream; + + if (hardware->txDMAStream) { + s->txDMAChannel = hardware->DMAChannel; + s->txDMAStream = hardware->txDMAStream; + + // DMA TX Interrupt + dmaInit(hardware->txIrq, OWNER_SERIAL_TX, RESOURCE_INDEX(device)); + dmaSetHandler(hardware->txIrq, dmaIRQHandler, hardware->txPriority, (uint32_t)uartdev); + } s->txDMAPeripheralBaseAddr = (uint32_t)&s->USARTx->TDR; s->rxDMAPeripheralBaseAddr = (uint32_t)&s->USARTx->RDR; @@ -362,16 +393,7 @@ uartPort_t *serialUART(UARTDevice_e device, uint32_t baudRate, portMode_e mode, } } - // DMA TX Interrupt - dmaInit(hardware->txIrq, OWNER_SERIAL_TX, RESOURCE_INDEX(device)); - dmaSetHandler(hardware->txIrq, dmaIRQHandler, hardware->txPriority, (uint32_t)uartdev); - - - //HAL_NVIC_SetPriority(hardware->txIrq, NVIC_PRIORITY_BASE(hardware->txPriority), NVIC_PRIORITY_SUB(hardware->txPriority)); - //HAL_NVIC_EnableIRQ(hardware->txIrq); - - if (!s->rxDMAChannel) - { + if (!s->rxDMAChannel) { HAL_NVIC_SetPriority(hardware->rxIrq, NVIC_PRIORITY_BASE(hardware->rxPriority), NVIC_PRIORITY_SUB(hardware->rxPriority)); HAL_NVIC_EnableIRQ(hardware->rxIrq); }