1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-19 06:15:16 +03:00

Reinstate UART TX DMA for F7 (HAL driver)

This commit is contained in:
jflyper 2018-10-20 21:31:49 +09:00
parent 9ab8370379
commit 82a4d42b0e
3 changed files with 34 additions and 29 deletions

View file

@ -33,6 +33,7 @@
#ifdef USE_UART #ifdef USE_UART
#include "build/build_config.h" #include "build/build_config.h"
#include "build/atomic.h"
#include "common/utils.h" #include "common/utils.h"
#include "drivers/io.h" #include "drivers/io.h"
@ -232,26 +233,40 @@ void uartSetMode(serialPort_t *instance, portMode_e mode)
uartReconfigure(uartPort); uartReconfigure(uartPort);
} }
void uartStartTxDMA(uartPort_t *s) void uartTryStartTxDMA(uartPort_t *s)
{ {
uint16_t size = 0; ATOMIC_BLOCK(NVIC_PRIO_SERIALUART_TXDMA) {
uint32_t fromwhere=0; if (s->txDMAStream->CR & DMA_SxCR_EN) {
HAL_UART_StateTypeDef state = HAL_UART_GetState(&s->Handle); // DMA is already in progress
if ((state & HAL_UART_STATE_BUSY_TX) == HAL_UART_STATE_BUSY_TX) return;
return; }
if (s->port.txBufferHead > s->port.txBufferTail) { HAL_UART_StateTypeDef state = HAL_UART_GetState(&s->Handle);
size = s->port.txBufferHead - s->port.txBufferTail; if ((state & HAL_UART_STATE_BUSY_TX) == HAL_UART_STATE_BUSY_TX) {
fromwhere = s->port.txBufferTail; return;
s->port.txBufferTail = s->port.txBufferHead; }
} else {
size = s->port.txBufferSize - s->port.txBufferTail; if (s->port.txBufferHead == s->port.txBufferTail) {
fromwhere = s->port.txBufferTail; // No more data to transmit
s->port.txBufferTail = 0; s->txDMAEmpty = true;
return;
}
uint16_t size;
uint32_t fromWhere = s->port.txBufferTail;
if (s->port.txBufferHead > s->port.txBufferTail) {
size = s->port.txBufferHead - s->port.txBufferTail;
s->port.txBufferTail = s->port.txBufferHead;
} else {
size = s->port.txBufferSize - s->port.txBufferTail;
s->port.txBufferTail = 0;
}
s->txDMAEmpty = false;
HAL_UART_Transmit_DMA(&s->Handle, (uint8_t *)&s->port.txBuffer[fromWhere], size);
} }
s->txDMAEmpty = false;
//HAL_CLEANCACHE((uint8_t *)&s->port.txBuffer[fromwhere],size);
HAL_UART_Transmit_DMA(&s->Handle, (uint8_t *)&s->port.txBuffer[fromwhere], size);
} }
uint32_t uartTotalRxBytesWaiting(const serialPort_t *instance) uint32_t uartTotalRxBytesWaiting(const serialPort_t *instance)
@ -351,8 +366,7 @@ void uartWrite(serialPort_t *instance, uint8_t ch)
} }
if (s->txDMAStream) { if (s->txDMAStream) {
if (!(s->txDMAStream->CR & 1)) uartTryStartTxDMA(s);
uartStartTxDMA(s);
} else { } else {
__HAL_UART_ENABLE_IT(&s->Handle, UART_IT_TXE); __HAL_UART_ENABLE_IT(&s->Handle, UART_IT_TXE);
} }

View file

@ -171,11 +171,7 @@ extern uartDevice_t *uartDevmap[];
extern const struct serialPortVTable uartVTable[]; extern const struct serialPortVTable uartVTable[];
#ifdef USE_HAL_DRIVER
void uartStartTxDMA(uartPort_t *s);
#else
void uartTryStartTxDMA(uartPort_t *s); void uartTryStartTxDMA(uartPort_t *s);
#endif
uartPort_t *serialUART(UARTDevice_e device, uint32_t baudRate, portMode_e mode, portOptions_e options); uartPort_t *serialUART(UARTDevice_e device, uint32_t baudRate, portMode_e mode, portOptions_e options);

View file

@ -376,12 +376,7 @@ void uartIrqHandler(uartPort_t *s)
static void handleUsartTxDma(uartPort_t *s) static void handleUsartTxDma(uartPort_t *s)
{ {
if (s->port.txBufferHead != s->port.txBufferTail) uartTryStartTxDMA(s);
uartStartTxDMA(s);
else
{
s->txDMAEmpty = true;
}
} }
void dmaIRQHandler(dmaChannelDescriptor_t* descriptor) void dmaIRQHandler(dmaChannelDescriptor_t* descriptor)