RetroPort

Портативная игровая консоль · ИЭТР

Руководство/Раздел 6

6 Прошивка микроконтроллера

Программное обеспечение RetroPort, архитектура, загрузка прошивки и назначение выводов STM32F411.

Описание программного обеспечения

Прошивка RetroPort — встраиваемое ПО на C/C++ для STM32F411, построенное на графической библиотеке LVGL v9.5. Проект сгенерирован STM32CubeMX, собирается через CMake + Ninja тулчейном arm-none-eabi-gcc.

ПО включает главное меню, каталог эмуляторов, экран загрузки контента и настройки. Поддерживаемые системы:

  • CHIP-8 — интерпретатор с кадровым буфером 64 × 32;
  • SUPER-CHIP (SCHIP 1.1) — расширенный режим;
  • ZX Spectrum 48K — загрузка снимков состояния (.SNA).

Архитектура и периферия

ПодсистемаРеализация
ДисплейДрайвер ST7735S по SPI1, биндинг к LVGL
Внешняя памятьW25Q128 (16 МБ) по SPI3; формат ROM-pack «RPRP»
ВводОпрос активно-низких кнопок и джойстика с антидребезгом и автоповтором
АудиоШИМ TIM1 (PA8) + микшер по прерыванию TIM5, усилитель PAM8302
ПитаниеADC измерения АКБ (PA0), контроль USB/заряда, обмен с ON/OFF контроллером
USBUSB FS, класс CDC — приём ROM-pack по протоколу «C8UP»
НастройкиЖурнал настроек в секторе 0 внешней Flash

Разметка внешней Flash

16 МБ внешней памяти W25Q128 разделены на области:

  • 0…1 МБ — состояние и настройки;
  • 1 МБ…конец — образ ROM-pack с игровым контентом.

Индикация состояния (RGB-светодиод)

ИндикацияСостояние
Пульсирующий синийМК готов к прошивке через USB
Мигающий жёлтыйИдёт запись/чтение внешней памяти
Постоянный зелёныйУстройство подключено к ПК как накопитель
Мигающий красныйСерьёзная ошибка
Медленно пульсирующий фиолетовыйКонсоль включена, в меню или режиме сна

Загрузка прошивки

Через SWD (основной способ)

Для первичной прошивки и отладки используется интерфейс SWD (площадки SWDIO, SWCLK, NRST, 3V3, GND) и программатор ST-Link.

# Сборка прошивки
cmake --preset Release
cmake --build --preset Release

# Прошивка через ST-Link (.hex по адресу 0x08000000)
st-flash --format ihex write build/Release/stm32-proj.hex
Примечание
На плате выведены площадки BOOT0 и кнопка BOOT для принудительного ввода МК в системный загрузчик — резервный способ восстановления при повреждении USB-стека.

Загрузка игрового контента через USB

Игры передаются образом ROM-pack по USB CDC. На стороне ПК используются утилиты из репозитория прошивки (Python).

# Сборка образа ROM-pack из коллекции ROM
python3 tools/pack_rompack.py roms -o build/rompack.bin

# Загрузка образа на устройство по USB CDC
python3 tools/flash_rompack_usb.py build/rompack.bin

Устройство определяется на ПК как виртуальный COM-порт (CDC); драйверы не требуются.

Прошивка контроллера питания (ATTINY13A)

Управление питанием реализовано отдельной микропрограммой для микроконтроллера ATTINY13A (U7) — компактный детерминированный конечный автомат без динамической памяти (около 828 байт Flash и 12 байт ОЗУ, тулчейн avr-gcc). Контроллер работает на частоте 1,2 МГц (внутренний RC-генератор 9,6 МГц с делителем CKDIV8) и держит основной регулятор 3,3 В выключенным в режиме хранения.

Действие пользователяРеакция контроллера
Удержание кнопки PWR (короткий порог)Включение линии EN — подача 3,3 В на систему
Удержание PWR во включённом состоянииЗапрос выключения OFF_REQ → STM32; ожидание подтверждения OFF_ACK, по таймауту — принудительное снятие питания
Длительное удержание PWRАппаратный сброс: кратковременное снятие EN с последующим повторным включением
Выключенное состояниеНизкое потребление, пригодное для длительного хранения
Примечание
Микропрограмма ATTINY13A прошивается отдельно — через выделенные ISP-площадки (MOSI / MISO / SCK / RST) программатором USBasp, а не через интерфейс SWD микроконтроллера STM32. Линии ISP совмещены с рабочими сигналами PWR и OFF_ACK, поэтому при программировании не следует удерживать кнопку PWR.

Назначение выводов STM32F411

Таблица 3 — Распиновка микроконтроллера (по HARDWARE.md прошивки)

СигналВыводНазначение
BAT_STATPA0ADC1, делитель измерения напряжения АКБ
CHRG_STATPA1Статус заряда (активный низкий)
OFF_REQPA2Запрос выключения от ON/OFF контроллера
OFF_ACKPA3Подтверждение выключения от МК
CS_DPA4Дисплей: выбор кристалла (SPI1)
SCK_DPA5Дисплей: тактирование SPI1
BLKPA6Дисплей: управление подсветкой
MOSI_DPA7Дисплей: данные SPI1
AUDIO_PWMPA8ШИМ-аудио (TIM1 CH1) → PAM8302
VBUSPA9Контроль наличия USB (делитель)
CE_BTNPA10Джойстик: центр (нажатие)
USB D−PA11USB FS DM
USB D+PA12USB FS DP
SWDIOPA13Отладка SWD
SWCLKPA14Отладка SWD
CS_FPA15Flash: выбор кристалла (SPI3)
DCPB0Дисплей: данные/команда
RST_DPB1Дисплей: сброс
AMP_SDPB2Выключение аудиоусилителя
SCK_FPB3Flash: тактирование SPI3
MISO_FPB4Flash: вход данных SPI3
MOSI_FPB5Flash: выход данных SPI3
LEFT_BTNPB6Джойстик: влево
RIGHT_BTNPB7Джойстик: вправо
UP_BTNPB8Джойстик: вверх
DOWN_BTNPB9Джойстик: вниз
A_BTNPB12Кнопка A
B_BTNPB13Кнопка B
X_BTNPB14Кнопка X
Y_BTNPB15Кнопка Y
Внимание
Режим USB Mass Storage (определение как флеш-накопитель) предусмотрен техническим заданием как целевая функция. В текущей версии прошивки загрузка контента реализована через USB CDC. Возможности могут быть расширены в последующих версиях ПО.

Портативная игровая консоль на базе STM32 (RetroPort)

Обозначение: МИЭМ.466210.001 · ИЭТР 3 класса интерактивности (Р 50.1.029, ГОСТ Р 54088-2017)

Разработчики: Мухаметдинов Б., Левинтан Д., Рабынин М., Слетков А., Матвеев Е., Панов Е. — МИЭМ НИУ ВШЭ, 2026. Заказчик: Полесский С. Н.