From bb6604449fab49954277fefe48c25fd9ba5841f9 Mon Sep 17 00:00:00 2001 From: cfif Date: Tue, 23 Sep 2025 17:12:43 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=B0=D1=87=D0=B0=D0=BB=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SerialPorts.c | 461 ++++++++++++++++++++++++++++++++++++++++++++++++++ SerialPorts.h | 50 ++++++ modular.json | 10 ++ 3 files changed, 521 insertions(+) create mode 100644 SerialPorts.c create mode 100644 SerialPorts.h create mode 100644 modular.json diff --git a/SerialPorts.c b/SerialPorts.c new file mode 100644 index 0000000..d4b4d97 --- /dev/null +++ b/SerialPorts.c @@ -0,0 +1,461 @@ +// +// Created by cfif on 05.05.23. +// +#include "SerialPorts.h" +#include "at32f435_437.h" + +tSerialPorts SERIAL_PORTS; + +//void USART3_IRQHandler() { +// vSerialPortIrqProcessing(&SERIAL_PORTS.GONEC1); +//} + +uint8_t buf_USART3_DMA[3200]; + +// IDLE прерывание +void USART3_IRQHandler() { + // Смотрим idle прерывание +// if (usart_flag_get(SERIAL_PORTS.MBEE.uart, USART_IDLEF_FLAG)) { +// // Сброс прерывания +// usart_data_receive(SERIAL_PORTS.MBEE.uart); +// +// vSerialPortIrqProcessingDMAloop(&SERIAL_PORTS.MBEE, SERIAL_PORTS.MBEE.dma_rx_init_struct.buffer_size - +// SERIAL_PORTS.MBEE.dma_channel->dtcnt); +// +// } + SerialPort_IrqProcessing_UartIdle(&SERIAL_PORTS.Rs485); +} + +// RX +void DMA1_Channel3_IRQHandler(void) { +// if (dma_flag_get(DMA1_FDT3_FLAG)) { +// +// vSerialPortIrqProcessingDMAloop(&SERIAL_PORTS.MBEE, +// SERIAL_PORTS.MBEE.dma_rx_init_struct.buffer_size); +// SERIAL_PORTS.MBEE.offset = 0; +// dma_flag_clear(DMA1_FDT3_FLAG); +// } + SerialPort_IrqProcessing_DmaRxLoop(&SERIAL_PORTS.Rs485); +} + +// TX +void DMA1_Channel4_IRQHandler(void) { +// if (dma_flag_get(DMA1_FDT4_FLAG)) { +// dma_flag_clear(DMA1_FDT4_FLAG); +//// osMutexRelease(SERIAL_PORTS.GONEC1.dmaAccess); +// } + SerialPort_IrqProcessing_DmaTx(&SERIAL_PORTS.Rs485); +} + +// Настройка порта радиомодуля +static void vSerialPort_InitUSART3(tSerialPortArtery *env) { + + gpio_init_type GPIO_InitStruct; + gpio_default_para_init(&GPIO_InitStruct); + + GPIO_InitStruct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER; + GPIO_InitStruct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL; + GPIO_InitStruct.gpio_mode = GPIO_MODE_MUX; + GPIO_InitStruct.gpio_pins = GPIO_PINS_10 | GPIO_PINS_11; + GPIO_InitStruct.gpio_pull = GPIO_PULL_NONE; + gpio_init(GPIOC, &GPIO_InitStruct); + + gpio_pin_mux_config(GPIOC, GPIO_PINS_SOURCE10, GPIO_MUX_7); + gpio_pin_mux_config(GPIOC, GPIO_PINS_SOURCE11, GPIO_MUX_7); + + vSerialPortInitDmaWithNameAndSniffer( + env, USART3, 115200, + 1, 3, 1, 4, + false, 0xFF, + buf_USART3_DMA, sizeof(buf_USART3_DMA), + 3200, 3200 + ); + +} + + +/* +//начало------------------------------------Радиомодуль----------------------------------------------------------------- +//начало------------------------------------Радиомодуль----------------------------------------------------------------- +//начало------------------------------------Радиомодуль----------------------------------------------------------------- + +//void USART3_IRQHandler() { +// vSerialPortIrqProcessing(&SERIAL_PORTS.GONEC1); +//} + +uint8_t buf_USART3_DMA[3200]; + +// IDLE прерывание +void USART3_IRQHandler() { + // Смотрим idle прерывание +// if (usart_flag_get(SERIAL_PORTS.MBEE.uart, USART_IDLEF_FLAG)) { +// // Сброс прерывания +// usart_data_receive(SERIAL_PORTS.MBEE.uart); +// +// vSerialPortIrqProcessingDMAloop(&SERIAL_PORTS.MBEE, SERIAL_PORTS.MBEE.dma_rx_init_struct.buffer_size - +// SERIAL_PORTS.MBEE.dma_channel->dtcnt); +// +// } + SerialPort_IrqProcessing_UartIdle(&SERIAL_PORTS.MBEE); +} + +// RX +void DMA1_Channel3_IRQHandler(void) { +// if (dma_flag_get(DMA1_FDT3_FLAG)) { +// +// vSerialPortIrqProcessingDMAloop(&SERIAL_PORTS.MBEE, +// SERIAL_PORTS.MBEE.dma_rx_init_struct.buffer_size); +// SERIAL_PORTS.MBEE.offset = 0; +// dma_flag_clear(DMA1_FDT3_FLAG); +// } + SerialPort_IrqProcessing_DmaRxLoop(&SERIAL_PORTS.MBEE); +} + +// TX +void DMA1_Channel4_IRQHandler(void) { +// if (dma_flag_get(DMA1_FDT4_FLAG)) { +// dma_flag_clear(DMA1_FDT4_FLAG); +//// osMutexRelease(SERIAL_PORTS.GONEC1.dmaAccess); +// } + SerialPort_IrqProcessing_DmaTx(&SERIAL_PORTS.MBEE); +} + +// Настройка порта радиомодуля +static void vSerialPort_InitUSART3(tSerialPortArtery *env) { + gpio_init_type GPIO_InitStruct; + + gpio_default_para_init(&GPIO_InitStruct); + + GPIO_InitStruct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER; + GPIO_InitStruct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL; + GPIO_InitStruct.gpio_mode = GPIO_MODE_MUX; + GPIO_InitStruct.gpio_pins = GPIO_PINS_10 | GPIO_PINS_11; + GPIO_InitStruct.gpio_pull = GPIO_PULL_NONE; + gpio_init(GPIOB, &GPIO_InitStruct); + +// GPIO_InitStruct.gpio_pull = GPIO_PULL_DOWN; + GPIO_InitStruct.gpio_pins = GPIO_PINS_14; + gpio_init(GPIOB, &GPIO_InitStruct); + + gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE10, GPIO_MUX_7); + gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE11, GPIO_MUX_7); + + gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE14, GPIO_MUX_7); +// gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE13, GPIO_MUX_8); + +// vSerialPortInitNameWithSniffer(env, USART3, true, 115200, 0x55, 1024, 1024); +// env->dmaAccess = osMutexNew(NULL); + + +// vSerialPortInitDMAName(env, USART3, DMA1, +// DMA1_CHANNEL3, DMA1MUX_CHANNEL3, DMAMUX_DMAREQ_ID_USART3_RX, DMA1_Channel3_IRQn, +// DMA1_FDT3_FLAG, +// buf_USART3_DMA, sizeof(buf_USART3_DMA), +// DMA1_CHANNEL4, DMA1MUX_CHANNEL4, DMAMUX_DMAREQ_ID_USART3_TX, DMA1_Channel4_IRQn, +// DMA1_FDT4_FLAG, +// false, 9600, 0x59, 3200); + + + vSerialPortInitDmaExtWithNameAndSniffer( + env, USART3, 9600, + 1, 3, 1, 4, + false, USART_HARDWARE_FLOW_RTS, 0x59, + buf_USART3_DMA, sizeof(buf_USART3_DMA), + 3200, 0 + ); + + +} + +void SerialMBEEInit(tSerialPorts *env, uint32_t bt) { + vSerialPortInitDmaExtWithNameAndSniffer( + &env->MBEE, USART3, bt, + 1, 3, 1, 4, + false, USART_HARDWARE_FLOW_RTS, 0x59, + buf_USART3_DMA, sizeof(buf_USART3_DMA), + 3200, 0 + ); + + +} + +//конец-------------------------------------Радиомодуль----------------------------------------------------------------- +//конец-------------------------------------Радиомодуль----------------------------------------------------------------- +//конец-------------------------------------Радиомодуль----------------------------------------------------------------- + + +//начало-------------------------------------ГНСС----------------------------------------------------------------------- +//начало-------------------------------------ГНСС----------------------------------------------------------------------- +//начало-------------------------------------ГНСС----------------------------------------------------------------------- +uint8_t buf_USART2_DMA[100]; + +//void USART2_IRQHandler() { +// vSerialPortIrqProcessing(&SERIAL_PORTS.PRO04); +//} + + +// IDLE прерывание +void USART2_IRQHandler() { + // Смотрим idle прерывание +// if (usart_flag_get(SERIAL_PORTS.PRO04.uart, USART_IDLEF_FLAG)) { +// // Сброс прерывания +// usart_data_receive(SERIAL_PORTS.PRO04.uart); +// +// vSerialPortIrqProcessingDMAloop(&SERIAL_PORTS.PRO04, SERIAL_PORTS.PRO04.dma_rx_init_struct.buffer_size - +// SERIAL_PORTS.PRO04.dma_channel->dtcnt); +// +// } + SerialPort_IrqProcessing_UartIdle(&SERIAL_PORTS.PRO04); +} + + +// RX +void DMA1_Channel6_IRQHandler(void) { +// if (dma_flag_get(DMA1_FDT6_FLAG)) { +// +// vSerialPortIrqProcessingDMAloop(&SERIAL_PORTS.PRO04, +// SERIAL_PORTS.PRO04.dma_rx_init_struct.buffer_size); +// SERIAL_PORTS.PRO04.offset = 0; +// dma_flag_clear(DMA1_FDT6_FLAG); +// } + SerialPort_IrqProcessing_DmaRxLoop(&SERIAL_PORTS.PRO04); +} + +// TX +void DMA1_Channel7_IRQHandler(void) { +// if (dma_flag_get(DMA1_FDT7_FLAG)) { +// dma_flag_clear(DMA1_FDT7_FLAG); +// osMutexRelease(SERIAL_PORTS.PRO04.dmaAccess); +// } + SerialPort_IrqProcessing_DmaTx(&SERIAL_PORTS.PRO04); +} + +// Настройка порта PRO04 +static void vSerialPort_InitUSART2(tSerialPortArtery *env) { + gpio_init_type GPIO_InitStruct; + + gpio_default_para_init(&GPIO_InitStruct); + + GPIO_InitStruct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER; + GPIO_InitStruct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL; + GPIO_InitStruct.gpio_mode = GPIO_MODE_MUX; + GPIO_InitStruct.gpio_pins = GPIO_PINS_2 | GPIO_PINS_3; + GPIO_InitStruct.gpio_pull = GPIO_PULL_NONE; + gpio_init(GPIOA, &GPIO_InitStruct); + + gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE2, GPIO_MUX_7); + gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE3, GPIO_MUX_7); + +// vSerialPortInitName(env, USART2, false, 115200, 0xFF, 256); +// env->dmaAccess = osMutexNew(NULL); + +// vSerialPortInitDMAName(env, USART2, DMA1, +// DMA1_CHANNEL6, DMA1MUX_CHANNEL6, DMAMUX_DMAREQ_ID_USART2_RX, DMA1_Channel6_IRQn, +// DMA1_FDT6_FLAG, +// buf_USART2_DMA, sizeof(buf_USART2_DMA), +// DMA1_CHANNEL7, DMA1MUX_CHANNEL7, DMAMUX_DMAREQ_ID_USART2_TX, DMA1_Channel7_IRQn, +// DMA1_FDT7_FLAG, +// false, 115200, 0xFF, 256); + + vSerialPortInitDmaWithNameAndSniffer( + env, USART2, 115200, + 1, 6, 1, 7, + false, 0xFF, + buf_USART2_DMA, sizeof(buf_USART2_DMA), + 256, 256 + ); + } +//конец--------------------------------------ГНСС----------------------------------------------------------------------- +//конец--------------------------------------ГНСС----------------------------------------------------------------------- +//конец--------------------------------------ГНСС----------------------------------------------------------------------- + + +//начало-------------------------------------Модем----------------------------------------------------------------------- +//начало-------------------------------------Модем----------------------------------------------------------------------- +//начало-------------------------------------Модем----------------------------------------------------------------------- +uint8_t buf_USART1_DMA[2048]; + +//void USART1_IRQHandler() { +// vSerialPortIrqProcessing(&SERIAL_PORTS.GSM); +//} + + +// IDLE прерывание +void USART1_IRQHandler() { + + SerialPort_IrqProcessing_UartIdle(&SERIAL_PORTS.GSM); + // Смотрим idle прерывание +// if (usart_flag_get(SERIAL_PORTS.GSM.uart, USART_IDLEF_FLAG)) { +// // Сброс прерывания +// usart_data_receive(SERIAL_PORTS.GSM.uart); +// +// vSerialPortIrqProcessingDMAloop(&SERIAL_PORTS.PRO04, SERIAL_PORTS.GSM.dma_rx_init_struct.buffer_size - +// SERIAL_PORTS.GSM.dma_channel->dtcnt); +// +// } +} + + +// RX +void DMA1_Channel1_IRQHandler(void) { + SerialPort_IrqProcessing_DmaRxLoop(&SERIAL_PORTS.GSM); + + // if (dma_flag_get(DMA1_FDT1_FLAG)) { +// +// vSerialPortIrqProcessingDMAloop(&SERIAL_PORTS.GSM, +// SERIAL_PORTS.GSM.dma_rx_init_struct.buffer_size); +// SERIAL_PORTS.GSM.offset = 0; +// dma_flag_clear(DMA1_FDT1_FLAG); +// } +} + +// TX +void DMA1_Channel2_IRQHandler(void) { + SerialPort_IrqProcessing_DmaTx(&SERIAL_PORTS.GSM); +// + // if (dma_flag_get(DMA1_FDT2_FLAG)) { +// dma_flag_clear(DMA1_FDT2_FLAG); +//// osMutexRelease(SERIAL_PORTS.PRO04.dmaAccess); +// } +} + +// Настройка порта GSM +static void vSerialPort_InitUSART1(tSerialPortArtery *env) { + gpio_init_type GPIO_InitStruct; + gpio_default_para_init(&GPIO_InitStruct); + + GPIO_InitStruct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER; + GPIO_InitStruct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL; + GPIO_InitStruct.gpio_mode = GPIO_MODE_MUX; + GPIO_InitStruct.gpio_pins = GPIO_PINS_10; + GPIO_InitStruct.gpio_pull = GPIO_PULL_NONE; + gpio_init(GPIOA, &GPIO_InitStruct); + + GPIO_InitStruct.gpio_pins = GPIO_PINS_6; + gpio_init(GPIOB, &GPIO_InitStruct); + + gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE10, GPIO_MUX_7); + gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE6, GPIO_MUX_7); + +// vSerialPortInitName(env, USART1, false, 115200, 0xFF, 256); +// env->dmaAccess = osMutexNew(NULL); + + vSerialPortInitDmaWithNameAndSniffer( + env, USART1, 115200, + 1, 1, 1, 2, + false, 0xFF, + buf_USART1_DMA, sizeof(buf_USART1_DMA), + 1024, 1024 + ); + +// vSerialPortInitDMAName(env, USART1, DMA1, +// DMA1_CHANNEL1, DMA1MUX_CHANNEL1, DMAMUX_DMAREQ_ID_USART1_RX, DMA1_Channel1_IRQn, +// DMA1_FDT1_FLAG, +// buf_USART1_DMA, sizeof(buf_USART1_DMA), +// DMA1_CHANNEL2, DMA1MUX_CHANNEL2, DMAMUX_DMAREQ_ID_USART1_TX, DMA1_Channel2_IRQn, +// DMA1_FDT2_FLAG, +// false, 115200, 0xFF, 256); + +} +//конец--------------------------------------Модем----------------------------------------------------------------------- +//конец--------------------------------------Модем----------------------------------------------------------------------- +//конец--------------------------------------Модем----------------------------------------------------------------------- + + +//начало--------------------------------Командный интерфейс-------------------------------------------------------------- +//начало--------------------------------Командный интерфейс-------------------------------------------------------------- +//начало--------------------------------Командный интерфейс-------------------------------------------------------------- + +uint8_t buf_USART6_DMA[512]; + +//void USART1_IRQHandler() { +// vSerialPortIrqProcessing(&SERIAL_PORTS.GSM); +//} + + +// IDLE прерывание +void USART6_IRQHandler() { + SerialPort_IrqProcessing_UartIdle(&SERIAL_PORTS.ComInt); +} + + +// RX +void DMA2_Channel1_IRQHandler(void) { + SerialPort_IrqProcessing_DmaRxLoop(&SERIAL_PORTS.ComInt); +} + +// TX +void DMA2_Channel2_IRQHandler(void) { + SerialPort_IrqProcessing_DmaTx(&SERIAL_PORTS.ComInt); +} + +// Настройка порта командного интерфейса +static void vSerialPort_InitUSART6(tSerialPortArtery *env) { + gpio_init_type GPIO_InitStruct; + gpio_default_para_init(&GPIO_InitStruct); + + GPIO_InitStruct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER; + GPIO_InitStruct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL; + GPIO_InitStruct.gpio_mode = GPIO_MODE_MUX; + GPIO_InitStruct.gpio_pins = GPIO_PINS_6 | GPIO_PINS_7; + GPIO_InitStruct.gpio_pull = GPIO_PULL_NONE; + gpio_init(GPIOC, &GPIO_InitStruct); + + gpio_pin_mux_config(GPIOC, GPIO_PINS_SOURCE6, GPIO_MUX_8); + gpio_pin_mux_config(GPIOC, GPIO_PINS_SOURCE7, GPIO_MUX_8); + + vSerialPortInitDmaWithNameAndSniffer( + env, USART6, 115200, + 2, 1, 2, 2, + false, 0xFF, + buf_USART6_DMA, sizeof(buf_USART6_DMA), + 1024, 0 + ); + +// vSerialPortInitDMAName(env, USART1, DMA1, +// DMA1_CHANNEL1, DMA1MUX_CHANNEL1, DMAMUX_DMAREQ_ID_USART1_RX, DMA1_Channel1_IRQn, +// DMA1_FDT1_FLAG, +// buf_USART1_DMA, sizeof(buf_USART1_DMA), +// DMA1_CHANNEL2, DMA1MUX_CHANNEL2, DMAMUX_DMAREQ_ID_USART1_TX, DMA1_Channel2_IRQn, +// DMA1_FDT2_FLAG, +// false, 115200, 0xFF, 256); + +} +//конец---------------------------------Командный интерфейс-------------------------------------------------------------- +//конец---------------------------------Командный интерфейс-------------------------------------------------------------- +//конец---------------------------------Командный интерфейс-------------------------------------------------------------- +*/ + +void SerialPorts_Init(tRs485DirectionPins *directionPins) { + tSerialPorts *env = &SERIAL_PORTS; + + vSerialPort_InitUSART3(&env->Rs485); + SERIAL_PORTS.Rs485_IO = vSerialPortGetIo(&SERIAL_PORTS.Rs485); + + SERIAL_PORTS.Rs485_HalfDuplex = vSerialPortHalfDuplexInit(&SERIAL_PORTS.Rs485_IO, + &directionPins->de); + + SERIAL_PORTS.Rs485_HalfDuplexIo = vSerialPortHalfDuplexGetIo(&SERIAL_PORTS.Rs485_HalfDuplex); + +/* + vSerialPort_InitUSART2(&env->PRO04); + SERIAL_PORTS.PRO04IO = vSerialPortGetIo(&SERIAL_PORTS.PRO04); + SERIAL_PORTS.PRO04_snif_IO = vSerialPortGetSnifferIo(&SERIAL_PORTS.PRO04); + + vSerialPort_InitUSART3(&env->MBEE); + SERIAL_PORTS.MBEEIO = vSerialPortGetIo(&SERIAL_PORTS.MBEE); + + vSerialPort_InitUSART1(&env->GSM); + SERIAL_PORTS.GSMIO = vSerialPortGetIo(&SERIAL_PORTS.GSM); + SERIAL_PORTS.GSM_snif_IO = vSerialPortGetSnifferIo(&SERIAL_PORTS.GSM); + + vSerialPort_InitUSART6(&env->ComInt); + SERIAL_PORTS.ComIntIO = vSerialPortGetIo(&SERIAL_PORTS.ComInt); +*/ + SerialPortP2p_Init(&env->cliVirtualPort, 5 * 1024, 1024); + env->cliVirtualInIo = SerialPortP2p_GetIoFirst(&env->cliVirtualPort); + env->cliVirtualOutIo = SerialPortP2p_GetIoSecond(&env->cliVirtualPort); + + SerialPortUsb_Init(&env->SerialPortUsb, 1024); + env->SerialPortUsbIO = SerialPortUsb_GetIo(&env->SerialPortUsb); +} \ No newline at end of file diff --git a/SerialPorts.h b/SerialPorts.h new file mode 100644 index 0000000..aac941d --- /dev/null +++ b/SerialPorts.h @@ -0,0 +1,50 @@ +// +// Created by cfif on 05.05.23. +// + +#ifndef WATER_BOX_BSD_SERIALPORTS_H +#define WATER_BOX_BSD_SERIALPORTS_H + +#include "SerialPortArtery.h" +#include "GpioPin.h" +#include "SerialPortP2p.h" +#include "SerialPort_USB.h" +#include "SerialPortHalfDuplexIO.h" + +typedef struct { + tGpioPin de; +} tRs485DirectionPins; + +typedef struct { + tSerialPortArtery Rs485; + tSerialPortIO Rs485_IO; + + tSerialPortHalfDuplex Rs485_HalfDuplex; + tSerialPortIO Rs485_HalfDuplexIo; +/* + tSerialPortArtery PRO04; + tSerialPortIO PRO04IO; + tSerialPortIO PRO04_snif_IO; + + tSerialPortArtery GSM; + tSerialPortIO GSMIO; + tSerialPortIO GSM_snif_IO; +*/ + tSerialPortArtery ComInt; + tSerialPortIO ComIntIO; + + tSerialPortP2p cliVirtualPort; + tSerialPortIO cliVirtualInIo; + tSerialPortIO cliVirtualOutIo; + + tSerialPortUsbArtery SerialPortUsb; + tSerialPortIO SerialPortUsbIO; + +} tSerialPorts; + +extern tSerialPorts SERIAL_PORTS; + +void SerialPorts_Init(tRs485DirectionPins *directionPins); + + +#endif //WATER_BOX_BSD_SERIALPORTS_H diff --git a/modular.json b/modular.json new file mode 100644 index 0000000..0dd1901 --- /dev/null +++ b/modular.json @@ -0,0 +1,10 @@ +{ + "cmake": { + "inc_dirs": [ + "./" + ], + "srcs": [ + "./**.c" + ] + } +} \ No newline at end of file