Описание программного обеспечения
Прошивка 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 контроллером |
| USB | USB 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Загрузка игрового контента через 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 с последующим повторным включением |
| Выключенное состояние | Низкое потребление, пригодное для длительного хранения |
Назначение выводов STM32F411
Таблица 3 — Распиновка микроконтроллера (по HARDWARE.md прошивки)
| Сигнал | Вывод | Назначение |
|---|---|---|
| BAT_STAT | PA0 | ADC1, делитель измерения напряжения АКБ |
| CHRG_STAT | PA1 | Статус заряда (активный низкий) |
| OFF_REQ | PA2 | Запрос выключения от ON/OFF контроллера |
| OFF_ACK | PA3 | Подтверждение выключения от МК |
| CS_D | PA4 | Дисплей: выбор кристалла (SPI1) |
| SCK_D | PA5 | Дисплей: тактирование SPI1 |
| BLK | PA6 | Дисплей: управление подсветкой |
| MOSI_D | PA7 | Дисплей: данные SPI1 |
| AUDIO_PWM | PA8 | ШИМ-аудио (TIM1 CH1) → PAM8302 |
| VBUS | PA9 | Контроль наличия USB (делитель) |
| CE_BTN | PA10 | Джойстик: центр (нажатие) |
| USB D− | PA11 | USB FS DM |
| USB D+ | PA12 | USB FS DP |
| SWDIO | PA13 | Отладка SWD |
| SWCLK | PA14 | Отладка SWD |
| CS_F | PA15 | Flash: выбор кристалла (SPI3) |
| DC | PB0 | Дисплей: данные/команда |
| RST_D | PB1 | Дисплей: сброс |
| AMP_SD | PB2 | Выключение аудиоусилителя |
| SCK_F | PB3 | Flash: тактирование SPI3 |
| MISO_F | PB4 | Flash: вход данных SPI3 |
| MOSI_F | PB5 | Flash: выход данных SPI3 |
| LEFT_BTN | PB6 | Джойстик: влево |
| RIGHT_BTN | PB7 | Джойстик: вправо |
| UP_BTN | PB8 | Джойстик: вверх |
| DOWN_BTN | PB9 | Джойстик: вниз |
| A_BTN | PB12 | Кнопка A |
| B_BTN | PB13 | Кнопка B |
| X_BTN | PB14 | Кнопка X |
| Y_BTN | PB15 | Кнопка Y |