Шановні друзі!
26 та 31 грудня магазин працюватиме до 16 години. 1 та 2 січня магазин працювати не буде.
Вітаємо всіх з Різдвом та Новим Роком!
Мобільна версія Форум Arduino Документація Гарантійні умови 0 0
UA RU
Графік роботи магазину:
Пн-Пт: 8.00 - 19.00
Сб: 10.00 - 17.00
Нд: вихідний
Каталог
Напиши статтю і отримай знижку!

Підключення STM32 до монітора комп’ютера (кольоровий Artekit)

2024-04-15

Всі статті →

У своїй попередній статті, "Відеокарта для любого мікроконтролера", я показав як можна створити з нуля, свою власну відеокарту. Дана відеокарта чудово підходить для простих 8ми бітних мікроконтролерів, тактова частота яких не перевищує 20 МГц. Але у випадку з STM32, частота яких доходить, або перевищує 72 МГц, це вже не саме краще рішення, через повільний інтерфейс передачі даних самої відеокарти. Тому у випадку з STM32, для виводу інформації на екран монітора, доцільніше пошукати якесь інше рішення, яке не буде так сповільнювати швидкодію процесора.

Одного разу вивчаючи STM32, я натрапив на дуже цікавий проєкт, під назвою "VGA output using a 36-pin STM32" (Artekit), зроблений він дуже мінімалістично, лише VGA роз’єм, і плата з мікроконтролером STM32F103. Цікаво в ньому те, що на виході мікроконтролера, можна отримати монохромний відеосигнал, з доволі непоганою роздільною здатністю 400x200 пікселів. При цьому, генерування відеосигналу виконується лише за допомогою запису буфера у SPI в режимі DMA. Пам'ять відеоданих, знаходиться всередині самого мікроконтролера, і представляє собою дворівневий масив у вигляді 200 рядків, по 50 байт кожен. Сигналами вертикальної і горизонтальної синхронізації, займаються апаратно 2 таймери, і формують потрібні таймінги для відеорежиму SVGA 800x600 56Hz. Програмно все реалізовано лише на 3х коротких перериваннях, що дозволяє формувати відеосигнал у фоновому режимі, з використанням мінімальної кількості ресурсів процесора. Тому до цього проєкту можна спокійно добавляти свій код, і майже не помітити втрати його швидкодії.

Вихідний код був викладений авторами у вільний доступ, тому погравшись трохи з цим проєктом, було вирішено зайнятись виправленням його недоліків, і покращенням.

Перший недолік, пов'язаний з обмеженням оперативної пам’яті самого STM32F103, і полягає у непропорційній роздільній здатності екрану, 400х200 пікселів. Тут виправити можна лише заміною мікроконтролера на інший, з більшою кількістю оперативної пам’яті.

Другий недолік, пов'язаний з відеорежимом 800x600 56Hz. Через низьку частоту оновлення екрану 56Гц, на екрані монітора може бути помітне мерехтіння, особливо це помітно на старих кінескопних моніторах. Автори обрали цей режим тому що, ця роздільна здатність використовує частоту пікселів 18 МГц, що є кратним 72 МГц частоти STM32F103. Вирішити цю проблему можна знову ж таки заміною мікроконтролера на інший, з більшою тактовою частотою.

Третій недолік, і самий головний, полягає в тому, що зображення можна отримати лише монохромне. З використанням лише одного модуля SPI, без залучення додаткових ресурсів мікроконтролера, отримання кольорового зображення здається неможливим, але якщо використати для формування кольорів зовнішню схему, то все стає цілком реальним.

Для свого проєкту, я обрав мікроконтролер STM32F401CCU6, який був куплений за подарунковий сертифікат на сайті arduino.ua, за що їм дуже велика вдячність.

Критерії вибору саме цього мікроконтролера, полягають в тому, що він може працювати на потрібній мені частоті 80 МГц. Саме ця частота буде кратна 20 МГц частоті пікселів відеорежиму SVGA 800x600, з більшою частотою оновлення екрану 60 Hz. Також STM32F401 має 64 KB оперативної пам’яті, проти 20 KB у STM32F103. Тепер зображення можна зробити пропорційним 400x300 пікселів, пам’яті точно вистачить, та ще й з великим запасом. Ну і звісно не могла не вплинути на вибір даного мікроконтролера і його низька ціна, яка на момент покупки в магазині, була навіть нижча за оригінальний STM32F103.

Для збереження головної особливості проєкту Artekit, а саме роботи формування відео у фоновому режимі, кольорове зображення було вирішено формувати так само як і у відеокарті в моїй попередній статті, за прикладом комп’ютера ZX SPECTRUM. Це дозволить при роздільній здатності 400х300 пікселів з 15 кольорами, зайняти лише близько 32 KB оперативної пам’яті, що значно збільшить швидкість роботи з графікою. І на додачу дозволить перенести уже готові коди своїх проєктів, написаних для відеокарти, на більш швидкі STM32 практично без змін. Для цих цілей була зроблена така схема.

Короткий опис роботи схеми:

Інвертори мікросхеми U1, використовуються для підняття сигналів H_SYNC і V_SYNC до 5в логічного рівня. Зроблено це виключно для захисту слабких виходів мікроконтролера, від можливого короткого замикання і перенавантаження. Також з виходу U1D знімається інвертований сигнал H_SYNC, який йде на входи RESET мікросхем U2-U5, для їх скидання, і підготовки до виводу нової лінії зображення.

Тригер U2A ділить частоту SCK модуля SPI на 2, поділений сигнал з виходу тригера, у прямому і інвертованому вигляді, йдуть на тактові входи SH_CP регістрів зсуву мікросхем U4 U5. На входи DS регістрів зсуву мікросхем U4 U5 йде сигнал MOSI з модуля SPI. Завдяки цьому біти які послідовно з’являються на виході MOSI модуля SPI, по черзі записуються у зсувні регістри мікросхем U4 U5. Мікросхема U4 працює в ролі лінії затримки для піксельних даних, а мікросхема U5 використовується для накопичення і зберігання кольорів пікселів.

Тригери U2B U3A U3B ще раз ділять частоту SCK модуля SPI на 8, таким чином кожен 16 й тактовий імпульс SCK модуля SPI, дає сигнал на вхід ST_CP мікросхеми U5 скопіювати дані з регістру зсуву у паралельний регістр. Завдяки цьому дані пікселів і їх кольорів синхронно попадають у мікросхему мультиплексор U6, де і формується кольорове зображення. На транзисторах побудований простий цифро-аналоговий перетворювач, і дільник напруги, для зменшення рівня сигналу до робочих 0.7в потрібних для роботи монітора.

Всі мікросхеми використані в цій схемі поширені, тому знайти їх можна практично в любому магазині радіоелектроніки.

А ось так виглядає готова плата. Виготовлена вона за допомогою лазерно-прасувальної технології, з одностороннім монтажем, і має розміри всього 81 на 49 китайських міліметрів. Доріжки намагався робити максимально широкі, щоб плату міг повторити навіть початківець. Візитка для масштабу.

І звісно ж схема підключення плати до мікроконтролера.

Далі про роботу з відеоданими всередині самого мікроконтролера.

Простота зовнішньої схеми формування кольорового зображення, на жаль збільшила складність роботи з самими відеоданими. Програмно відеодані в пам’яті мікроконтролера, представляють собою дворівневий масив uint16_t fb[300][51]; (300 рядків по 51му 16ти бітному слову кожен). Кожне 16ти бітне слово в цьому масиві, зберігає в собі данні одразу 8ми послідовних пікселів, і атрибути їхніх кольорів. В піксельних даних, пікселі зберігаються у монохромному вигляді, кожен піксель встановлений в 1-цю, вважається пікселем переднього плану, а кожен піксель встановлений в 0-ль вважається фоновим пікселем. В даних атрибутів кольору, можна окремо задати 15-ть кольорів для пікселів переднього плану, і 15-ть кольорів для фонових пікселів. Останнє 51 слово кожного рядка масива, обов’язково має бути заповнене нулями, ці дані потрібні для формування сигналу гасіння променя в кінці кожного рядка відеоданих.

Таблиця розміщення в 16ти бітному слові піксельних даних і їх атрибутів. З правої сторони дані які записуються у масив uint16_t fb[300][51];. З лівої сторони результат запису, який має з’явитися на екрані монітора.

Нижче показано цей самий результат вже на екрані монітора.

Для перевірки можливостей, вивів на екран монітора таку картинку. При роздільній здатності 400х300 пікселів, виглядає досить непогано, навіть для 22 дюймового монітора.

В підсумку скажу про плюси і мінуси такого способу формування зображення.

До плюсів можна віднести.

Простота і дешевизна. Тепер непотрібно шукати дорогі спеціалізовані контролери або рідкісні мікросхеми оперативної пам’яті, для створення складних схем формування зображення.

Економія портів вводу-виводу. Проєкт використовує лише 4 піна мікроконтролера B3-B6 які зручно розташовані один біля одного, всі інші залишаються у вільному розпорядженні.

Розміщення пам’яті відеоданих в середині самого мікроконтролера. Це дозволяє процесору отримати прямий доступ до них. Якщо спробувати по черзі зафарбувати весь екран, трьома різними кольорами, то це відбувається миттєво, око навіть не встигає помітити цього.

Також відеодані в пам’яті можна модифікувати. Це дає змогу працювати з окремими пікселями. Тепер на екрані можна малювати все що заманеться, наприклад кола лінії і синусоїди. Можна швидко змінювати кольори пікселів, не змінюючи даних самих пікселів, і навпаки.

Монітор можна в будь який момент перевести в режим очікування, простою зупинкою таймерів, і при потребі увімкнути знову, при цьому основна програма мікроконтролера не буде зупинятись.

До мінусів можна віднести.

Якість зображення на екрані. Вона дуже залежить від якості самого джерела живлення, через відсутність хорошого цифро-аналогового перетворювача. Також на якість зображення впливає джиттер PLL мікроконтролера. При тактуванні PLL частотою 1 мГц, на пікселях стає помітний фазовий шум. Для зменшення цього ефекту виробник мікроконтролерів радить тактувати PLL частотою 2 мГц, але тут вже підсунули свиню китайці, які чомусь поставили на плату мікроконтролера кварц 25мГц, який не ділиться 2. В своєму проєкті я обрав частоту близьку до 2 мГц, діленням частоти кварцу на 13. Порівнявши отримані сигнали синхронізації H_SYNC і V_SYNC мікроконтролера з сигналами вбудованої відеокарти свого ноутбука, виявилось що мікроконтролер генерує сигнали навіть ближчі до табличних ніж сам ноутбук, тому було вирішено залишити так як є. Але краще було б замінити кварц на інший, з частотою 24 мГц, і перерахувати коефіцієнти.

Одночасний доступ процесора і DMA до пам’яті. Якщо процесор і DMA одночасно звертаються до одної комірки пам’яті, то на екрані можуть з’являтися невеликі глюки. Щоб повністю прибрати цей ефект потрібно писати в пам'ять тоді, коли DMA вимкнений в момент гасіння променя. Я вирішив цього не робити, бо насправді ці глюки виявились не такими вже й страшними.

Пріоритети переривань. Три коротких переривання, на яких працює формування зображення, мають мати самий вищий пріоритет. Усі інші в жодному разі не мають їх переривати, і це може створити проблеми в деяких поєктах.

DMA. В проєкті використовується 2й канал DMA для передачі відеоданих з оперативної пам’яті у SPI інтерфейс, вся інша периферія тепер або не зможе використовувати цей канал взагалі, або ж зможе працювати з ним тільки з нижчим пріоритетом, що наприклад при роботі з модулем АЦП може створити проблеми.

Таймери. Не такий вже й мінус, але з 2ма таймерами з 8ми доведеться попрощатись.

На закінчення додам, що код мого проєкту є робочою модифікацією оригінального коду Artekit. Єдині зміни які я додав, так це збільшив розмір буферу відеоданих, переналаштував DMA, SPI, і таймери на більш зручні. Деякі рішення роботи з графікою в моєму коді, можуть мати помилки, а ще можуть показатися дивними і навіть тупими. Тому викладаючи свій вихідний код, ви можете використовувати його лише як відправну точку для своїх проектів.

Тут додаю архів з вихідним кодом для CooCox, прошивкою, схемою, і малюнком друкованої плати:

Якщо сподобалась стаття пишіть відгуки. З повагою Viktor Korinnyi.

Ваша оцінка статті:

Відмінно
Добре
Задовільно
Погано
Дуже погано

Загальна оцінка:

Оцінка "Підключення STM32 до монітора комп’ютера (кольоровий Artekit)"
5 з 5
зроблена на основі 1 оцінки 1 клієнтських відгуку.

Дякуємо Вам за звернення! Ваш відгук з'явиться після модерації адміністратором.
Іван
16.08.2024 08:31:13
Круто!
оплата картами Visa і MasterCard