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:
parent
9ab8370379
commit
82a4d42b0e
3 changed files with 34 additions and 29 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue