Преобразователь RGB в VGA на STM32F405

Уже десять или двадцать лет назад программисты научились формировать видеосигнал на микроконтроллере. Обычно для этого использовали SPI контроллер. Это такая штука, которая равномерно бит за битом передает данные из оперативной памяти на вывод микроконтроллера. Данные для отправки по SPI подготавливаются блоком и пока этот блок отправляется, процессор может заняться другими делами.

STM32F103


Я подумал, а можно ли использовать два SPI контроллера, по одному данные загружать со скоростью обычного телевизора, а по другому выгружать со скоростью VGA? Т.е. записать в память микроконтроллера STM32 поток данных (видеовыход) с тактовой частотой 10 МГц (для Ориона 128, там разрешение 384x256 50 Гц), а затем выдать его с частотой 18 МГц (VGA 800x600 56 Гц).

Я попробовал. Я использовал самый дешевый и массовый МК STM32F103 стоимостью 35 рублей (в Китае и давно). На STM32F405 я перешел позже.

Гашение от компьютера Ориона 128 я подключил на SPI CS. Зеленый цвет на SPI MOSI. Тактовую частоту со сдвигового регистра Ориона на SPI CLK. По таймеру я проверял, закончилась ли загрузка строки (есть ли гашение).

На выходном SPI контроллере тактовый сигнал генерируется отдельным таймером. Сам SPI контроллер из-за загруженности шины процессора выдает данные с еле заметным джиттером (пиксели дрожжат). Отдельный таймер для формирования тактового сигнала SPI решает эту проблему. И к тому же этот таймер отсчитывает строку изображения и в конце строки генерирует прерывание. Это позволяет процессору неспешно настроить адрес следующей строки.

На удивление это заработало быстро и без проблем.



Полоски на изображении это убитая К565РУ5 на плате компьютера Орион.





Интересно то, что все тактовые сигналы, строчный, кадровый, гашение сформированы аппаратно. Внутри микроконтроллера STM32 много таймеров и DMA контроллеров, которые можно между собой соединять. Процессору только сообщается с помощью прерываний, что надо указать адрес загрузки для следующей строки изображения с ретрокомпьютера. Или что надо указать адрес для выгрузки следующей строки изображения на VGA монитор. И даже это можно автоматизировать. Просто поручить DMA контроллеру копировать настройки из ПЗУ в управляющие регистры периферии по какому то событию.

Желтый — ССИ
Голубой — тактовый сигнал SPI
Эти сигналы формируются без участия программы.



Взаимодействие периферии внутри микроконтроллера STM32F103



STM32F405


Дальше я решил добавить цвет. До этого я записывал только черно-белое изображение. У микроконтроллера STM32F103 не хватило оперативной памяти, что бы записать цветную картинку, поэтому я перешел на STM32F405. Теперь будет STM32F405, цена 250 рублей, скорость 168 МГц, ОЗУ 192 Кб, ПЗУ 1 Мб.

SPI контроллер я заменил на GPIO. Т.е. микроконтроллер по внешнему тактовому сигналу сохраняет 8 бит со своих выводов в оперативную память, а потом по собственному аппаратному таймеру выводит 8 бит из памяти на свои выводы.

И это тоже получилось.





Полосочки я выводил для настройки частоты и фазы пикселей на VGA. Оказывается, что мой монитор захватывает 800x600 как 800x600, а уже потом масштабирует его в 1920x1080. Если указать немного не ту частоту писклей, то некоторые пиксели дублируются или пропадают.

В микронтроллере STM32 у DMA еще нашлись FIFO буферы, которые полностью устраняют джиттер. Захват и вывод видеосигнала происходит почти аппаратно, 32-х битный процессор с частотой 168 МГц практически бездействует. Я думал поручить этому МК еще одну задачу, обрабатывать USB клавиатуру. Но перестал работать китайский телевизор и проект я отложил на потом. В составе Ориона 128 этот преобразовать вроде бы работает, но причесать все исходники и выложить в открытый доступ я не успел.

2 комментария

avatar
Супер! А не пробовали подключать ли к этому конвертору другие компьютеры? Особенно интересует УКНЦ!
  • SAA
  • 0
avatar
Возможно, что в оригинальном виде этот контроллер укнц не потянет, так как контроллер сохраняет по 8 бит. Разрешение 640х288х8 это весь объем ОЗУ микроконтроллера.

Но можно попробовать добавить сжатие 8 бит в 4 бита. Тогда ОЗУ хватит. После получения данных сжимать их, а перед отправкой разжимать.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.