109 lines
4.2 KiB
C
109 lines
4.2 KiB
C
//
|
||
// Created by villuton on 26.08.2025.
|
||
//
|
||
#include "SerialPorts.h"
|
||
#include "at32f403a_407.h"
|
||
|
||
tSerialPorts SERIAL_PORTS;
|
||
|
||
///начало----------------------------------Командный интерфейс----------------------------------------------------------
|
||
///начало----------------------------------Командный интерфейс----------------------------------------------------------
|
||
///начало----------------------------------Командный интерфейс----------------------------------------------------------
|
||
|
||
///Буфер порта
|
||
uint8_t buf_USART1_DMA[1024];
|
||
|
||
/// IDLE прерывание
|
||
void USART1_IRQHandler() {
|
||
// Смотрим idle прерывание
|
||
if (usart_flag_get(SERIAL_PORTS.comint.uart, USART_IDLEF_FLAG)) {
|
||
// Сброс прерывания
|
||
usart_data_receive(SERIAL_PORTS.comint.uart);
|
||
|
||
vSerialPortIrqProcessingDMAloop(&SERIAL_PORTS.comint, SERIAL_PORTS.comint.dma_init_struct.buffer_size -
|
||
SERIAL_PORTS.comint.dma_channel->dtcnt);
|
||
|
||
}
|
||
}
|
||
|
||
/// RX
|
||
void DMA1_Channel3_IRQHandler(void) {
|
||
if (dma_flag_get(DMA1_FDT3_FLAG)) {
|
||
|
||
vSerialPortIrqProcessingDMAloop(&SERIAL_PORTS.comint,
|
||
SERIAL_PORTS.comint.dma_init_struct.buffer_size);
|
||
SERIAL_PORTS.comint.offset = 0;
|
||
dma_flag_clear(DMA1_FDT3_FLAG);
|
||
}
|
||
}
|
||
|
||
/// TX
|
||
void DMA1_Channel4_IRQHandler(void) {
|
||
if (dma_flag_get(DMA1_FDT4_FLAG)) {
|
||
dma_flag_clear(DMA1_FDT4_FLAG);
|
||
}
|
||
}
|
||
|
||
/// Настройка порта
|
||
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_9 | GPIO_PINS_10;
|
||
GPIO_InitStruct.gpio_pull = GPIO_PULL_NONE;
|
||
gpio_init(GPIOA, &GPIO_InitStruct);
|
||
|
||
vSerialPortInitDMA(env,
|
||
USART1,
|
||
DMA1,
|
||
DMA1_CHANNEL3,
|
||
FLEX_CHANNEL3,
|
||
DMA_FLEXIBLE_UART1_RX,
|
||
buf_USART1_DMA,
|
||
sizeof(buf_USART1_DMA),
|
||
DMA1_Channel3_IRQn,
|
||
false,
|
||
115200,
|
||
USART1_IRQn,
|
||
CRM_USART1_PERIPH_CLOCK,
|
||
0x59,
|
||
1024,
|
||
0
|
||
);
|
||
|
||
|
||
}
|
||
|
||
///конец-----------------------------------Командный интерфейс----------------------------------------------------------
|
||
///конец-----------------------------------Командный интерфейс----------------------------------------------------------
|
||
///конец-----------------------------------Командный интерфейс----------------------------------------------------------
|
||
|
||
|
||
/**
|
||
* Инициализация серийного порта, RS485
|
||
* @param *directionPins tRS485DirectionPins
|
||
*/
|
||
void SerialPorts_Init(tRS485DirectionPins *directionPins) {
|
||
tSerialPorts *env = &SERIAL_PORTS;
|
||
|
||
/// USART1 КОМАНДНЫЙ ИНТЕРФЕЙС
|
||
vSerialPort_InitUSART1(&env->comint);
|
||
SERIAL_PORTS.comint_IO = vSerialPortGetIo(&SERIAL_PORTS.comint);
|
||
|
||
/// Полудуплекс RS485
|
||
SERIAL_PORTS.comInt_HD = vSerialPortHalfDuplexInit(&SERIAL_PORTS.comint_IO,
|
||
&directionPins->reDePin,
|
||
&directionPins->reDePin);
|
||
SERIAL_PORTS.comint_HD_IO = vSerialPortHalfDuplexGetIo(&SERIAL_PORTS.comInt_HD);
|
||
|
||
/// TODO Удалить виртуальные порты, если не будет сервисной программы
|
||
/// Виртуальные порты для сервисной программы (потенциально)
|
||
SerialPortP2p_Init(&env->cliVirtualPort, 1 * 1024, 1024);
|
||
env->cliVirtualInIo = SerialPortP2p_GetIoFirst(&env->cliVirtualPort);
|
||
env->cliVirtualOutIo = SerialPortP2p_GetIoSecond(&env->cliVirtualPort);
|
||
|
||
} |