From 084ac5a199d6e4b5c41f3b055be1d55ff82325be Mon Sep 17 00:00:00 2001 From: cfif Date: Tue, 16 Dec 2025 16:49:05 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Inc/SerialPortFlagchip.h | 23 +++++++++- Src/SerialPortFlagchip.c | 93 +++++++++++++++++++++++++++++++++++++--- 2 files changed, 108 insertions(+), 8 deletions(-) diff --git a/Inc/SerialPortFlagchip.h b/Inc/SerialPortFlagchip.h index f1e34c4..cfd07b4 100644 --- a/Inc/SerialPortFlagchip.h +++ b/Inc/SerialPortFlagchip.h @@ -24,6 +24,7 @@ typedef struct { uint8_t UART_INDEX; DMA_ChannelType RX_DMA_CHANNEL; + DMA_ChannelType TX_DMA_CHANNEL; FCUART_Type *UART; uint32_t DMA_BUF_LEN; @@ -39,6 +40,9 @@ typedef struct { DMA_ChannelCfgType chnCfg_RX; DMA_InterruptCfgType interruptCfg_RX; + DMA_ChannelCfgType chnCfg_TX; + DMA_InterruptCfgType interruptCfg_TX; + uint8_t *dataBufTransmit; uint32_t dataBufTransmitLen; @@ -69,11 +73,26 @@ void vSerialPortInitDMA( uint8_t IRQ_DMA_PRIORITY_RX, uint8_t IRQ_DMA_CHANNEL_PRIORITY_RX, + + DMA_ChannelType DMA_CHANNEL_TX, + DMA_RequestSourceType DMA_CHANNEL_REQ_TX, + uint8_t *DMA_BUF_TX, + uint16_t DMA_BUF_LEN_TX, + IRQn_Type IRQ_DMA_TX, + uint8_t IRQ_DMA_PRIORITY_TX, + uint8_t IRQ_DMA_CHANNEL_PRIORITY_TX, + + + + uint32_t rxBufferLength, uint32_t rxSnifferLength, - DMA_TransferCompleteCallbackType pTransferCompleteNotify, - DMA_TransferErrorCallbackType pTransferErrorNotify, + DMA_TransferCompleteCallbackType pTransferCompleteNotifyRx, + DMA_TransferErrorCallbackType pTransferErrorNotifyRx, + + DMA_TransferCompleteCallbackType pTransferCompleteNotifyTx, + DMA_TransferErrorCallbackType pTransferErrorNotifyTx, FCUART_IdleInterrupt_CallBackType FCUART_IldeInterrupt_CallBack, FCUART_ErrorInterrupt_CallBackType FCUART_ErrorInterrupt_CallBack, diff --git a/Src/SerialPortFlagchip.c b/Src/SerialPortFlagchip.c index 18869b4..572ce73 100644 --- a/Src/SerialPortFlagchip.c +++ b/Src/SerialPortFlagchip.c @@ -38,11 +38,23 @@ void vSerialPortInitDMA( uint8_t IRQ_DMA_PRIORITY_RX, uint8_t IRQ_DMA_CHANNEL_PRIORITY_RX, + DMA_ChannelType DMA_CHANNEL_TX, + DMA_RequestSourceType DMA_CHANNEL_REQ_TX, + uint8_t *DMA_BUF_TX, + uint16_t DMA_BUF_LEN_TX, + IRQn_Type IRQ_DMA_TX, + uint8_t IRQ_DMA_PRIORITY_TX, + uint8_t IRQ_DMA_CHANNEL_PRIORITY_TX, + + uint32_t rxBufferLength, uint32_t rxSnifferLength, - DMA_TransferCompleteCallbackType pTransferCompleteNotify, - DMA_TransferErrorCallbackType pTransferErrorNotify, + DMA_TransferCompleteCallbackType pTransferCompleteNotifyRx, + DMA_TransferErrorCallbackType pTransferErrorNotifyRx, + + DMA_TransferCompleteCallbackType pTransferCompleteNotifyTx, + DMA_TransferErrorCallbackType pTransferErrorNotifyTx, FCUART_IdleInterrupt_CallBackType FCUART_IldeInterrupt_CallBack, FCUART_ErrorInterrupt_CallBackType FCUART_ErrorInterrupt_CallBack, @@ -54,6 +66,7 @@ void vSerialPortInitDMA( ) { env->UART_INDEX = UART_INDEX; env->RX_DMA_CHANNEL = DMA_CHANNEL_RX; + 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; @@ -97,9 +110,9 @@ void vSerialPortInitDMA( DMA_InitChannel(DMA_INSTANCE_0, DMA_CHANNEL_RX, &env->chnCfg_RX); env->interruptCfg_RX.bTransferCompleteIntEn = true; - env->interruptCfg_RX.pTransferCompleteNotify = pTransferCompleteNotify; + env->interruptCfg_RX.pTransferCompleteNotify = pTransferCompleteNotifyRx; env->interruptCfg_RX.bTransferErrorIntEn = true; - env->interruptCfg_RX.pTransferErrorNotify = pTransferErrorNotify; + env->interruptCfg_RX.pTransferErrorNotify = pTransferErrorNotifyRx; DMA_InitChannelInterrupt(DMA_INSTANCE_0, DMA_CHANNEL_RX, &env->interruptCfg_RX); DMA_StartChannel(DMA_INSTANCE_0, DMA_CHANNEL_RX); @@ -113,6 +126,49 @@ void vSerialPortInitDMA( //конец-----------------------------------DMA-RX-------------------------------------------------------------------- + //начало-----------------------------------DMA-TX------------------------------------------------------------------- + //начало-----------------------------------DMA-TX------------------------------------------------------------------- + //начало-----------------------------------DMA-TX------------------------------------------------------------------- + + env->chnCfg_TX.pSrcBuffer = DMA_BUF_TX; + env->chnCfg_TX.pDestBuffer = &(uart->DATA); + env->chnCfg_TX.u32BlockSize = 1U; + env->chnCfg_TX.u16BlockCount = 1U; + env->chnCfg_TX.u8ChannelPriority = IRQ_DMA_CHANNEL_PRIORITY_TX; + env->chnCfg_TX.eSrcDataSize = DMA_TRANSFER_SIZE_1B; + env->chnCfg_TX.eDestDataSize = DMA_TRANSFER_SIZE_1B; + env->chnCfg_TX.eSrcIncMode = DMA_INCREMENT_DATA_SIZE; + env->chnCfg_TX.eDestIncMode = DMA_INCREMENT_DISABLE; + env->chnCfg_TX.bSrcBlockOffsetEn = false; + env->chnCfg_TX.bDestBlockOffsetEn = false; + env->chnCfg_TX.s32BlockOffset = 0; + env->chnCfg_TX.bSrcAddrLoopbackEn = false; + env->chnCfg_TX.bDestAddrLoopbackEn = false; + env->chnCfg_TX.bAutoStop = true; + + env->chnCfg_TX.bSrcCircularBufferEn = false; + env->chnCfg_TX.u32SrcCircBufferSize = 0U; + env->chnCfg_TX.bDestCircularBufferEn = false; + env->chnCfg_TX.u32DestCircBufferSize = 0U; + + env->chnCfg_TX.eTriggerSrc = DMA_CHANNEL_REQ_TX; + DMA_InitChannel(DMA_INSTANCE_0, DMA_CHANNEL_TX, &env->chnCfg_TX); + + env->interruptCfg_TX.bTransferCompleteIntEn = true; + env->interruptCfg_TX.pTransferCompleteNotify = pTransferCompleteNotifyTx; + env->interruptCfg_TX.bTransferErrorIntEn = true; + env->interruptCfg_TX.pTransferErrorNotify = pTransferErrorNotifyTx; + DMA_InitChannelInterrupt(DMA_INSTANCE_0, DMA_CHANNEL_TX, &env->interruptCfg_TX); + +// DMA_StartChannel(DMA_INSTANCE_0, DMA_CHANNEL_TX); + + NVIC_SetPriority(IRQ_DMA_TX, IRQ_DMA_PRIORITY_TX); + NVIC_EnableIRQ(IRQ_DMA_TX); + + //конец-----------------------------------DMA-TX-------------------------------------------------------------------- + //конец-----------------------------------DMA-TX-------------------------------------------------------------------- + //конец-----------------------------------DMA-TX-------------------------------------------------------------------- + //начало------------------------------------UART-------------------------------------------------------------------- //начало------------------------------------UART-------------------------------------------------------------------- //начало------------------------------------UART-------------------------------------------------------------------- @@ -126,6 +182,7 @@ void vSerialPortInitDMA( if (u32PccFuncClk != 0U) { env->tInitCfg.bEnRxFullDma = true; // UART receiver full DMA disable + env->tInitCfg.bEnTxEmptyDma = true; env->tInitCfg.bEnTxFifo = true; env->tInitCfg.u8TxFifoWaterMark = 0U; @@ -166,8 +223,10 @@ 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); tRetVal = FCUART_StartReceive(UART_INDEX); @@ -234,6 +293,27 @@ vSerialPortTransmitOverCore(tSerialPortFlagchip *env, uint8_t *data, uint16_t si uint16_t sent = 0; + if (size > 0) { + + DMA_ModifyAddress(DMA_INSTANCE_0, env->TX_DMA_CHANNEL, data, NULL); + DMA_ModifySize(DMA_INSTANCE_0, env->TX_DMA_CHANNEL, size); + + DMA_StartChannel(DMA_INSTANCE_0, env->TX_DMA_CHANNEL); + + uint8_t res; + + sent = (osMessageQueueGet(env->txAccessQueue, &res, 0, timeout) == osOK) ? size : 0; + + DMA_StopChannel(DMA_INSTANCE_0, env->TX_DMA_CHANNEL); + + } + + return sent; + + +/* + uint16_t sent = 0; + FCUART_ErrorType tRetVal; tRetVal = FCUART_AssignTxInterruptData(env->UART_INDEX, env->dataBufTransmit, size); @@ -247,6 +327,7 @@ vSerialPortTransmitOverCore(tSerialPortFlagchip *env, uint8_t *data, uint16_t si sent = (osMessageQueueGet(env->txAccessQueue, &res, 0, timeout) == osOK) ? size : 0; return sent; + */ } void SerialPort_TxEndTransmitted(tSerialPortFlagchip *env, uint8_t data) {