Ранее я писал о «приобщении» к микроконтроллерам stm32, и о проблемах, вызванных браком платы на основе stm32f401ccu6 ( статья ). Точнее «мертвыми» выводами контроллера (В15, A8-A11), и в связи с этим отсутствием USB порта и вытекающими неудобствами. Будем считать, что Вы имеете способ программировать контроллер тем или иным способом.
Основная цель проведенной работы описанной в данной статье для меня — более или менее разобраться с программированием контроллеров stm32 с помощью «родного» stm32CubeIDE, дающего больше возможностей в использовании ресурсов контроллера, и упрощающего отладку кода. Все таки stm32 в ArduinoIDE — «за уши» притянутый инструмент. Нет смысла писать «мигалку» диодом — поэтому ставим более интересную задачу: получить простенький «осциллограф» с выходом видеосигнала для просмотра на маленьком телевизоре (недавно писал статью о переделке на светодиодную подсветку 7″ «Vitek», статья ). Похожая идея с реализацией аналоговой входной части осциллографа описана здесь .
Как подключить матрицу от ноутбука к STM32
В этой статье аналоговая входная часть осциллографа не описывается, и буду ли я доводить проект до состояния законченного инструмента — сказать не могу. В городе осциллограф есть, на даче хватает моей самоделки . В этой части статьи речь пойдет только о формировании видеосигнала. Во второй части статьи речь пойдет о осциллографе.
Примеры реализации формирования видеосигнала можно глянуть в этой стать е, интересный проект и пример кода формирования радиочастотного модулированного сигнала описан здесь , а здесь еще и цвет добавился, правда VGA. Ну а за основу был взят проект от команды Аrtekit ( здесь статья, код). Не возможно не упомянуть проект от Tomakichi .
Итак, видеосигнал. На этот счет есть ГОСТ 7845-92. На рисунке 1 и 2 показан строчный и кадровый импульс, с указанными длительностями периодов. У нас 625 строк, два поля, частота кадровых импульсов — 50 Гц, частота строчных импульсов — 15625 Гц, размах — 1 В. Итого период следования строчных импульсов — 64 мкс, кадровых — 20 мс.
Источник: dzen.ru
Используйте 36-контактный STM32 для вывода VGA
Под рукой есть проект, который должен управляться однокристальным микрокомпьютером для отображения изображения на ЖК-дисплее. Некоторое время я поискал в Интернете и обнаружил, что все это было сделано с использованием FPGA.
Вначале я был не очень знаком с FPGA, и я использовал серию ARM.Наконец, я нашел часть информации, которая, по крайней мере, сейчас кажется весьма ценной.
Так как он на английском языке, пожалуйста, сначала переведите его сюда (Исходная ссылка)。
При мысли о старых видеоиграх и аркадных играх, в которые я играл раньше (давным-давно, примерно в 70-80-х годах), мне в голову пришла идея:
Если сегодня, можем ли мы использовать относительно недорогой микроконтроллер для реализации игр, в которые мы играли раньше?
STM32 + Дисплей ST7789. Быстрая и компактная библиотека.
Первоначальное предназначение этих микроконтроллеров не предназначено для этих вещей, поэтому возникает проблема:
Как выводить видеосигналы на монитор с небольшим количеством внешних компонентов или без них?
Мы выбрали 36-контактный, 72 МГц STM32 (STM32F103T8U6),
Достаточно генерировать черно-белые видеосигналы и точечные сигналы, а также использовать некоторые таймеры и SPI (таким образом, обновление буфера кадра происходит автоматически),
На мониторе с разрешением 400 * 200 выходной видеосигнал VGA выглядит весьма впечатляюще.
Используемые материалы:
1 плата разработки STM32F103T8U6 (или того же типа Совет по развитию). Мы используем AK-STM32-LKIT.
2 Один женский порт VGA (DB15)
Хотя размер буфера кадра составляет 400 * 200, выходное разрешение составляет 800 * 600 (частота обновления 56 Гц),
Мы используем метод рисования горизонтальной точки дважды и вертикальной точки трижды, чтобы добиться увеличения разрешения.
Причина, по которой мы выбираем 800 × 600 при 56 Гц, связана с тактовой частотой пикселей;
Выходное разрешение использует частоту пикселей 36 МГц, период кратен 72 МГц (частота STM32),
Поскольку нам нужно использовать SPI для генерации сигналов пикселей, мы можем предварительно масштабировать частоту STM32, чтобы получить тактовую частоту пикселей 18 МГц.
Затем нарисуйте каждый пиксель дважды, конкретный метод состоит в том, чтобы вывести пиксель сигнала, когда 800 пикселей в горизонтальном направлении,
Сигнал MOSI SPI остается низким или высоким в течение вдвое большего времени (по сравнению со временем, которое потребовалось для рисования точки раньше).
Буфер кадра представляет собой массив 52 × 200 байт. Каждая строка имеет 50 * 8 = 400 пикселей (каждый бит — пиксель),
Оставшиеся два байта (52-50) имитируют интервал гашения каждой строки.
#define VID_VSIZE 200 #define VID_HSIZE 50 __align(4) u8 fb[VID_VSIZE][VID_HSIZE+2];
Данные, записанные в этом блоке оперативной памяти, будут выводиться на экран, а для DMA устанавливается значение Автоматически считывать данные из буфера данных и выводить их на вывод MOSI SPI.
Горизонтальная синхронизация
Сигнал горизонтального синхронизма и время задней площадки генерируются каналами 1 и 2, генерируемыми таймером TIM1, а канал 1, генерируемым таймером TIM1, подключен к PA8.
H-SYNC, который является каналом 1 таймера TIM1, будет генерировать сигнал горизонтальной синхронизации для дисплея.
H-BACKPORCH — это канал 2 таймера TIM1, который вычисляет сумму времени горизонтальной синхронизации и времени задержки,
Этот таймер генерирует прерывание, чтобы DMA запускал отправку пиксельного запроса через SPI.
Каждая строка в буфере кадра будет повторять этот процесс,
Вертикальная синхронизация
Таймер TIM2 используется для генерации сигнала вертикальной синхронизации, но находится в ведомом режиме.
TIM2 подсчитывает количество импульсов H-SYNC, генерируемых хостом (TIM1).
Канал 2 TIM2 выводит сигнал V-SYNC через PA1.
Канал 3 TIM2 вызовет прерывание, когда счетчик таймера достигнет значения V-SYNC и времени вертикального заднего фронта.
Это прерывание установит переменную, чтобы указать, что сканируется допустимый кадр, и DMA может начать отправку пикселей на экран.
Генератор пикселей
Пиксели производятся SPI MOSI (PA7).
Таймер Канал 2 TIM1 Создается прерывание, чтобы разрешить запросу DMA TX отправить данные в SPI.
DMA прочитает одну строку из буфера кадра и поместит данные в регистр DR SPI.
DMA настроен для генерации прерывания после отправки строки сигналов, и номер строки увеличивается.
Поскольку мы отправляли каждую строку три раза, мы увеличили счетчик на единицу в прерывании.
Когда отправляются три строки данных, мы указываем указатель DMA на буфер кадра следующей строки.
Когда все строки отправлены, DMA отключается до тех пор, пока не произойдет следующее допустимое прерывание одного кадра ( TIM2 канал 3 )。
связь
Для выполнения этой работы вам понадобится всего несколько кабелей DuPont и гнездовой интерфейс VGA.
Стандарт VGA говорит, что выходной сигнал должен быть между 0,7 В и 1 В, поэтому вам нужно разделить напряжение на линии (последовательное сопротивление 68 Ом и 33 Ом больше 47 пФ и 68 Ом параллельно),
Мы проверили, что серия ЖК-регистров хорошо работает без делителя напряжения.
Распределение контактов относится к разъему платы расширения AK-STM32-LKIT.Название контактов действительно для всех STM32.
Определите, совпадают ли используемые контакты, в соответствии с руководством к STM32, который вы используете.
Мы используем зеленый цвет (вывод 2 VGA) для имитации старого эффекта отображения, вы можете использовать другие цветовые схемы.
КРАСНЫЙ / ЗЕЛЕНЫЙ / СИНИЙ контакт DB15, вы можете создать 8 цветовых комбинаций.
В заключение
Мы используем недорогой микропроцессор в качестве контроллера VGA. Есть много способов добиться этого, но этот метод не требует дополнительных компонентов, кроме интерфейса VGA.
Если вы используете более продвинутый STM32, вы можете попробовать использовать увеличенный буфер и записать в буфер кадра, когда DMA отключен, чтобы избежать фрагментации данных.
Вы можете скачатьИсходный код, В котором вы можете найти библиотеку инструментов для рисования линий и точек и т. Д.
В следующем посте видеоигры будут реализованы через образцы VGA. К
Space Invaders for STM32
Using the previous VGA output project, we have created this Space Invaders version for STM32.
The source code is kept as a separated project, but uses the same engine of the VGA output project.
Connections
We have added three push-buttons to the original connections.
These push-buttons serve as a joystick.
Here are the connections for the push-buttons and the VGA connector:
THANK YOU for sharing you project with us.
Your project was a starting point to our project.
I used your logic, rewritten whole code, expanded to 2 output SPI,
sinhronized them in slave mode using two more timers.
One to be same as TIM1, to trigger 10Mhz timer for SPI CLK.
I did additional logic with input part and viola an adapter on a MCU.
Best regards from Slovenia
1 #ifndef __VIDEO_H 2 #define __VIDEO_H 3 4 #include «gdptypes.h» 5 6 #define VID_HSIZE 50 // Horizontal resolution (in bytes) 7 #define VID_VSIZE 200 // Vertical resolution (in lines) 8 9 #define VID_PIXELS_X (VID_HSIZE * 8) 10 #define VID_PIXELS_Y VID_VSIZE 11 #define VID_PIXELS_XR (VID_PIXELS_X + 16) 12 #define VID_HSIZE_R (VID_HSIZE + 2) 13 14 // Function definitions 15 16 void vidInit(void); 17 void vidClearScreen(void); 18 19 #endif // __VIDEO_H
Источник: russianblogs.com
Как подключить HDMI к stm32?
Нужно обрабатывать видео поток, рассматривается вариант подключения к stm32 по HDMI, только вот подобных схем по подключению с целью подачи видео (не вывода, не CEC) я что то не могу найти, ткните пожалуйста где можно про это почитать/на какие нибудь примеры реализации или просто подскажите как схемотехникчески подключить HDMI к stm32?
- Вопрос задан более трёх лет назад
- 11040 просмотров
Комментировать
Решения вопроса 0
Ответы на вопрос 1
Как подключить схемотехникчески? Проводами, я думаю.
Вы задачу нормально опишите, что нужно получать, как обрабатывать. Думается мне, что даже если завести сигнал HDMI в STM32 — ну, сигнал разрешением 320*240 у вас может быть и получится принять, но на даже самую слабую обработку ресурсов не хватит. Налицо неверный выбор инструмента и/или задачи. По вашему вопросу непохоже что у вас получится каким-то образом решить все задачи ввода и обработки. Тем более ещё тег Ардуино, ну постеснялись бы уж, право слово 🙂
Окей, я закончил плеваться ядом. Теперь по сути. Очевидно что это только ПЛИС и ничего больше.
Во-первых, ввод сигнала. Как известно, в HDMI применяется LVDS сигнал, чтобы из него получить TTL-уровни, вам потребуется приёмник LVDS. Более того, стандарт последовательный и высокоскоростной, значит потребуется как-то распараллелить обработку. Всё это делают специальные микросхемы-десериализаторы, первое что приходит в голову — микросхема TMDS341.
У максимки тоже есть несколько таких микросхем, например MAX9264. Из них выходит достаточно удобный интерфейс: от 18 до 24 бит цвета плюс несколько клоков (пиксельный клок и вертикальная/горизонтальная синхронизация). Это уже можно напрямую втыкать в ПЛИС, но кстати можно найти и ПЛИС с LVDS-входами, правда это выйдет дороже в сумме. Если нужно после обработки снова сделать HDMI — берёте похожую микросхему-сериализатор, вроде MAX9263.
Как раз похожая задача, приём видео с HDMI и выделение в нём цветов на границах картинки для создания Ambilight: tqfp.org/Perfer/fonovaya-podsvetka-hdmi-fpga-led-c. Похоже, проект ещё не закончен, но думаю что с этого можно начать.
Во-вторых, обработка. Честно, не знаю что сказать. Если вам нужно как-то по локти ковыряться в принятом видео, типа сжимать его или что-нибудь там распознавать — бросьте это всё, и возьмите просто компьютер с платой видеоввода. Вручную вы это всё не сделаете.
В принципе, можно поискать компьютеры-на-плате вроде https://www.toradex.com/ru/products/colibri-arm-co. но вам потребуется как-то запихнуть в неё этот сигнал (понятно что не через GPIO, так как требуется прямой доступ к шине памяти), и написать драйвер для обработки этого дела.
Кажется, на выставках я видел подобный комп с входом HDMI, но надо понимать что это крайне невостребованная фича, и найти такое будет огромной удачей.
Если же вам нужно, к примеру, просто наложить на видео текст (это называется OSD, on-screen display), то в принципе всё решается прям внутри ПЛИС — вы закрашиваете в нужный момент пиксель белым цветом, и всё. Это чуть ли не единственная задача в железной обработке видео, которая решается более-менее просто.
Готовых схем не найдёте, слишком уж специфичная задача. Инженеры, самостоятельно сделавшие такое, предпочтут продавать это решение, чем делиться им.
Ну и всегда остаётся простой путь, сконвертировать hdmi в композит/компонент, а их уже легче ввести в любой компьютер или компьютерный модуль.
Источник: qna.habr.com