Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/79: Рейтинг темы: голосов - 79, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838

Видеоконтроллер без прерываний, да и вообще без процессора

27.03.2016, 20:48. Показов 15514. Ответов 44
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Только два таймера, spi, dma и 40 строчек программы инициализации )
Полный размер кадра - 288 точек x 312 строк x 1 бит.
Но это включая и невидимую часть, а видимой будет картинка где-то 200x200, зависит от телевизора.
Ниже настройки для stm32f103, 72 МГц, но всё это легко перестраивается и под другой мк.

Первый таймер выдаёт строчные синхроимпульсы - период 64 мкс, импульс 4.7 мкс, активный ноль.
Выдаёт он их только когда нет кадрового синхроимпульса, поэтому режим gated.
Code
1
2
3
4
5
6
7
8
9
TIM4->PSC  = 16-1;
TIM4->ARR  = 288-1;                    // 64 us
TIM4->CCR3 = 21;                       // hsync 4.7 us
BIS (TIM,4,CCMR2, OC3M);               // pwm mode 2
BIS (TIM,4,CCER,  CC3E);
BIX (TIM,4,SMCR,  SMS, SMS_2,SMS_0);   // gated mode
BIX (TIM,4,SMCR,  TS, TS_1);           // tim3
BIS (TIM,4,CR1,   CEN);
BIX (GPIO,B,CRH,  CNF8, CNF8_1,MODE8); // push-pull ch3
Второй таймер управляет первым, оставляя его в низком уровне на время кадровых синхроимпульсов, тем самым формируется синхросмесь.
Период кадровых синхроимпульсов 20 мс (312 строк), импульс 256 мкс, активный ноль.
Code
1
2
3
4
5
6
7
TIM3->PSC  = 16*288-1;
TIM3->ARR  = 312-1;       // 20 ms
TIM3->CCR4 = 4;           // vsync 256 us
BIS (TIM,3,CCMR2, OC4M);  // pwm mode 2
BIS (TIM,3,CCER,  CC4E);
BIS (TIM,3,CR2,   MMS);   // oc4ref
BIS (TIM,3,CR1,   CEN);
Картинка формируется непрерывной передачей потока байтов по spi, spi используется просто как сдвиговый регистр.
Частота 4.5 МГц, байтовая передача, 36 байт (288 точек) на строку (64 мкс).
Используется только вывод mosi.
Code
1
2
3
4
BIX (SPI,1,CR1,  BR, BR_1,BR_0,MSTR,LSBFIRST);  // 72/16 MHz
BIS (SPI,1,CR2,  TXDMAEN);
BIX (AFIO,,MAPR, SWJ_CFG, SWJ_CFG_1,SPI1_REMAP);
BIX (GPIO,B,CRL, CNF5, CNF5_1,MODE5);           // push-pull mosi
Поток байтов автоматически циклически вычитывается по dma из массива uint8_t x_bits[312][36].
Такое странное название потому, что так xnview называет массивы в xbm-формате )
Code
1
2
3
4
5
DMA1_Channel3->CMAR  = (uint32_t) &x_bits;
DMA1_Channel3->CPOR  = (uint32_t) &(SPI1->DR);
DMA1_Channel3->CNDTR = 36*312;
BIS (DMA,1_Channel3,CCR, DIR,MINC,CIRC);
BIS (DMA,1_Channel3,CCR, EN);
Последний штрих - синхронизация таймеров и dma.
Code
1
2
3
BIS (TIM,4,EGR, UG);
BIS (TIM,3,EGR, UG);
BIS (SPI,1,CR1, SPE);
Это всё )

Схема подключения:
PB8 (sync) ---[620 Ом]---> VIDEO
PB5 (data) ---[300 Ом]---> VIDEO

BIS и BIX в тексте - просто макросы установки битов в регистрах.




<Изображение удалено>

[3.73 Кб]
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.03.2016, 20:48
Ответы с готовыми решениями:

Windows 7 тормозит без видимых причин и без загрузки процессора
Добрый день! Уже неделю бьюсь над проблемой: конфигурация моего компа не самая лучшая, но Семерку должна тянуть без особых проблем, а на...

Нужно написать программу без перегрузок операторов и вообще без перегрузок
Рациональная (несократимая) дробь представляется парой целых чисел (а, b), где а — числитель, b — знаменатель. Создать класс Rational для...

Как завершить com программу без прерываний.
Подскажите, пожалуйста, как завершить без прерывания программу com (и без ret).

44
0 / 0 / 0
Регистрация: 23.03.2012
Сообщений: 1,017
28.03.2016, 10:19
Круто!
Только я подозреваю, что не каждый телевизор сможет правильно выводить сигнал с такой синхрой. Все-таки последовательность там довольно сложная.
0
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
28.03.2016, 10:36
Необходимость точно выдерживать стандарты в случае монохромного изображения и прогрессивной развёртки сильно преувеличена )
Главное не давать особо умным телевизорам вставать в режим авто-распознавания, тогда они похоже действительно что-то анализируют и могут впасть в ступор.
Но если насильно выставить secam или pal, или даже ntsc 60 Гц, то спокойно всё сожрут )
0
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
28.03.2016, 11:39
Еще бы три канала SPI одновременно пинать и было бы хорошо.
На пЫк32 такое есть...
0
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
28.03.2016, 11:56
Не-не-не, не соблазнишь, у меня счас stc15 в фокусе внимания ))
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
28.03.2016, 12:51
Цитата Сообщение от dosykus_2
Еще бы три канала SPI одновременно пинать и было бы хорошо.
А не проще (и быстрее) было бы в GPIO выводить вместо SPI? Тогда можно не три, а сколько угодно бит одновременно выводить, вплоть до 16-ти.
А тогда бы и цветную картинку можно было сделать (через VGA-вход телевизора).
0
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
28.03.2016, 13:14
Цитата Сообщение от vt340
Не-не-не, не соблазнишь, у меня счас stc15 в фокусе внимания ))
Да не , это не просьба - мысли вслух. :)

Цитата Сообщение от OtyxPM
А не проще (и быстрее) было бы в GPIO выводить вместо SPI? Тогда можно не три, а сколько угодно бит одновременно выводить, вплоть до 16-ти.
А тогда бы и цветную картинку можно было сделать (через VGA-вход телевизора).
Надо обдумать. Только не TV а монитор, в доступных теликах только HDMI . :)))))))
0
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
28.03.2016, 13:24
Без spi - это по байту на пиксель - упрёмся в 16-битный счётчик dma, ну и расход ram в восемь раз
0
0 / 0 / 0
Регистрация: 12.08.2012
Сообщений: 1,217
28.03.2016, 13:31
А как можно в GPIO с такой скоростью выводить? Если программным ногодрыгом то проц только этим и будет занят, а DMA может из памяти в порт класть по событию от какогонибудь таймера?
0
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
28.03.2016, 13:37
Цитата Сообщение от vt340
Без spi - это по байту на пиксель - упрёмся в 16-битный счётчик dma, ну и расход ram в восемь раз
Не смотрел DMA burst? На несколько SPI не раскидать?
Гы... Есть решение, но пока дорого- QUADSPI см.L4 ... :)))))
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
28.03.2016, 13:54
Если процессор взять из новеньких (L476, F469, F7xx), то там есть интерфейс QuadSPI - синхронно до восьми SPIных бит работают (обычно в примерах используют четыре из них).

У процессоров постарее - SDIO в четырёхбитном режиме не получится использовать?
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
28.03.2016, 13:57
mShit, ну, скорость достижима: у eddy_em получилось 6.25МГц - http://eddy-em.livejournal.com/96373.html
Я тоже пробовал подобное, но с отправкой в BSRR, чтобы только нужные ноги дёргать (соответственно, приходилось слать по 32 бита), максимальная скорость получилась емнип 3 или 4 мегагерца (но я через куб делал, код мне не нравится совсем... а на код eddy_em посмотреть приятно).
А вот объём ROM - проблема (ну, мне-то не надо было кадр слать, я хотел просто кусок синусоиды на ЦАП выплюнуть).
0
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
28.03.2016, 14:03
В принципе второй и третий spi можно просто тупо и холодно по своим собственным dma и массивам запустить )
Синхронизация с таймерами всё равно только в одновременном начальном запуске, ну будет небольшая разбежка где-нибудь на 30 нс, при пикселе 222 нс может и незаметно будет
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,113
28.03.2016, 14:38
"QUADSPI" ? Да Бог с вами, зачем усложнять себе жизнь? Завести тикающий таймер, от него запустить передачу DMA с записью в порт GPIOx-ODR. И всё, вся жизнь в цвете. )))
Если на STM32 с [цензура] индусская схемой межкоммуникаций это сделать нельзя, то есть xMiko, где DMA полностью автономный ресурс с произвольным подключением.
0
0 / 0 / 0
Регистрация: 31.08.2010
Сообщений: 550
28.03.2016, 14:43
Можно напрямую в линии ввода-вывода посредством ПДП (DMA).
Я делал вот так: http://www.youtube.com/watch?v=ubwrnwihEl8

Контроллер собран на STM32F405, режим 800х600 точек, частота обновления 60Гц, 256 цветов.
Однако разрешение используется 400х300, выше не было смысла для поставленной задачи, да и памяти мало.
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
28.03.2016, 15:00
Цитата Сообщение от u37
запустить передачу DMA с записью в порт GPIOx-ODR. И всё, вся жизнь в цвете.
Так я это сначала и предлагал (см.выше).
А Zhitizmjokov (предыдущий пост) даже и сделал. Респект!
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
28.03.2016, 15:04
Цитата Сообщение от Zhitizmjokov
Я делал вот так
Здесь UI - emWin какой-нибудь или самописный?
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,113
28.03.2016, 15:11
Да, интересное решение. Главная фенька - это дисплей. Есть матрица, которая выводится на экран и любая железка может залезть (UART/SPI/...) в эту матрицу и поменять нужные точки и оно "само" будет выведено на экран. Такой функции с выводом через SPI не получишь, данные либо вычисляются на ходу, либо лежат в закодированном виде.
Увы, здесь действительно надо что-то "постарше", на матрицу уходит слишком много байт. ((
0
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
28.03.2016, 15:12
С gpio всё красиво и весело, но не получится весь кадр по dma закрутить, только построчно, а значит перезапуск dma в прерываниях, и это уже совсем другая история )
А для меня весь цимес был в том, чтобы всё крутилось само по себе, независимо от процессора, и даже в debug-режиме, когда процессор вообще остановлен
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,113
28.03.2016, 15:49
vt340, да тоже классно! )) Только одно для черных, а другое для цветных.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.03.2016, 15:49
Помогаю со студенческими работами здесь

Как написать ввод/вывод без прерываний?
Код на ассемблере встроенном в турбо паскаль. В массиве из 10 целых чисел сосчитать сумму чётных и сумму нечётных чисел. Вывести...

AVR ATtiny13A Assembler нажатие кнопки без прерываний
Доброго времени суток. Изучаю программирование микроконтроллеров по книге Белова Л.В. &quot;Самоучитель разработчика устройств на...

NASM и C. Как считать ввод с клавиатуру без прерываний
Первичный загрузчик global start extern long_mode_start section .text bits 32 start: mov esp, stack_top

ASM, DOS, FAT32. Атрибуты файла без использования прерываний
Добрый день! Столкнулась с такой проблемой. В файловой системе FAT32 нужно прочитать атрибуты у заданного файла и установить атрибут...

Как программно на Си определить фронт импульса без прерываний? Atmega AVR
Всем привет.... столкнулся с задачкой - требуется определить фронт импульса.... (на МК Атмега.... :) ) раньше сталкивался.... но...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru