From 983966f58c5b52a11734b081e618202b0b9b39b1 Mon Sep 17 00:00:00 2001 From: cfif Date: Tue, 9 Dec 2025 10:50:30 +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 | 5 +++-- Src/SerialPortFlagchip.c | 25 ++++++++++++++++--------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/Inc/SerialPortFlagchip.h b/Inc/SerialPortFlagchip.h index ba5ceea..02b3a6f 100644 --- a/Inc/SerialPortFlagchip.h +++ b/Inc/SerialPortFlagchip.h @@ -27,8 +27,6 @@ typedef struct { uint32_t UART_DMA_RECEIVED_LEN_BUF; - uint8 s_SampleTmp[4]; - FCUART_DataType s_tFCUART_TxMsg; FCUART_InitType tInitCfg; @@ -38,6 +36,8 @@ typedef struct { DMA_ChannelCfgType chnCfg; DMA_InterruptCfgType interruptCfg; + uint8_t dataBufTransmit[512]; + osMessageQueueId_t txAccessQueue; osMessageQueueId_t rxDataQueue; osMessageQueueId_t rxDataSnifferQueue; @@ -82,6 +82,7 @@ tSerialPortIO vSerialPortGetIo(tSerialPortFlagchip *env); void SerialPort_RxDmaBufToQueue(tSerialPortFlagchip *env, const void *pSrcBuffer); +void SerialPort_TxEndTransmitted(tSerialPortFlagchip *env, uint8_t data); /* #define vSerialPortInitDMAName(ENV, NAME, DMA, RX_DMA_CHANNEL, RX_DMA_CHANNEL_MUX, RX_DMAMUX_DMAREQ_ID, RX_DMA_Channel_IRQ, RX_DMA_FDT_FLAG, DMA_BUF, DMA_BUF_LEN, TX_DMA_CHANNEL, TX_DMA_CHANNEL_MUX, TX_DMAMUX_DMAREQ_ID, TX_DMA_Channel_IRQ, TX_DMA_FDT_FLAG, SWAP, BOUND_RATE, PRIORITY, LEN) \ vSerialPortInitDMA(ENV, NAME, DMA, RX_DMA_CHANNEL, RX_DMA_CHANNEL_MUX, RX_DMAMUX_DMAREQ_ID, RX_DMA_Channel_IRQ, RX_DMA_FDT_FLAG, DMA_BUF, DMA_BUF_LEN, TX_DMA_CHANNEL, TX_DMA_CHANNEL_MUX, TX_DMAMUX_DMAREQ_ID, TX_DMA_Channel_IRQ, TX_DMA_FDT_FLAG, SWAP, BOUND_RATE, NAME##_IRQn, CRM_##NAME##_PERIPH_CLOCK, PRIORITY, LEN, 0) diff --git a/Src/SerialPortFlagchip.c b/Src/SerialPortFlagchip.c index 174fbcf..c7f8172 100644 --- a/Src/SerialPortFlagchip.c +++ b/Src/SerialPortFlagchip.c @@ -68,9 +68,10 @@ void vSerialPortInitDMA( env->rxDataSnifferQueue = 0; } - FCUART_InitMemory(UART_INDEX); + FCUART_InitMemory(UART_INDEX); + env->dmaInitCfg.eArbitrationAlgorithm = DMA_ARBITRATION_ALGORITHM_FIXED_PRIORITY; env->dmaInitCfg.bHaltOnError = false; DMA_Init(DMA_INSTANCE_0, &env->dmaInitCfg); @@ -107,10 +108,9 @@ void vSerialPortInitDMA( //NVIC_SetPriorityGrouping(NVIC_PRIORITY_GROUP_4); - NVIC_EnableIRQ(IRQ_DMA); NVIC_SetPriority(DMA_Error_IRQn, IRQ_DMA_PRIORITY); NVIC_SetPriority(IRQ_DMA, IRQ_DMA_PRIORITY); - + NVIC_EnableIRQ(IRQ_DMA); FCUART_ErrorType tRetVal; uint32_t u32PccFuncClk; @@ -138,7 +138,7 @@ void vSerialPortInitDMA( if (tRetVal == FCUART_ERROR_OK) { - env->s_tFCUART_TxMsg.pDatas = (uint8_t *) env->s_SampleTmp; // data buffer must set an array address + env->s_tFCUART_TxMsg.pDatas = (uint8_t *) env->dataBufTransmit; // data buffer must set an array address env->s_tFCUART_TxMsg.u32DataLen = 0; env->tInterruptCfg.pTxBuf = &env->s_tFCUART_TxMsg; @@ -149,17 +149,19 @@ void vSerialPortInitDMA( env->tInterruptCfg.bEnRxInterrupt = false; env->tInterruptCfg.pRxNotify = NULL; - env->tInterruptCfg.bEnTxInterrupt = true; + env->tInterruptCfg.bEnTxInterrupt = false; env->tInterruptCfg.pTxEmptyNotify = FCUART_TxEmptyInterrupt_CallBack; env->tInterruptCfg.pTxCompleteNotify = FCUART_TxCompleteInterrupt_CallBack; + tRetVal = FCUART_BufTransmitted(UART_INDEX, &env->tInterruptCfg); + tRetVal = FCUART_SetInterrupt(UART_INDEX, &env->tInterruptCfg); - NVIC_EnableIRQ(IRQ_UART); - NVIC_SetPriority(IRQ_UART, UART_PRIORITY); - tRetVal = FCUART_StartReceive(UART_INDEX); + NVIC_SetPriority(IRQ_UART, UART_PRIORITY); + NVIC_EnableIRQ(IRQ_UART); + } } @@ -229,7 +231,8 @@ vSerialPortTransmitOverCore(tSerialPortFlagchip *env, uint8_t *data, uint16_t si FCUART_ErrorType tRetVal; - tRetVal = FCUART_AssignTxInterruptData(env->UART_INDEX, (uint8 *) data, size); + memcpy(env->dataBufTransmit, data, size); + tRetVal = FCUART_AssignTxInterruptData(env->UART_INDEX, env->dataBufTransmit, size); tRetVal = FCUART_StartTransmit(env->UART_INDEX); @@ -242,6 +245,10 @@ vSerialPortTransmitOverCore(tSerialPortFlagchip *env, uint8_t *data, uint16_t si return sent; } +void SerialPort_TxEndTransmitted(tSerialPortFlagchip *env, uint8_t data) { + osMessageQueuePut(env->txAccessQueue, &data, 0x0, 0U); +} + void SerialPort_RxDmaBufToQueue(tSerialPortFlagchip *env, const void *pSrcBuffer) { for (uint32_t i = 0; i < env->UART_DMA_RECEIVED_LEN_BUF; ++i) {