From 484e46119a4e1f7e81fe3d151ad24e2e592922c2 Mon Sep 17 00:00:00 2001 From: cfif Date: Mon, 9 Feb 2026 14:34:23 +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 | 126 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 124 insertions(+), 2 deletions(-) diff --git a/SerialPorts.c b/SerialPorts.c index d66fc0f..d17e858 100644 --- a/SerialPorts.c +++ b/SerialPorts.c @@ -2,7 +2,7 @@ // Created by CFIF on 25.03.24. // #include "SerialPorts.h" - +/* tSerialPorts SERIAL_PORTS; @@ -124,7 +124,129 @@ static void vSerialPort_InitUSART2(tSerialPortFlagchip *env) { } +*/ +tSerialPorts SERIAL_PORTS; + + +uint8_t buf_USART1_TRANSMITTED[256]; +ALIGN(256) uint8_t buf_USART1_DMA[128]; + + +static void DMA_USART1_TransferCompleteCallbackTx() { + SerialPort_TxEndTransmitted(SERIAL_PORTS.SerialPortLog_IO.env, 1); + asm("nop"); +} + +static void DMA_USART1_TransferCompleteCallbackRx() { + SerialPort_RxDmaBufToQueue(SERIAL_PORTS.SerialPortLog_IO.env, true,buf_USART1_DMA); +} + +static void FCUART_IldeInterrupt_CallBack(uint8_t u8UartIndex) { + SerialPort_RxDmaBufToQueue(SERIAL_PORTS.SerialPortLog_IO.env, false,buf_USART1_DMA); + PROCESS_UNUSED_VAR(u8UartIndex) +} + +static void FCUART_ErrorInterrupt_CallBack(uint8_t u8UartIndex, uint32_t u32Error) { + asm("nop"); + PROCESS_UNUSED_VAR(u8UartIndex) + PROCESS_UNUSED_VAR(u32Error) +} + +static void FCUART_TxEmptyInterrupt_CallBack(uint8_t u8UartIndex, FCUART_DataType *pTxData) { + asm("nop"); + PROCESS_UNUSED_VAR(u8UartIndex) + PROCESS_UNUSED_VAR(pTxData) +} + +static void FCUART_TxCompleteInterrupt_CallBack(uint8_t u8UartIndex, FCUART_DataType *pTxData) { + + if (u8UartIndex == SERIAL_PORTS.SerialPortLog.UART_INDEX) { + SerialPort_TxEndTransmitted(SERIAL_PORTS.SerialPortLog_IO.env, 1); + } + + PROCESS_UNUSED_VAR(pTxData) +} + +void FCUART1_RxTx_IRQHandler(void) { + FCUARTN_RxTx_IRQHandler(SERIAL_PORTS.SerialPortLog.UART_INDEX); +} + +// Настройка порта +static void vSerialPort_InitUSART1(tSerialPortFlagchip *env) { + PORT_InitType tInitStruct = {0}; + GPIO_InitType tGpioInitStruct = {0}; + + // Port A19: MUX = ALT3, UART1_RX + tInitStruct.u32PortPins = PORT_PIN_19; + tInitStruct.uPortPinMux.u32PortPinMode = PORTA_19_FCUART1_RX; + PORT_InitPins(PORT_A, &tInitStruct); + + tGpioInitStruct.u32GpioPins = GPIO_PIN_19; + tGpioInitStruct.ePinDirection = GPIO_IN; + GPIO_InitPins(GPIO_A, &tGpioInitStruct); + + // Port A18: MUX = ALT3, UART1_TX + tInitStruct.u32PortPins = PORT_PIN_18; + tInitStruct.uPortPinMux.u32PortPinMode = PORTA_18_FCUART1_TX; + PORT_InitPins(PORT_A, &tInitStruct); + + tGpioInitStruct.u32GpioPins = GPIO_PIN_18; + tGpioInitStruct.ePinDirection = GPIO_OUT; + tGpioInitStruct.ePinLevel = GPIO_HIGH; + GPIO_InitPins(GPIO_A, &tGpioInitStruct); + + vSerialPortInitDMA( + env, + + FCUART1, + 921600,//115200, + + 1, // UART0 = 0 ... UART7 = 7 + FCUART1_IRQn, // FCUART0_IRQn ... FCUART7_IRQn + 0xFF, + + buf_USART1_TRANSMITTED, + sizeof(buf_USART1_TRANSMITTED), + + DMA_CHANNEL_5, + DMA_REQ_FCUART1_RX, + buf_USART1_DMA, + sizeof(buf_USART1_DMA), + DMA5_IRQn, + 0xFF, // IRQ_DMA_PRIORITY + DMA5_IRQn, // IRQ_DMA_CHANNEL_PRIORITY + + DMA_CHANNEL_6, + DMA_REQ_FCUART1_TX, + buf_USART1_DMA, + sizeof(buf_USART1_DMA), + DMA6_IRQn, + 0xFF, // IRQ_DMA_PRIORITY + DMA6_IRQn, // IRQ_DMA_CHANNEL_PRIORITY + + + 1024, + 0, + + DMA_USART1_TransferCompleteCallbackRx, + NULL, + + DMA_USART1_TransferCompleteCallbackTx, + NULL, + + + FCUART_IldeInterrupt_CallBack, + FCUART_ErrorInterrupt_CallBack, + + FCUART_TxEmptyInterrupt_CallBack, + FCUART_TxCompleteInterrupt_CallBack + + + ); + + +} void SerialPorts_Init() { tSerialPorts *env = &SERIAL_PORTS; @@ -141,7 +263,7 @@ void SerialPorts_Init() { // env->cliVirtualInIo = SerialPortP2p_GetIoFirst(&env->cliVirtualPort); // env->cliVirtualOutIo = SerialPortP2p_GetIoSecond(&env->cliVirtualPort); - vSerialPort_InitUSART2(&env->SerialPortLog); + vSerialPort_InitUSART1(&env->SerialPortLog); SERIAL_PORTS.SerialPortLog_IO = vSerialPortGetIo(&env->SerialPortLog); SERIAL_PORTS.SerialPortLog_Sniffer_IO = vSerialPortGetSnifferIo(&env->SerialPortLog); }