From ae1e97fa26b9fcfd94bec1772a5f2c06af96ab1e Mon Sep 17 00:00:00 2001 From: cfif Date: Tue, 9 Dec 2025 16:15:17 +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 --- SerialPorts.c | 53 ++++++++++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/SerialPorts.c b/SerialPorts.c index d170873..4e586ac 100644 --- a/SerialPorts.c +++ b/SerialPorts.c @@ -7,13 +7,12 @@ tSerialPorts SERIAL_PORTS; -uint8_t buf_USART2_TRANSMITTED[512]; -uint8_t buf_USART2_DMA[256]; +uint8_t buf_USART2_TRANSMITTED[256]; +ALIGN(256) uint8_t buf_USART2_DMA[6]; static void DMA_USART2_ErrorCallback() { - while (1) - { + while (1) { __asm("nop"); } } @@ -21,20 +20,29 @@ static void DMA_USART2_ErrorCallback() { static void DMA_USART2_TransferCompleteCallback() { ++SERIAL_PORTS.SerialPortLog.UART_DMA_RECEIVED_LEN_BUF; - if (SERIAL_PORTS.SerialPortLog.UART_DMA_RECEIVED_LEN_BUF >= SERIAL_PORTS.SerialPortLog.DMA_BUF_LEN) { + SerialPortTransmit(&SERIAL_PORTS.cliVirtualInIo, + (uint8_t *) &buf_USART2_DMA[SERIAL_PORTS.SerialPortLog.UART_DMA_RECEIVED_POINTER_BUF], + SERIAL_PORTS.SerialPortLog.UART_DMA_RECEIVED_LEN_BUF, 0); + SERIAL_PORTS.SerialPortLog.UART_DMA_RECEIVED_POINTER_BUF += SERIAL_PORTS.SerialPortLog.UART_DMA_RECEIVED_LEN_BUF; + SERIAL_PORTS.SerialPortLog.UART_DMA_RECEIVED_LEN_BUF = 0; + if (SERIAL_PORTS.SerialPortLog.UART_DMA_RECEIVED_POINTER_BUF >= SERIAL_PORTS.SerialPortLog.DMA_BUF_LEN) + SERIAL_PORTS.SerialPortLog.UART_DMA_RECEIVED_POINTER_BUF = 0; - SerialPort_RxDmaBufToQueue(&SERIAL_PORTS.SerialPortLog, buf_USART2_DMA); - - DMA_ModifyAddress(DMA_INSTANCE_0, SERIAL_PORTS.SerialPortLog.RX_DMA_CHANNEL, &(SERIAL_PORTS.SerialPortLog.UART->DATA), - (void *) ((uint32_t) (buf_USART2_DMA))); - } +// DMA_ModifyAddress(DMA_INSTANCE_0, SERIAL_PORTS.SerialPortLog.RX_DMA_CHANNEL, &(SERIAL_PORTS.SerialPortLog.UART->DATA), +// (void *) ((uint32_t) (buf_USART2_DMA))); } static void FCUART_IldeInterrupt_CallBack(uint8_t u8UartIndex) { - SerialPort_RxDmaBufToQueue(&SERIAL_PORTS.SerialPortLog, buf_USART2_DMA); + SerialPortTransmit(&SERIAL_PORTS.cliVirtualInIo, + (uint8_t *) &buf_USART2_DMA[SERIAL_PORTS.SerialPortLog.UART_DMA_RECEIVED_POINTER_BUF], + SERIAL_PORTS.SerialPortLog.UART_DMA_RECEIVED_LEN_BUF, 0); + SERIAL_PORTS.SerialPortLog.UART_DMA_RECEIVED_POINTER_BUF += SERIAL_PORTS.SerialPortLog.UART_DMA_RECEIVED_LEN_BUF; + SERIAL_PORTS.SerialPortLog.UART_DMA_RECEIVED_LEN_BUF = 0; + if (SERIAL_PORTS.SerialPortLog.UART_DMA_RECEIVED_POINTER_BUF >= SERIAL_PORTS.SerialPortLog.DMA_BUF_LEN) + SERIAL_PORTS.SerialPortLog.UART_DMA_RECEIVED_POINTER_BUF = 0; - DMA_ModifyAddress(DMA_INSTANCE_0, SERIAL_PORTS.SerialPortLog.RX_DMA_CHANNEL, &(SERIAL_PORTS.SerialPortLog.UART->DATA), (void *)((uint32_t)(buf_USART2_DMA))); +// DMA_ModifyAddress(DMA_INSTANCE_0, SERIAL_PORTS.SerialPortLog.RX_DMA_CHANNEL, &(SERIAL_PORTS.SerialPortLog.UART->DATA), (void *)((uint32_t)(buf_USART2_DMA))); PROCESS_UNUSED_VAR(u8UartIndex) } @@ -52,13 +60,11 @@ static void FCUART_TxEmptyInterrupt_CallBack(uint8_t u8UartIndex, FCUART_DataTyp } static void FCUART_TxCompleteInterrupt_CallBack(uint8_t u8UartIndex, FCUART_DataType *pTxData) { - asm("nop"); if (u8UartIndex == SERIAL_PORTS.SerialPortLog.UART_INDEX) { SerialPort_TxEndTransmitted(SERIAL_PORTS.SerialPortLog_IO.env, 1); } - PROCESS_UNUSED_VAR(u8UartIndex) PROCESS_UNUSED_VAR(pTxData) } @@ -76,7 +82,7 @@ static void vSerialPort_InitUSART2(tSerialPortFlagchip *env) { tInitStruct.uPortPinMux.u32PortPinMode = PORTD_6_FCUART2_RX; PORT_InitPins(PORT_D, &tInitStruct); - tGpioInitStruct.u32GpioPins = GPIO_PIN_6; + tGpioInitStruct.u32GpioPins = GPIO_PIN_6; tGpioInitStruct.ePinDirection = GPIO_IN; GPIO_InitPins(GPIO_D, &tGpioInitStruct); @@ -85,9 +91,9 @@ static void vSerialPort_InitUSART2(tSerialPortFlagchip *env) { tInitStruct.uPortPinMux.u32PortPinMode = PORTD_7_FCUART2_TX; PORT_InitPins(PORT_D, &tInitStruct); - tGpioInitStruct.u32GpioPins = GPIO_PIN_7; + tGpioInitStruct.u32GpioPins = GPIO_PIN_7; tGpioInitStruct.ePinDirection = GPIO_OUT; - tGpioInitStruct.ePinLevel = GPIO_HIGH; + tGpioInitStruct.ePinLevel = GPIO_HIGH; GPIO_InitPins(GPIO_D, &tGpioInitStruct); vSerialPortInitDMA( @@ -110,11 +116,11 @@ static void vSerialPort_InitUSART2(tSerialPortFlagchip *env) { sizeof(buf_USART2_DMA), DMA0_IRQn, - 0x55, // IRQ_DMA_PRIORITY - 2, // IRQ_DMA_CHANNEL_PRIORITY + 0xFF, // IRQ_DMA_PRIORITY + DMA0_IRQn, // IRQ_DMA_CHANNEL_PRIORITY 1024, - 1024, + 0, DMA_USART2_TransferCompleteCallback, DMA_USART2_ErrorCallback, @@ -136,14 +142,13 @@ void SerialPorts_Init() { tSerialPorts *env = &SERIAL_PORTS; - vSerialPort_InitUSART2(&env->SerialPortLog); - SERIAL_PORTS.SerialPortLog_IO = vSerialPortGetIo(&env->SerialPortLog); - -//// Виртуальный сериал порт + //// Виртуальный сериал порт SerialPortP2p_Init(&env->cliVirtualPort, 4 * 1024, 1024); env->cliVirtualInIo = SerialPortP2p_GetIoFirst(&env->cliVirtualPort); env->cliVirtualOutIo = SerialPortP2p_GetIoSecond(&env->cliVirtualPort); + vSerialPort_InitUSART2(&env->SerialPortLog); + SERIAL_PORTS.SerialPortLog_IO = vSerialPortGetIo(&env->SerialPortLog); }