Обновление

This commit is contained in:
cfif 2025-12-16 16:49:05 +03:00
parent 9a06f77447
commit 084ac5a199
2 changed files with 108 additions and 8 deletions

View File

@ -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,

View File

@ -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) {