40 lines
2.0 KiB
C
40 lines
2.0 KiB
C
/**
|
||
* Точка входа прошивки. Здесь только порядок запуска и совместное обслуживание модулей.
|
||
* Настройки оборудования находятся в 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
|
||
}
|
||
}
|