// // Created by xemon on 29.08.22. // #include "SerialPorts.h" #include "SerialPort.h" #include "CanSerialPorts.h" tSerialPorts SERIAL_PORTS; uint8_t buf_UART1_DMA[128]; uint8_t buf_UART2_DMA[128]; uint8_t buf_UART4_DMA[128]; void vSerialPorts_InitRCC() { //Включаем тактирование шины APB1 для устройств USART2, UART4 //Enable clock APB1 for USART2, UART4, UART5 RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_USART2, ENABLE); RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_UART4, ENABLE); #ifdef USE_GSM_AND_GNSS_SIMCOM RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_UART5, ENABLE); #endif //Включаем тактирование шины APB2 для устройств AFIO, USART1 //Enable clock APB1 -> AFIO, USART1 RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_AFIO, ENABLE); RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_USART1, ENABLE); } static void vSerialPort_InitUART1(tSerialPortNation *env, tGpioPin *transmitePin, tGpioPin *recivePin) { GPIO_ConfigPinRemap(GPIO_RMP_USART1, ENABLE); //Init UART1 Rx Pin GpioPin_InitConfigOnly(GPIOB, GPIO_PIN_7, GPIO_Mode_IN_FLOATING, GPIO_INPUT); //Init UART1 Tx Pin GpioPin_InitConfigOnly(GPIOB, GPIO_PIN_6, GPIO_Mode_AF_PP, GPIO_Speed_50MHz); GpioPinSet(transmitePin, false); GpioPinSet(recivePin, false); // SerialPort_InitName(env, USART1, 115200, 0xFF, 1024); vSerialPortInitDMA(env, USART1, DMA1, DMA1_CH5, DMA1_Channel5_IRQn, DMA1_INT_TXC5, DMA1, DMA1_CH4, DMA1_Channel4_IRQn, DMA1_INT_TXC4, buf_UART1_DMA, sizeof(buf_UART1_DMA), 115200, USART1_IRQn , 0xFF, 512, 0 ); } static void vSerialPort_InitUART2(tSerialPortNation *env) { GPIO_ConfigPinRemap(GPIO_RMP1_USART2, ENABLE); //Init UART2 Rx Pin GpioPin_InitConfigOnly(GPIOD, GPIO_PIN_6, GPIO_Mode_IN_FLOATING, GPIO_INPUT); //Init UART2 Tx Pin GpioPin_InitConfigOnly(GPIOD, GPIO_PIN_5, GPIO_Mode_AF_OD, GPIO_Speed_50MHz); // vSerialPortInitNameWithSniffer(env, USART2, 115200, 0xFF, 1024, 1024); vSerialPortInitDMA(env, USART2, DMA1, DMA1_CH6, DMA1_Channel6_IRQn, DMA1_INT_TXC6, DMA1, DMA1_CH7, DMA1_Channel7_IRQn, DMA1_INT_TXC7, buf_UART2_DMA, sizeof(buf_UART2_DMA), 115200, USART2_IRQn , 0xFF, 512, 512 ); } static void vSerialPort_InitUART4(tSerialPortNation *env) { //Init UART4 Rx Pin GpioPin_InitConfigOnly(GPIOC, GPIO_PIN_11, GPIO_Mode_IN_FLOATING, GPIO_INPUT); //Init UART4 Tx Pin GpioPin_InitConfigOnly(GPIOC, GPIO_PIN_10, GPIO_Mode_AF_PP, GPIO_Speed_50MHz); SerialPort_InitName(env, UART4, 115200, 0xFF, 1024); vSerialPortInitDMA(env, UART4, DMA2, DMA2_CH3, DMA2_Channel3_IRQn, DMA2_INT_TXC3, DMA2, DMA2_CH5, DMA2_Channel5_IRQn, DMA2_INT_TXC5, buf_UART4_DMA, sizeof(buf_UART4_DMA), 115200, UART4_IRQn, 0xFF, 512, 0 ); } void USART2_IRQHandler() { // vSerialPortIrqProcessing(&SERIAL_PORTS.TelitPort); SerialPort_IrqProcessing_UartIdle(&SERIAL_PORTS.TelitPort); } /// UUSSBB void USART1_IRQHandler() { // vSerialPortIrqProcessing(&SERIAL_PORTS.ComIntPort); SerialPort_IrqProcessing_UartIdle(&SERIAL_PORTS.ComIntPort); } void UART4_IRQHandler() { // vSerialPortIrqProcessing(&SERIAL_PORTS.DebugPort); SerialPort_IrqProcessing_UartIdle(&SERIAL_PORTS.DebugPort); } void DMA1_Channel5_IRQHandler(){ SerialPort_IrqProcessing_DmaRxLoop(&SERIAL_PORTS.ComIntPort); } void DMA1_Channel4_IRQHandler(){ SerialPort_IrqProcessing_DmaTx(&SERIAL_PORTS.ComIntPort ); } void DMA1_Channel6_IRQHandler(){ SerialPort_IrqProcessing_DmaRxLoop(&SERIAL_PORTS.TelitPort); } void DMA1_Channel7_IRQHandler(){ SerialPort_IrqProcessing_DmaTx(&SERIAL_PORTS.TelitPort ); } void DMA2_Channel3_IRQHandler() { SerialPort_IrqProcessing_DmaRxLoop(&SERIAL_PORTS.DebugPort); } void DMA2_Channel5_IRQHandler() { SerialPort_IrqProcessing_DmaTx(&SERIAL_PORTS.DebugPort); } void SerialPorts_Init(tRs485DirectionPins *power) { tSerialPorts *env = &SERIAL_PORTS; vSerialPorts_InitRCC(); vSerialPort_InitUART1(&env->ComIntPort, &power->transmit, &power->receive); vSerialPort_InitUART2(&env->TelitPort); vSerialPort_InitUART4(&env->DebugPort); env->ComIntIO = SerialPort_GetIo(&env->ComIntPort); env->TelitIO = SerialPort_GetIo(&env->TelitPort); env->TelitIOSniffer = SerialPort_GetSnifferIo(&env->TelitPort); env->DebugIO = SerialPort_GetIo(&env->DebugPort); env->ComIntHalfDuplex = vSerialPortHalfDuplexInit(&env->ComIntIO, &power->transmit, &power->receive); env->ComIntHalfDuplexIo = vSerialPortHalfDuplexGetIo(&env->ComIntHalfDuplex); SerialPortP2p_Init(&env->cliVirtualPort, 1 * 1024, 512); env->cliVirtualInIo = SerialPortP2p_GetIoFirst(&env->cliVirtualPort); env->cliVirtualOutIo = SerialPortP2p_GetIoSecond(&env->cliVirtualPort); SerialPortUsb_Init(&env->SerialPortUsb, 1024); env->SerialPortUsbIO = SerialPortUsb_GetIo(&env->SerialPortUsb); vCanSerialPorts_InitRCC(); CanHWControlSet(); vCanSerialPort_InitCAN1(&env->SerialPortFrameCan1); vCanSerialPort_InitCAN2(&env->SerialPortFrameCan2); env->SerialPortFrameCan2IO = CanPortFrame_GetIo(&env->SerialPortFrameCan2); }