Обновление

This commit is contained in:
cfif 2026-01-16 11:40:13 +03:00
parent 084ac5a199
commit 29f57d78be
2 changed files with 41 additions and 37 deletions

View File

@ -19,7 +19,7 @@
#include "fc7xxx_driver_dma.h"
#define UART_RX_FIFO_WATERMARK 15U
#define UART_RX_WATERMARK 64U
typedef struct {
uint8_t UART_INDEX;
@ -29,9 +29,10 @@ typedef struct {
uint32_t DMA_BUF_LEN;
uint32_t UART_DMA_RECEIVED_LEN_BUF;
uint32_t UART_DMA_RECEIVED_POINTER_BUF;
uint16_t PROCESSED_BYTES;
FCUART_DataType s_tFCUART_TxMsg;
FCUART_InitType tInitCfg;
@ -102,8 +103,9 @@ void vSerialPortInitDMA(
);
tSerialPortIO vSerialPortGetIo(tSerialPortFlagchip *env);
tSerialPortIO vSerialPortGetSnifferIo(tSerialPortFlagchip *env);
void SerialPort_RxDmaBufToQueue(tSerialPortFlagchip *env, const void *pSrcBuffer);
void SerialPort_RxDmaBufToQueue(tSerialPortFlagchip *env, bool isTransferComplete, const uint8_t *pSrcBuffer);
void SerialPort_TxEndTransmitted(tSerialPortFlagchip *env, uint8_t data);
/*

View File

@ -69,7 +69,6 @@ void vSerialPortInitDMA(
env->TX_DMA_CHANNEL = DMA_CHANNEL_TX;
env->UART = uart;
env->DMA_BUF_LEN = DMA_BUF_LEN_RX;
env->UART_DMA_RECEIVED_LEN_BUF = 0;
env->dataBufTransmit = dataBufTransmit;
env->dataBufTransmitLen = dataBufTransmitLen;
env->txAccessQueue = osMessageQueueNew(1, 1, NULL);
@ -88,7 +87,7 @@ void vSerialPortInitDMA(
env->chnCfg_RX.pSrcBuffer = &(uart->DATA);
env->chnCfg_RX.pDestBuffer = DMA_BUF_RX;
env->chnCfg_RX.u32BlockSize = 1U;
env->chnCfg_RX.u16BlockCount = 1U;
env->chnCfg_RX.u16BlockCount = UART_RX_WATERMARK;
env->chnCfg_RX.u8ChannelPriority = IRQ_DMA_CHANNEL_PRIORITY_RX;
env->chnCfg_RX.eSrcDataSize = DMA_TRANSFER_SIZE_1B;
env->chnCfg_RX.eDestDataSize = DMA_TRANSFER_SIZE_1B;
@ -102,7 +101,7 @@ void vSerialPortInitDMA(
env->chnCfg_RX.bAutoStop = false;
env->chnCfg_RX.bSrcCircularBufferEn = false;
env->chnCfg_RX.u32SrcCircBufferSize = 0U;
env->chnCfg_RX.u32SrcCircBufferSize = 0U;
env->chnCfg_RX.bDestCircularBufferEn = true;
env->chnCfg_RX.u32DestCircBufferSize = DMA_BUF_LEN_RX;
@ -147,7 +146,7 @@ void vSerialPortInitDMA(
env->chnCfg_TX.bAutoStop = true;
env->chnCfg_TX.bSrcCircularBufferEn = false;
env->chnCfg_TX.u32SrcCircBufferSize = 0U;
env->chnCfg_TX.u32SrcCircBufferSize = 0U;
env->chnCfg_TX.bDestCircularBufferEn = false;
env->chnCfg_TX.u32DestCircBufferSize = 0U;
@ -223,8 +222,8 @@ void vSerialPortInitDMA(
tRetVal = FCUART_SetInterrupt(UART_INDEX, &env->tInterruptCfg);
// NVIC_SetPriority(IRQ_UART, UART_PRIORITY);
// NVIC_EnableIRQ(IRQ_UART);
NVIC_SetPriority(IRQ_UART, UART_PRIORITY);
NVIC_EnableIRQ(IRQ_UART);
FCUART_HWA_SetTxTransfer(env->UART, true);
@ -310,43 +309,46 @@ vSerialPortTransmitOverCore(tSerialPortFlagchip *env, uint8_t *data, uint16_t si
return sent;
/*
uint16_t sent = 0;
FCUART_ErrorType tRetVal;
tRetVal = FCUART_AssignTxInterruptData(env->UART_INDEX, env->dataBufTransmit, size);
tRetVal = FCUART_StartTransmit(env->UART_INDEX);
PROCESS_UNUSED_VAR(tRetVal)
uint8_t res;
sent = (osMessageQueueGet(env->txAccessQueue, &res, 0, timeout) == osOK) ? size : 0;
return sent;
*/
}
void SerialPort_TxEndTransmitted(tSerialPortFlagchip *env, uint8_t data) {
osMessageQueuePut(env->txAccessQueue, &data, 0x0, 0U);
}
void SerialPort_RxDmaBufToQueue(tSerialPortFlagchip *env, const void *pSrcBuffer) {
void SerialPort_RxDmaBufToQueue(tSerialPortFlagchip *env, bool isTransferComplete, const uint8_t *pSrcBuffer) {
for (uint32_t i = 0; i < env->UART_DMA_RECEIVED_LEN_BUF; ++i) {
osMessageQueuePut(env->rxDataQueue, &((uint8 *) pSrcBuffer)[i], 0x0, 0U);
if (env->rxDataSnifferQueue) {
osMessageQueuePut(env->rxDataSnifferQueue, &((uint8 *) pSrcBuffer)[i], 0x0, 0U);
}
DMA_Type *aDma[] = DMA_BASE_PTRS;
DMA_Type *const pDma = aDma[DMA_INSTANCE_0];
uint16_t remaining_bytes;
// Если передача завершена
if (isTransferComplete) {
// Количество байт в буфере
remaining_bytes = env->chnCfg_RX.u16BlockCount - env->PROCESSED_BYTES;
env->PROCESSED_BYTES = 0;
} else {
// Количество байт в буфере
remaining_bytes =
env->chnCfg_RX.u16BlockCount - env->PROCESSED_BYTES - pDma->CFG[env->RX_DMA_CHANNEL].CLC.CHTRGENNO;
env->PROCESSED_BYTES += remaining_bytes;
}
env->UART_DMA_RECEIVED_POINTER_BUF += env->UART_DMA_RECEIVED_LEN_BUF;
env->UART_DMA_RECEIVED_LEN_BUF = 0;
if (env->UART_DMA_RECEIVED_POINTER_BUF >= env->DMA_BUF_LEN)
env->UART_DMA_RECEIVED_POINTER_BUF = 0;
for (uint16_t i = 0; i < remaining_bytes; ++i) {
osMessageQueuePut(env->rxDataQueue, &pSrcBuffer[env->UART_DMA_RECEIVED_POINTER_BUF], 0x0, 0U);
if (env->rxDataSnifferQueue) {
osMessageQueuePut(env->rxDataSnifferQueue, &pSrcBuffer[env->UART_DMA_RECEIVED_POINTER_BUF], 0x0, 0U);
}
++env->UART_DMA_RECEIVED_POINTER_BUF;
if (env->UART_DMA_RECEIVED_POINTER_BUF >= env->DMA_BUF_LEN) {
env->UART_DMA_RECEIVED_POINTER_BUF = 0;
}
}
}