Захват видеосигнала от ZX Spectrum при помощи STM32F4.

Есть у меня ZX Spectrum. Захотелось мне получить с него именно цветное изображение. Телевизора с подходящим SCART разъемом у меня нет, а покупать какие-либо переходники — не наш путь:) Так что я решил собрать на базе STM32F429 собственной конвертер, способный формировать VGA видеосигнал. Делалось это в первую очередь для самообразования.

В свое время я купил китайский модуль Core429I на базе STM32F429:

У этого модуля есть определенный недостаток — шаг выводов разъема 2 мм, что отличается от разъемов с шагом 2.54 мм, которые обычно устанавливают на отладочные платы.

Так как я все равно покупал этот модуль для экспериментов с формированием видеосигнала на микроконтроллере, то я изготовил специальную отладочную плату, содержащую VGA разъем, R-2R ЦАП подключенный к выводам LTDC контроллера, разъем шины DCMI (для подключения видеокамеры), несколько отладочных разъемов.

Структурная схема этой отладочной платы:

Мне удалось успешно запустить формирование VGA видеосигнала (16-bit 640x480) при помощи этой платы, также успешно заработала и видеокамера на базе сенсора OV7670, подключенная к контроллеру. Если кого заинтересуют примеры кода — то они выложены тут.
Дальше я захотел подключить к этой плате ZX Spectrum.

Цветной видеосигнал Спектрум передает по четырем цифровым линиям — 3 линии на цвет и одна линия синхронизации (содержит стандартные телевизионные сигналы кадровой и строчной синхронизации).

Вот так выглядит сигнал синхронизации (в центре — кадровый гасящий импульс):


А вот вид линии синхронизации и одной из линий цвета:


Важный вопрос — какой интерфейс использовать для захвата таких данных. Можно было бы попробовать использовать DCMI, но этот интерфейс требует внешнего тактового сигнала, который пришлось бы выводить со Спектрума. Мне этот вариант не понравился, так что я решил попробовать использовать захват данных при помощи связки таймера, DMA и GPIO.
В таком случае для захвата данных в ОЗУ нужно настроить модуль DMA так, чтобы он копировал данные из GPIO в ОЗУ, используя к качестве триггера сигнал от одного из таймеров.

Здесь стоит обратить внимание на одну важную особенность контроллеров STM32F4 — в контроллере есть два модуля DMA, и только контроллер DMA2 имеет доступ к периферийным модулям, находящимся на шине AHB1. Модули GPIO соединены именно с шиной AHB1.
Следовательно, для захвата данных можно использовать только DMA2. Запросы передачи данных для этого DMA могут формировать только два таймера — TIM1 и TIM8. Я решил использовать второй из них.

Выбранный таймер должен должен быть синхронизирован с сигналом синхронизации от Спектрума. Для этого я завел этот сигнал на вход канала 1 TIM8, а сам таймер настроен на работу в режиме — «Gated». Это значит, что таймер работает только тогда, когда на линии синхронизации высокий уровень (то есть в то время, когда нужно захватывать данные). Кроме того, этот таймер настроен на формирование прерываний по отрицательному и положительному фронту сигнала синхронизации.
В прерывании по отрицательному фронту происходит сброс значения таймера TIM8 (к этому моменту он уже остановлен из-за «Gated» режима). За счет этого, после появления положительного фронта синхронизации таймер всегда начинает счет с 0.

Прерывания по положительному фронту сигнала используются для обнаружения кадровых импульсов. Для этого измеряется время время между положительным и отрицательным фронтами сигнала синхронизации — во время кадровых импульсов это время становится маленьким.
Для измерения этого времени я использую отделенный таймер.
Логика программы, анализируя это время, определяет номер текущей захватываемой строки, что очень важно для правильного вывода изображения на экран.

Для вывода захваченного сигнала на экран используется двойная буферизация — в то время, когда сигнал одной линии захватывается при помощи DMA в ОЗУ, данные о предыдущей захваченной линии копируются в видеобуфер основной программой. При этом нужно производить перекодирование захваченных данных в необходимый цвет пикселя.

Фотографии работы конвертера:
Экран загрузки ZX Spectrum:
image

Общий вид конструкции:
image

Загрузка Tetris:
image

Scorched Earth:
image

Fighter Pilot:
image

Исходный код проекта: github.com/iliasam/zx_to_vga
  • +1
  • 18 марта 2018, 18:06
  • citizen

Комментарии (8)

RSS свернуть / развернуть
Спектрум формирует цветные сигналы. Что мешало напрямую подать их на монитор?
0
Частоты спектрума и VGA монитора не совпадают.
0
Фотографии работы конвертера не возможно просмотреть(
0
  • avatar
  • Aneg
  • 19 марта 2018, 13:15
Не очень понял, последние 5 фотографий совсем не отображаются?
0
Да, именно так(
0
Проверил в нескольких браузерах, и с использованием Opera VPN — везде работает.
0
У него яндекс заблокирован.
0
Да и вообще, миниатюры лучше залить прямо сюда.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.