From bf162b0730a5800d95099cd63b9ea4c09526c5ac Mon Sep 17 00:00:00 2001 From: Sami Korhonen Date: Sun, 9 Oct 2016 09:48:29 +0300 Subject: [PATCH] Fix DMA transmit --- src/main/drivers/serial_uart_hal.c | 9 +++------ src/main/drivers/serial_uart_stm32f7xx.c | 12 +++--------- 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/src/main/drivers/serial_uart_hal.c b/src/main/drivers/serial_uart_hal.c index 22a8bdbc64..5507513379 100644 --- a/src/main/drivers/serial_uart_hal.c +++ b/src/main/drivers/serial_uart_hal.c @@ -85,8 +85,6 @@ static void uartReconfigure(uartPort_t *uartPort) if (uartPort->port.mode & MODE_TX) uartPort->Handle.Init.Mode |= UART_MODE_TX; - SET_BIT(uartPort->USARTx->CR3, USART_CR3_OVRDIS); - usartConfigurePinInversion(uartPort); @@ -131,7 +129,6 @@ static void uartReconfigure(uartPort_t *uartPort) } else { - //__HAL_UART_ENABLE_IT(&s->Handle, UART_IT_RXNE); /* Enable the UART Parity Error Interrupt */ SET_BIT(uartPort->USARTx->CR1, USART_CR1_PEIE); @@ -140,7 +137,6 @@ static void uartReconfigure(uartPort_t *uartPort) /* Enable the UART Data Register not empty Interrupt */ SET_BIT(uartPort->USARTx->CR1, USART_CR1_RXNEIE); - //HAL_UART_Receive_IT(&s->Handle, (uint8_t*)s->port.rxBuffer, 1); } } @@ -172,7 +168,6 @@ static void uartReconfigure(uartPort_t *uartPort) /* Associate the initialized DMA handle to the UART handle */ __HAL_LINKDMA(&uartPort->Handle, hdmatx, uartPort->txDMAHandle); -// __HAL_DMA_ENABLE_IT(s->txDMAHandle, DMA_IT_TC|DMA_IT_FE|DMA_IT_TE|DMA_IT_DME); __HAL_DMA_SET_COUNTER(&uartPort->txDMAHandle, 0); } else { __HAL_UART_ENABLE_IT(&uartPort->Handle, UART_IT_TXE); @@ -254,7 +249,9 @@ void uartStartTxDMA(uartPort_t *s) { uint16_t size = 0; uint32_t fromwhere=0; - //HAL_UART_DMAStop(&s->Handle); + HAL_UART_StateTypeDef state = HAL_UART_GetState(&s->Handle); + if((state & HAL_UART_STATE_BUSY_TX) == HAL_UART_STATE_BUSY_TX) + return; if (s->port.txBufferHead > s->port.txBufferTail) { size = s->port.txBufferHead - s->port.txBufferTail; diff --git a/src/main/drivers/serial_uart_stm32f7xx.c b/src/main/drivers/serial_uart_stm32f7xx.c index 0b054ddcd0..cb2274a6b8 100644 --- a/src/main/drivers/serial_uart_stm32f7xx.c +++ b/src/main/drivers/serial_uart_stm32f7xx.c @@ -309,7 +309,6 @@ void uartIrqHandler(uartPort_t *s) s->port.rxBuffer[s->port.rxBufferHead] = rbyte; s->port.rxBufferHead = (s->port.rxBufferHead + 1) % s->port.rxBufferSize; } - //__HAL_UART_CLEAR_IT(huart, UART_IT_RXNE); CLEAR_BIT(huart->Instance->CR1, (USART_CR1_PEIE)); /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */ @@ -345,19 +344,16 @@ void uartIrqHandler(uartPort_t *s) /* UART in mode Transmitter ------------------------------------------------*/ if((__HAL_UART_GET_IT(huart, UART_IT_TXE) != RESET)) { - //UART_Transmit_IT(huart); + HAL_UART_IRQHandler(huart); } /* UART in mode Transmitter (transmission end) -----------------------------*/ if((__HAL_UART_GET_IT(huart, UART_IT_TC) != RESET)) { - __HAL_UART_CLEAR_IT(huart, UART_CLEAR_TCF); + HAL_UART_IRQHandler(huart); + handleUsartTxDma(s); } - /*if(s->txDMAStream && (s->Handle.TxXferCount == 0) && (s->Handle.TxXferSize != 0)) - { - handleUsartTxDma(s); - }*/ } static void handleUsartTxDma(uartPort_t *s) @@ -367,7 +363,6 @@ static void handleUsartTxDma(uartPort_t *s) else { s->txDMAEmpty = true; - s->Handle.gState = HAL_UART_STATE_READY; } } @@ -375,7 +370,6 @@ void dmaIRQHandler(dmaChannelDescriptor_t* descriptor) { uartPort_t *s = &(((uartDevice_t*)(descriptor->userParam))->port); HAL_DMA_IRQHandler(&s->txDMAHandle); - handleUsartTxDma(s); } uartPort_t *serialUART(UARTDevice device, uint32_t baudRate, portMode_t mode, portOptions_t options)