Skip to content
drewpo28 edited this page Jun 21, 2026 · 3 revisions

Платы и распиновка

Справочная страница · Платы: MURM2, PICO_PC, PICO_DV, ZERO, ZERO2, MURM · Источник истины: раздел GPIO Map в CLAUDE.md

Обзор

pico-spec работает на шести несущих платах семейства Murmulator, построенных вокруг модуля класса Raspberry Pi Pico. Поддерживаются два семейства MCU:

  • RP2350 (новее): MURM2 (RP2350A), PICO_PC (RP2350A), PICO_DV (RP2350), ZERO2 (RP2350B). Больше ОЗУ, больше GPIO и PSRAM — поэтому им достаются тяжёлые функции.
  • RP2040 (исходный): ZERO, MURM. ОЗУ меньше, поэтому ряд функций исключён при компиляции.

О проекте Murmulator. Мурмулятор — открытая «плата для разработки и мурмуляции ретроплатформ», созданная Алексом Екб, который реализовал аппаратную часть и первую прошивку для эмуляции ZX Spectrum. Платы собираются из распространённых недорогих компонентов, с открытыми герберами и исходниками многих прошивок, поэтому их легко собрать самостоятельно. Сообщество поддерживает более десяти платформ (ZX Spectrum, БК 0010, Game Boy, Sega Game Gear / Mega Drive / Master System, NES/Dendy/Famicom и др.); pico-spec — это прошивка ZX Spectrum. См. murmulator.ru, Telegram-группу @ZX_MURMULATOR и файловый архив.

RP2040 против RP2350 — различия возможностей

Возможность RP2040 (ZERO, MURM) RP2350 (остальные четыре)
ОЗУ 256 КБ (≈148 КБ свободной кучи при старте, ≈5 КБ после фреймбуфера) больше; PSRAM на большинстве плат
Сеть (Network) не поддерживается ESP-01S по UART (ZiFi, WiFi, FTP, архивы)
MIDI out не поддерживается (PICO_RP2040=1) да, на пине UART-TX
esxDOS / MB-02+ / Z-Controller / IDE-HDD (Storage) не поддерживается да
RTC / Mr Gluk TimeKeeper не поддерживается да
Машина Profi, ULA+, Gigascreen отключено / ограничено да

На RP2040 память впритык. Из 256 КБ ОЗУ после выделения фреймбуфера 240×320 остаётся лишь ≈5 КБ кучи. Большие статические массивы и тяжёлый по памяти код меню могут сломать эти платы — поэтому SD-дисковые интерфейсы, сеть и RTC доступны только на RP2350.

О заголовках плат в SDK

Сборка выбирает один из двух заголовочных профилей плат Pico-SDK в src/boards/ — это определения кремния, а не дополнительные пользовательские платы:

  • picospec_rp2350b.h — для несущих плат RP2350A/RP2350B (MURM2, PICO_PC, PICO_DV, MURM1_P2). Копия заголовка pico2 из SDK с принудительно включённым вариантом RP2350B (48 GPIO), так что GPIO 30–47 допустимы.
  • waveshare_rp2350_pizero.h — для ZERO2 (Waveshare RP2350-PiZero).

Все функциональные пины задаются явно в CMakeLists.txt для каждой платы, поэтому значения по умолчанию из заголовков неактивны.

Сводка по платам

Плата MCU Диапазон GPIO FIXED / REASSIGN / FREE MIDI NESPAD
MURM2 RP2350A 0–29 15 / 9 / 5 OK (GPIO 22) конфликт с PSRAM (CLK=20, LAT=21)
PICO_PC RP2350A 0–29 13 / 10 / 6 OK (GPIO 26) OK
PICO_DV RP2350 0–29, 47 14 / 8 / 9 БАГ (GPIO 21 = RX!) конфликт с дисплеем (8, 9)
ZERO RP2040 0–28 16 / 8 / 5 нет (RP2040) OK
ZERO2 RP2350B 0–47 14 / 12 / 22 OK (GPIO 22) отключён
MURM RP2040 0–28 18 / 10 / 0 нет (RP2040) OK
  • FIXED — жёстко разведено на плате, изменить нельзя (дисплей, SD-карта, встроенный PSRAM, LED).
  • REASSIGNABLE — сейчас используется, но может быть переназначено/отключено программно (NESPAD, клавиатура, MIDI, звук, WAV-вход, UART ZiFi).
  • FREE — не используется ни одним периферийным устройством.

Карты GPIO по платам

MURM2 — RP2350A (GPIO 0–29)

FIXED = 15 · REASSIGNABLE = 9 · FREE = 5

GPIO Функция Кат. Примечания
0 — FREE
1 — FREE
2 KBD_CLOCK REASSIGN Клавиатура PS/2
3 KBD_DATA REASSIGN Клавиатура PS/2
4 SD MISO FIXED SPI0 на плате
5 SD CS FIXED SPI0 на плате
6 SD SCK FIXED SPI0 на плате
7 SD MOSI FIXED SPI0 на плате
8 BUTTER_PSRAM FIXED Встроенный PSRAM RP2350, XIP CS1
9 Audio DATA / BEEPER / LATCH_595 REASSIGN Тройной алиас (I2S / PWM / 595)
10 Audio BCK / PWM0 / CLK_595 REASSIGN Тройной алиас
11 Audio LCK / PWM1 / DATA_595 REASSIGN Тройной алиас
12–19 VGA / HDMI (8 пинов) FIXED База дисплея = 12; также PSRAM SPI на 18–19
20 PSRAM_MOSI / NES_CLK FIXED Приоритет PSRAM; конфликт NESPAD!
21 PSRAM_MISO / NES_LAT FIXED Приоритет PSRAM; конфликт NESPAD!
22 MIDI_TX / LOAD_WAV_PIO REASSIGN Взаимоисключающие. UART1 TX funcsel 11 — работает
23 — FREE
24 — FREE
25 LED FIXED
26 NES_DATA REASSIGN NESPAD joy1
27 NES_DATA+1 (неявно) REASSIGN NESPAD joy2 (PIO читает DATA+1)
28 — FREE
29 CLK_AY_PIN2 REASSIGN Выход тактовой частоты AY

PICO_PC — RP2350A (GPIO 0–29)

FIXED = 13 · REASSIGNABLE = 10 · FREE = 6

GPIO Функция Кат. Примечания
0 KBD_CLOCK REASSIGN
1 KBD_DATA REASSIGN
2 — FREE Разъём QWST1
3 — FREE
4 SD MISO FIXED SPI0 на плате
5 NES_CLK / LOAD_WAV_PIO REASSIGN Совместно
6 SD SCK FIXED SPI0 на плате
7 SD MOSI FIXED SPI0 на плате
8 BUTTER_PSRAM FIXED Встроенный PSRAM RP2350, XIP CS1
9 NES_LAT REASSIGN
10 — FREE
11 — FREE
12–19 VGA / HDMI (8 пинов) FIXED База дисплея = 12
20 NES_DATA REASSIGN UXT1-3
21 NES_DATA2 REASSIGN UXT1-4
22 SD CS FIXED SPI0 на плате
23 — FREE
24 — FREE
25 LED FIXED
26 BEEPER / LATCH_595 / MIDI_TX REASSIGN UART1 TX funcsel 11 — работает
27 PWM0 / CLK_595 REASSIGN Звук PWM правый
28 PWM1 / DATA_595 REASSIGN Звук PWM левый
29 CLK_AY_PIN2 REASSIGN Выход тактовой частоты AY

PICO_DV — RP2350 (GPIO 0–29 + 47)

FIXED = 14 · REASSIGNABLE = 8 · FREE = 9

GPIO Функция Кат. Примечания
0 ZiFi UART0 TX REASSIGN освобождён от KBD; UART0 TX funcsel 2
1 ZiFi UART0 RX REASSIGN освобождён от KBD; UART0 RX funcsel 2
2 — FREE
3 — FREE
4 — FREE
5 SD SCK FIXED SPI1 на плате
6–13 VGA / HDMI (8 пинов) FIXED База дисплея = 6; NES_CLK=8, NES_LAT=9 конфликт!
14 KBD_CLOCK REASSIGN перенесён с GP0 ради ZiFi
15 KBD_DATA REASSIGN перенесён с GP1 ради ZiFi
16 — FREE
17 — FREE
18 SD MOSI FIXED SPI1 на плате
19 SD MISO FIXED SPI1 на плате
20 LOAD_WAV_PIO / NES_DATA REASSIGN Без USE_NESPAD
21 MIDI_TX / NES_DATA2 REASSIGN БАГ: GPIO 21 нечётный = UART RX, не TX! MIDI не работает
22 SD CS FIXED SPI1 на плате
23 — FREE
24 — FREE
25 LED FIXED
26 Audio DATA / PWM0 / LATCH_595 REASSIGN
27 Audio BCK / PWM1 / CLK_595 REASSIGN
28 Audio LCK / BEEPER / DATA_595 REASSIGN
29 CLK_AY_PIN2 REASSIGN
47 BUTTER_PSRAM FIXED Встроенный PSRAM RP2350B

ZERO — RP2040 (GPIO 0–28)

FIXED = 16 · REASSIGNABLE = 8 · FREE = 5

GPIO Функция Кат. Примечания
0 KBD_CLOCK REASSIGN
1 KBD_DATA REASSIGN
2–5 PSRAM SPI (CS / SCK / MOSI / MISO) FIXED Встроенный PSRAM
6 — FREE
7 CLK_AY_PIN2 / NES_CLK REASSIGN AY + NESPAD совместно (конфликт)
8 NES_LAT REASSIGN
9 NES_DATA (DATA2 = 9) REASSIGN Один джойстик
10 Audio DATA / PWM0 / LATCH_595 REASSIGN
11 Audio BCK / PWM1 / CLK_595 REASSIGN
12 Audio LCK / BEEPER / DATA_595 REASSIGN
13 — FREE
14 — FREE
15 — FREE
16 — FREE
17 LOAD_WAV_PIO REASSIGN Без MIDI (RP2040)
18–21 SD SPI (SCK / MOSI / MISO / CS) FIXED SPI0 на плате
22–28 VGA / HDMI (8 пинов от 22) FIXED Включая LED=25, SMPS=23, VBUS=24

ZERO2 — RP2350B (GPIO 0–47)

FIXED = 14 · REASSIGNABLE = 12 · FREE = 22

GPIO Функция Кат. Примечания
0–1 — FREE PSRAM отключён
2 PCM5122_I2C_SDA REASSIGN Управление ЦАП (если подключён)
3 PCM5122_I2C_SCL REASSIGN
4–6 — FREE NESPAD отключён
7 CLK_AY_PIN2 REASSIGN Выход тактовой частоты AY
8–9 — FREE
10 Audio DATA / PWM0 / LATCH_595 REASSIGN
11 Audio BCK / PWM1 / CLK_595 REASSIGN
12 Audio LCK / BEEPER / DATA_595 REASSIGN
13 — FREE
14 KBD_CLOCK REASSIGN Перенесён с 2/3 ради I2C PCM5122
15 KBD_DATA REASSIGN
16 — FREE
17 LOAD_WAV_PIO REASSIGN Загрузчик WAV
18 PCM5122_I2S_BCK REASSIGN Битовый клок ЦАП
19 PCM5122_I2S_LCK REASSIGN Клок LR ЦАП
20 — FREE Хороший кандидат для MIDI (UART1 TX)
21 PCM5122_I2S_DATA REASSIGN Данные ЦАП
22 MIDI_TX REASSIGN UART1 TX funcsel 11 — работает
23–29 — FREE
30 SD SCK FIXED SPI1, плата Waveshare
31 SD MOSI FIXED
32–39 VGA / HDMI (8 пинов) FIXED База дисплея = 32
40 SD MISO FIXED
41–42 — FREE
43 SD CS FIXED
44–46 — FREE
47 BUTTER_PSRAM FIXED Встроенный PSRAM RP2350B

MURM — RP2040 (GPIO 0–28)

FIXED = 18 · REASSIGNABLE = 10 · FREE = 0

GPIO Функция Кат. Примечания
0 KBD_CLOCK / DBG_UART0_TX REASSIGN DBG_UART=ON → UART0_TX (разъём J6), KBD переходит на GP16/17
1 KBD_DATA / DBG_UART0_RX REASSIGN DBG_UART=ON → UART0_RX
2–5 SD SPI (SCK / MOSI / MISO / CS) FIXED SPI0 на плате
6–13 VGA / HDMI (8 пинов) FIXED База дисплея = 6
14 NES_CLK REASSIGN DBG_UART=ON → NESPAD отключён
15 NES_LAT REASSIGN DBG_UART=ON → NESPAD отключён
16 NES_DATA / KBD_CLOCK (DBG_UART=ON) REASSIGN при DBG_UART=ON: сюда переходит KBD
17 NES_DATA+1 / KBD_DATA (DBG_UART=ON) REASSIGN при DBG_UART=ON: сюда переходит KBD
18–21 PSRAM SPI (CS / SCK / MOSI / MISO) FIXED Встроенный PSRAM; BUTTER = 19
22 MIDI_TX / LOAD_WAV_PIO REASSIGN RP2040: только WAV. RP2350 (MURM_P2): UART1 TX работает
23 — FIXED (RP2040) Питание SMPS на стандартном Pico
24 — FIXED (RP2040) Датчик VBUS на стандартном Pico
25 LED FIXED
26 Audio DATA / PWM0 / LATCH_595 REASSIGN
27 Audio BCK / PWM1 / CLK_595 REASSIGN
28 Audio LCK / BEEPER / DATA_595 REASSIGN
29 CLK_AY_PIN2 REASSIGN RP2040: GPIO29 = ADC3 / VSYS

Известные баги и конфликты

  1. PICO_DV MIDI_TX = GPIO 21 — нечётный GPIO, поэтому аппаратный UART1 даёт RX, а не TX. MIDI на этой плате не работает. Решение: перенести на GPIO 20.
  2. MURM2 NESPAD против PSRAM — NES_CLK=20, NES_LAT=21 пересекаются с PSRAM_MOSI=20, PSRAM_MISO=21. Сосуществовать не могут.
  3. PICO_DV NESPAD против дисплея — NES_CLK=8, NES_LAT=9 попадают в диапазон дисплея (6–13). USE_NESPAD на этой плате правильно не установлен.
  4. MURM2 / MURM MIDI_TX = LOAD_WAV_PIO = 22 — две функции на одном пине (взаимоисключающие). Обработано в коде (предупреждение в messages.h).

MIDI out (RP2350)

MIDI out использует один пин UART-TX. На RP2350 UART TX доступен через два funcsel, и только чётные GPIO могут быть TX — нечётный GPIO даёт RX. Код автоматически выбирает экземпляр UART и funcsel; авторитетный пинмукс берётся из rp2350[ab]_interface_pins.json (старая эвристика (pin/4)%2 была неверна для GPIO 8/10/24/26). Платы RP2040 (ZERO, MURM) не имеют MIDI (PICO_RP2040=1).

Рабочие пины MIDI: MURM2 GPIO 22, PICO_PC GPIO 26, ZERO2 GPIO 22. На PICO_DV не работает (GPIO 21 — см. баг 1 выше).

NESPAD (геймпад NES/SNES)

Интерфейс NESPAD использует 3-проводное чтение сдвигового регистра (CLK / LATCH / DATA, joy2 на DATA+1). Он OK на PICO_PC, ZERO и MURM, отключён на ZERO2 и конфликтует на MURM2 (с PSRAM) и PICO_DV (с дисплеем) — см. список багов выше.

UART ZiFi (сеть RP2350)

UART для сети ESP-01S не имеет определения пинов при компиляции — он выбирается во время выполнения (Config::zifi_tx_pin / zifi_rx_pin, разрешается через BoardPins::resolveZifiPins()). Когда выбранная пара делит пины с другой периферией, при загрузке приоритет у ZiFi, а вытесненная периферия пропускает свою инициализацию. Пары TX/RX по умолчанию для каждой платы:

Плата TX / RX (по умолч.) UART Примечание
PICO_DV 0 / 1 UART0 выделенный разъём ZiFi
MURM2 20 / 21 UART1 занимает пины NESPAD
PICO_PC 20 / 21 UART1 занимает пины NESPAD; альт. 2/3 (QWST1), 10/11
ZERO2 24 / 25 UART1 свободны
MURM-1 (RP2350) 16 / 17 UART0 занимает пины NESPAD

Полная схема подключения и выбор пинов — на странице Network.

Связанные страницы

  • Storage — использование SD-карты (SPI) по платам
  • Network — подключение ESP-01S и выбор пинов UART ZiFi
  • Проект Murmulator (железо, герберы, как собрать/купить/прошить): murmulator.ru · Telegram @ZX_MURMULATOR · файловый архив
  • Справочник разработчика (полная карта GPIO, поддерживается в актуальном виде): CLAUDE.md

Clone this wiki locally