/** * Точка входа прошивки. Здесь только порядок запуска и совместное обслуживание модулей. * Настройки оборудования находятся в board.c, обмен — в transport.c, генератор — в wave_hal.c. * Все модели и разбор команд выполняются в главном цикле; ISR обслуживают HAL и передачу байтов. */ #include "board.h" #include "transport.h" #include "emulator.h" #include "usb_cdc.h" #include "wave_output.h" #include "stm32g4xx_hal.h" #if defined(EMU_USB_BOOT_ENABLE) #include "boot_port.h" #endif int main(void) { uint32_t serviced; /* HAL запускает миллисекундный SysTick до настройки PLL: его счётчик нужен таймаутам HAL. */ if (HAL_Init()!=HAL_OK) board_fatal(3); /* Сначала создаём модели и значения по умолчанию, затем настраиваем плату с этими параметрами. */ emu_init(); board_init(); /* Начинаем модельное время после настройки платы, не отрабатывая задержки её инициализации. */ serviced=HAL_GetTick(); /* USB использует отдельный HSI48 с CRS: внешний кварц для USB не нужен. */ if (board_usb_ready()) usb_cdc_init(); for (;;) { uint32_t now=HAL_GetTick(); /* Один пропущенный миллисекундный шаг за проход. Между шагами всегда обслуживаем связь, * чтобы догоняющая обработка модели не вытесняла UART/CAN/USB. */ if (serviced!=now) { ++serviced; board_tick(); } transport_uart_poll(now); transport_can_poll(now); usb_cdc_poll(now); wave_output_poll(); #if defined(EMU_USB_BOOT_ENABLE) g474_reset_poll(now); #endif } }