RP2350: монитор шины и программатор
Паспорт модуля
| Параметр | Значение |
|---|---|
| Аудитория | 🟡🔴; пройдены М7, М9; базовый Python желателен |
| Аутентичная задача | собрать штатный отладочный контур комплекта: трассировка шины в реальном времени + автозагрузка программ — то, чего нет у Итера и что станет «фишкой» на защите |
| Объём | 4 занятия × 90 мин |
| Оборудование | плата RP2350 (Pico 2-класс), MicroPython или C SDK, соединители, резисторы 1 кОм последовательно в линии (защита), ПК с терминалом |
| Ограничения | RP2350 — 3,3-вольтовое устройство; чтение 5-В шины 74HC — только через делители/буферы; выходы RP2350 в 5-В систему HC читаются как «1» (VIH 3,15 В < 3,3 В), но на пределе — предпочтителен буфер 74HCT |
Техника безопасности стыковки уровней (главный warning модуля): входы RP2350 не толерантны к 5 В. Каждая слушаемая линия шины — через делитель 1,8 кОм / 3,3 кОм (5 В → ≈3,2 В) или через буфер 74LVC245 с питанием 3,3 В (входы LVC толерантны к 5 В). Подключение напрямую = мёртвый GPIO. Проверка мультиметром до первого включения — пункт чек-листа.
Цели
| № | Обучающиеся … | Блум—Андерсон | Миллер | Проверка |
|---|---|---|---|---|
| 1 | объясняют, почему монитор должен быть пассивным и синхронным фронту CLK | понимать | знает | квиз |
| 2 | запускают PIO-захват шины и читают трассу в терминале | применять | показывает как | живой лог эстафеты байта из М7 |
| 3 | пишут скрипт-загрузчик: hex-файл → SRAM (через режим PROG, управляя MAR/данными/WE) | создавать | делает | золотой дамп совпал |
| 4 | согласуют уровни 5 В ↔ 3,3 В и обосновывают схему стыка | применять/оценивать | показывает как | приёмка стыка мультиметром |
Оценивание
Итог: демонстрация двух режимов. Монитор: на однотактном режиме М6 каждая строка лога = один такт, значения совпадают со светодиодами шины. Программатор: файл fib.hex заливается и верифицируется (0 расхождений), время ≤5 с — против 15 минут ручного ввода в М9 (этот контраст — мотивационное ядро модуля).
Путь и ключевые артефакты
| № | Тема | Разминка | Ядро |
|---|---|---|---|
| 1 | Стык уровней | цикл записи SRAM (М9) | расчёт делителя; сборка стыка 8 линий данных + CLK; приёмка |
| 2 | PIO-монитор | 3 вопроса зан. 1 | worked example PIO-программы; лог в терминал |
| 3 | Программатор | схема стыка по памяти | скрипт записи: перебор адресов, выставление данных, импульс /WE через GPIO |
| 4 | Интеграция | кумулятивный квиз М9–М10 | формат .hex курса; верификация; сдача узла в фонд |
Worked example PIO-монитора (MicroPython), захват 8 линий данных по фронту CLK:
import rp2, machine
@rp2.asm_pio(in_shiftdir=rp2.PIO.SHIFT_LEFT, autopush=True, push_thresh=8)
def bus_snoop():
wait(0, pin, 8) # ждём низкий CLK (пин 8 группы)
wait(1, pin, 8) # фронт CLK
in_(pins, 8) # защёлкиваем 8 бит шины -> FIFO
sm = rp2.StateMachine(0, bus_snoop, freq=125_000_000,
in_base=machine.Pin(0)) # GPIO0..7 = D0..D7, GPIO8 = CLK
while True:
print(f"BUS=0x{sm.get() & 0xFF:02X}")Почему PIO, а не «читать GPIO в цикле»: программный опрос из Python пропускает фронты уже на сотнях герц; конечный автомат PIO аппаратно ждёт фронт и защёлкивает шину с наносекундной дисциплиной — тот же принцип «по фронту», что и у триггеров машины (М5). Отладчик подчиняется тем же законам, что и отлаживаемое, — красивое место для рефлексии. 🔴 расширяют захват до 16 линий (данные+адрес) и пишут разборщик трассы «такт → микрооперация».
Типичные ошибки: монитор подключён без общей земли с макеткой — «мусор» в логе (земля объединяется первой, размыкается последней); делитель посчитан, но собран наоборот (на GPIO пришло 5·3,3/(1,8+3,3) вместо 5·… — проверить формулу и мультиметр); программатор дёргает /WE, пока машина в режиме RUN — правило блокировки: тумблер PROG физически отключает УУ от памяти.
Уровни
Монитор 8 линий + загрузчик hex; верифицированная заливка.
Захват 16+ линий, дизассемблер трассы по таблице Я74-ISA, экспорт в файл для «чёрного ящика» дебага М13; оценка максимальной частоты машины, которую монитор успевает логировать по USB.