STM32 + ST7789 Добавляем поддержку шрифтов. Примеры работы со шрифтами и битовыми изображениями.

  Рет қаралды 11,689

Vladimir Medintsev

Vladimir Medintsev

Күн бұрын

Пікірлер: 62
@fly8r358
@fly8r358 4 жыл бұрын
И все таки, Владимир, Вы делитесь своим опытом, хоть и размышляли на коммерческие темы. За это Вам огромное спасибо! Продолжайте в том же духе! Крайне полезная информация для саморазвития.
@VladimirMedintsev
@VladimirMedintsev 4 жыл бұрын
Спасибо.
@f33net
@f33net 4 жыл бұрын
Рисовать шрифты крестиками в символьном массиве да ещё обрабатывать это не препроцессором при компиляции, а оставлять в нагрузку чипу - это самое то однокристалкам :))) Осталось только винду в однокристалку загнать... :))) Если кому трудно сделать шрифт отдельно (кроме дурины, все компиляторы имеют инструменты для редактирования шрифтов), то, хотя бы, отдать это дело препроцессору - дефайнами крестики менять на единички, подчёркивание на нолик и получать из этого записи в двоичном виде сразу на этапе компиляции. Да и описывать битовые матрицы сразу в коде двоичными числами чуть менее наглядно, чем крестиками.
@VladimirMedintsev
@VladimirMedintsev 4 жыл бұрын
Про препроцессор очень хорошая идея. Я до нее не догадался. Очень спасибо. Таким образом можно решить много проблем.
@SergeLevin
@SergeLevin 4 жыл бұрын
Не поленился, сходил на канал, откуда взят данный пример и посмотрел как там это реализовано. Идея в том, что массив на самом деле не символьный. А перед определением шрифта подключается файл с пачкой дефайнов (#include "font.h" на 05:16): #define ________ 0x00 #define _______X 0x01 ......... #define XXXXXXXX 0xFF Т.е. всё уже отдано на откуп препроцессору.
@VladimirMedintsev
@VladimirMedintsev 4 жыл бұрын
@@SergeLevin Уже увидел. И мне это все больше нравится.
@philkulibin2602
@philkulibin2602 4 жыл бұрын
@@VladimirMedintsev не знаю какой у вас С версии а у меня 0x0f == 0b00001111 Значит true
@silentage6310
@silentage6310 4 жыл бұрын
по синтаксису сразу было понятно что это дефайны. там же коды(X _) не в строках были.
@aka_DRY
@aka_DRY 4 жыл бұрын
По поводу шрифтов страдал тоже, сердце успокоилось на uGFX. Хоть и тяжеловата, но могуча. А главное, что шрифты можно брать прямо из /usr/share/fonts/truetype/
@ugene4063
@ugene4063 2 жыл бұрын
TheDotFactory
@shamanhex
@shamanhex 4 жыл бұрын
Отлично! Как раз подбираю монитор для корпуса на din-рейку.
@silentage6310
@silentage6310 4 жыл бұрын
интересно, сам неделю назад делал себе инструмент для создания шрифтов для мини дисплейчика на ws2812. на js/vue за вечер управился. догадывался что есть готовые сервисы/рпограммы, просто самому интересно было разобраться.
@AlexandrZverev
@AlexandrZverev 4 жыл бұрын
Сглаженные шрифты, подготовленные в графическом редакторе на таком экранчике выглядят идеально). Сделал вывод цифр крупным шрифтом таким образом, картинки хранятся на spi flash.
@sledleo
@sledleo 3 жыл бұрын
какой редактор и какая процедура?
@AlexandrZverev
@AlexandrZverev 3 жыл бұрын
@@sledleo , редактор любой подходящий, смысл в том, чтобы сделать сглаживание шрифтов и вывести в нужном формате цветности(565). Каждый символ отдельным файлом .bmp Использовал GIMP. Позже нашел github.com/lvgl/lv_font_conv, конвертер шрифтов в bmp, сглаживание есть, опций много, но пока не использовал, и для моего варианта там не хватает выбора цвета текста и фона. Подготовил файлы bmp в GIMP, разные по ширине символы разделил на два подмножества (цифры одной ширины, а точка и т.п. другой ширины), записал на флэш w25q64, туда же хотел записать таблицу сопоставления символ - адрес символа, но так как был отдельный мало использованный eeprom, то записал на eeprom, с учетом что это первые отладочные экземпляры и так проще было загружать произвольные изображения по uart и править таблицу загруженных. Символы выводятся на экран как есть, если надо много вариантов цветов текста и фона, то добавляются соответствующие подготовленные изображения, да, работы руками в редакторе много, если нужен весь алфавит или много цветовых вариантов, но я делал только цифры и несколько значков для единиц измерения. Вывод символа: ищем символ в таблице символов, читаем символ по найденному адресу в буфер озу (один spi) и выводим на экран(другой spi), by DMA. Для ускорения выводятся только те символы строки, которые изменились в ней с прошлого раза.(а также все последующие за измененным, так как измененная ширина может сбить оставшуюся часть строки). Оптимизация для находящихся на одном месте экрана строк, которые периодически обновляются. Ссылки на код дать не могу - он в полностью отлаженном, но непричесанном варианте, пока не созрел для github).
@Ryazanec13
@Ryazanec13 3 жыл бұрын
Обожаю экран от нокии 1202, жаль, что фиг где достаёшь сейчас. В магазине одном по 70р в свое время все экраны скупил, лет 8 назад. В первую машину ваз2110 делал бортовой комп на нем. Описание протокола общения с эбу в интернете нашлось, и в итоге мне это 3 раза в ремонте помогло, один раз хреновы бензином заправил я и вылез чек по детонации, второй раз катушка барахлила, вылезла ошибка по пропускаем и третий раз ошибка по датчику коленвала отловил, провод отгнил.
@ВладимирМ-е6ь
@ВладимирМ-е6ь 4 жыл бұрын
Когда-то нашел программу LCD font maker , как по мне оказалась удобней других.
@Kaaaaaaaaaarrrrr
@Kaaaaaaaaaarrrrr 4 жыл бұрын
Со шрифтом 5х8 работает изумительно, а 7х11 кириллицу выводит кракозябрами
@allaksusallaksus2402
@allaksusallaksus2402 4 жыл бұрын
Все строки состоящие из символов _ и X состоят из восьми символов и где-то в вашей программе есть следующее #define _X_X_X_X 0x55
@VladimirMedintsev
@VladimirMedintsev 4 жыл бұрын
Да, да, спасибо уже увидел как там хитро все реализовано. И честно говоря мне это жутко понравилось. Так что теперь возьму на вооружение. Я до такого приема действительно не додумался.
@allaksusallaksus2402
@allaksusallaksus2402 4 жыл бұрын
Символы _ и X анализирует компилятор а не целевая программа, поэтому занимаемое шрифтами место останется таким же как и с помощью записи в виде шестнадцатиразрядных чисел
@konstantingolinskiy4944
@konstantingolinskiy4944 4 жыл бұрын
Можно использовать всего один шрифт размером например 6х8 и реализовать множитель в функции который будет его увеличивать хоть навесь экран, тем самым экономим память на хранении шрифтов и получаем любой размер кратный 6х8 char ST7789_DrawChar(uint16_t x, uint16_t y, uint16_t TextColor, uint16_t BgColor, uint8_t TransparentBg, FontDef_t* Font, uint8_t multiplier, unsigned char ch) { uint32_t i, b, j; uint32_t X = x, Y = y; uint8_t xx, yy; if( multiplier < 1 ){ multiplier = 1; } /* Check available space in LCD */ if ( ST7789_Width FontWidth) || ST7789_Height FontHeight) ) { /* Error */ return 0; } /* Go through font */ for (i = 0; i < Font->FontHeight; i++) { if( ch < 127 ){ b = Font->data[(ch - 32) * Font->FontHeight + i]; } else if( (uint8_t) ch > 191 ){ b = Font->data[((ch - 192) + 96) * Font->FontHeight + i]; } else if( (uint8_t) ch == 168 ){ // 168 символ по ASCII - Ё // 160 эллемент ( символ Ё ) b = Font->data[( 160 ) * Font->FontHeight + i]; } else if( (uint8_t) ch == 184 ){ // 184 символ по ASCII - ё // 161 эллемент ( символ ё ) b = Font->data[( 161 ) * Font->FontHeight + i]; } for (j = 0; j < Font->FontWidth; j++) { if ((b FontWidth * multiplier); /* Increase string pointer */ str++; } /* Everything OK, zero should be returned */ return *str; } Шрифт только у меня отличается от вашего по битовой маске, у меня идет слева на право и сверху вниз пример: 0x2000, 0x5000, 0x8800, 0x8800, 0xf800, 0x8800, 0x8800, 0x0000, // A multiplier - множитель при 1 шрифт будет 6х8 ,при 2 12х16 и т.д
@bdfy8349
@bdfy8349 3 жыл бұрын
Ого, не ожидал вас тут увидеть. Спасибо за код и платку ст-линк в2.1, работает изумительно
@masterkit9517
@masterkit9517 4 жыл бұрын
Бесценный канал!
@sergeydrachuk8612
@sergeydrachuk8612 4 жыл бұрын
Возможно, можно было использовать старую библиотеку от Нокии. Контроллеру (по крайней мере ST7789S) можно задать любые направления отрисовки через MADCTL (36h): Memory Data Access Control .
@rinatkin7703
@rinatkin7703 4 жыл бұрын
Здравствуите , где наити команды инициализации .настроики этого дисплея
@VladimirMedintsev
@VladimirMedintsev 4 жыл бұрын
Внутри функции init ну или в даташите
@vitalypuzrin
@vitalypuzrin 4 жыл бұрын
Вот github.com/littlevgl/lv_font_conv :). Когда устал от стремных шрифтов на эмбедах, запилил спецификацию и конвертор из TTF. С кернингом, сжатием и субпиксельным сглаживанием. Вот тут фоточка на 0.96" дисплее github.com/puzrin/dispenser/blob/master/doc/assembly.md#pcb-assembly. Это сейчас на LittlevGL поддерживается, но формат шрифта описан подробно, желающие могут привинтить куда душе угодно.
@VladimirMedintsev
@VladimirMedintsev 4 жыл бұрын
Спасибо вам огромное, очень красиво шрифт смотрится.
@ussh469
@ussh469 4 жыл бұрын
Лайк как и обычно)
@АлександрСмирнов-л6з
@АлександрСмирнов-л6з 3 жыл бұрын
разобраться не получается с русскими буквами , если выводить 7*11 как отдельный символ ST7789_DrawChar_7x11 то выводит нормально, а если строкой ST7789_print_7x11 то каракули почему то. 5*7 выводит все нормально. Нужна помощь автора. Еще подскажите есть дисплейчик 240*240 St7789, ничего не выводится, только горит подсветка, как можно определить что он не исправный?
@rinatkin7194
@rinatkin7194 4 жыл бұрын
Здравствуйте можете показать код инициализации дисплея 7789 на С
@VladimirMedintsev
@VladimirMedintsev 4 жыл бұрын
В описании этого видео есть ссылка на библиотеку. Скачайте и там код на Си. И там инициализация.
@ДенисДавыдов-г6ы
@ДенисДавыдов-г6ы 4 жыл бұрын
Здравствуйте, не подскажите как добавить шрифт крупнее?
@VladimirMedintsev
@VladimirMedintsev 4 жыл бұрын
По аналогии с уже добавленными.
@BizonAll
@BizonAll 3 жыл бұрын
А как подключить вашу библиотеку в STM32CubeIDE для платы BluePill? Я, вроде бы, разобрался в том, как подключить SPI, кварц, переназначить пины для BLK, DC и RES; также изменил в библиотеках и шрифтах HAL-библиотеку для своего микроконтроллера (STM32F103C8T6), но, учитывая, что вы, судя по всему, программировали в Keil, есть какое-то несовпадение по дополнительным библиотекам ввода-вывода. P.S.: только начинаю осваивать STM32. Осваиваю с определённой целью: сделать кое-какое устройство на основе этого микроконтроллера и экранчика. Так что не судите строго, если задаю глупый вопрос...
@bdfy8349
@bdfy8349 3 жыл бұрын
эта библиотека - хлам. Хотите быстро сделать устройство на bluepill, то устанавливайте на него sm32duino и берите готовую библиотеку от cbm80amiga. Она работает в разы быстрее хлама в видео, а пользоваться ей в разы удобнее.
@BizonAll
@BizonAll 3 жыл бұрын
@@bdfy8349 Мне ваш путь не подходит как минимум потому, что я хочу весь проект делать не в среде Arduino, а в STM32CubeIDE... Так что, если творчески перерабатывать ваше предложение, то мне необходимо адаптировать библиотеку CBM80Amiga под STM32. Но тогда уж легче попробовать "прикрутить" эту к своему проекту... Точнее, я и пробую это сделать... Но, подозреваю, проблема в том, что частота работы SPI для STM32F030 отличается от таковой для STM32F103, потому что выставить аналогичную частоту с помощью предделителей на STM32F103 мне не удалось: либо больше, либо меньше (18Mbits/s или 9Mbits/s против 12Mbits/s в оригинале). Кроме того, в оригинальном проекте SPI параметр DataSize равен 4bits, а для STM32F103 этот параметр можно выставить в 8bits или в 16bits. Также, вероятно, я чего-то не учитываю при переносе проекта из среды Keil на STM32CubeIDE. Из того, что сделал: 1) подменил библиотеку "stm32f0xx.h" в файлах шрифтов на "stm32f1xx_hal.h" (вопрос: корректная ли замена? И, вообще, нужно ли там подключать эту библиотеку? А то не вижу в этом смысла); 2) сделал аналогичную замену в файлах "st7789.h" и "st7789.c" (заменил "stm32f0xx_hal.h" на "stm32f0xx_hal.h"); 3) в файле "st7789.c" заменил строку #include на #include "main.h", чтобы библиотека работы с экранчиком могла взаимодействовать с контактами, к которым этот экранчик подключен К сожалению, моего опыта в программировании не хватает для полноценного понимания того, что происходит в функциях "ST7789_SendCmd" и "ST7789_SendData"... :-( А именно там идёт взаимодействие с интерфейсом SPI... P.S.: хотелось бы увидеть комментарии Vladimir Medintsev на тему того, что я делаю неправильно... И, по-возможности, объяснения, что и как мне сделать, чтобы данная библиотека заработала на плате BluePill STM32F103C8T6...
@Sborka_Electron
@Sborka_Electron 3 жыл бұрын
@@BizonAll Ого я сегодня то же самое сделал подменил. У меня заработало
@BizonAll
@BizonAll 3 жыл бұрын
@@Sborka_Electron если бы вы на видео показали все свои шаги для подключения этой библиотеки, от момента создания проекта до момента подключения дисплея к микроконтроллеру, а также работающий дисплей, я был бы вам очень благодарен!
@VladimirMedintsev
@VladimirMedintsev 3 жыл бұрын
Я два месяца на это смотрел. Что необходимо сделать: 1. Создать пустой проект в кубе под микроконтроллер вашей макетки. 2. Скопировать в проект файлы библиотеки. 3. Добавить их в проект. 4. Изменить 2 функции в которых проходит работа с SPI. И все, и все будет работать.
@AxGxP
@AxGxP 4 жыл бұрын
1:37 39 строка, проверки на
@Ch-zp9ft
@Ch-zp9ft 4 жыл бұрын
Здравствуйте! Спасибо за ваши видео, безценно для начинающего. Работаю с True Studio . Ваша библиотека там успешно заработала. Подскажите как реализовать там русский язык, просто напечатанные символы не выводятся.
@VladimirMedintsev
@VladimirMedintsev 4 жыл бұрын
Значит что-то не так с кодировкой текста в используемой IDE. У вас там случайно не unicode включена? Как бы вы же сидите перед компьютером. Проверьте что ваша функция отдает в библиотеку и далее и далее. Отладку никто не отменял.
@Ch-zp9ft
@Ch-zp9ft 4 жыл бұрын
@@VladimirMedintsev Спасибо, будем искать!
@generalleitenant42
@generalleitenant42 4 жыл бұрын
Здраствуйте . Попробовал вашу библиотеку только с дисплеем st7789 1.14inch 135X240 ТАК у меня и не запустился дислей
@VladimirMedintsev
@VladimirMedintsev 4 жыл бұрын
А у меня запустился :-)
@generalleitenant42
@generalleitenant42 4 жыл бұрын
@@VladimirMedintsev именно 135х240
@VladimirMedintsev
@VladimirMedintsev 4 жыл бұрын
Важно не разрешение, а контроллер. Если контроллер правильный то должно всё работать. Можно попробовать посмотреть что там по spi, уменьшить скорость).
@generalleitenant42
@generalleitenant42 4 жыл бұрын
@@VladimirMedintsev скорость нормальная , а я могу вам отправить чтоб вы посмотрели может все таки где то я ошибаюсь
@stari40k
@stari40k 4 жыл бұрын
Вы внимательно посмотрите, там ДЕФАЙНАМИ скорее всего сделано, в итоге тот же массив.
@Ironziz
@Ironziz 4 жыл бұрын
Здравствуйте Владимир !!! Библиотека действительно получилась классная ))) Спасибо вам, испытал. Единственно шрифты, почему то у меня печатаются зеркально ((( , Использую st7735 Использовал шрифт 7x11
@MrSasha3050
@MrSasha3050 4 жыл бұрын
🔥
@MrCrossRaccoon
@MrCrossRaccoon 4 жыл бұрын
эхххх, я думал, он масштабируется до 240*320 :) придётся адафрутовскую колупать
@MrCrossRaccoon
@MrCrossRaccoon 4 жыл бұрын
UPD Семён Семёныч! (с) как я сразу не заметил, что размеры экрана uint8_t ))) колупаю Вашу библиотеку, в топку адафрут :) UPD и после передачи данных (и команд) надо бы притормозить разок __NOP(), а то у меня артефакты появляются :) Вот теперь всё работает, спасибище :)
@VladimirMedintsev
@VladimirMedintsev 4 жыл бұрын
Простите не понял, где артефакты? Где nop() поставить?
@MrCrossRaccoon
@MrCrossRaccoon 4 жыл бұрын
@@VladimirMedintsev после *((__IO uint8_t *)&SPI1->DR) = Cmd; и, соответственно, Data. Это на 18мбит SPI, с меньшей скоростью наверное уже паузу полноценную надо будет ставить, пока не проверял. ну и 16 бит там, где высота/ширина и область вывода данных задаётся.
@ЮрийИванов-т8о
@ЮрийИванов-т8о 3 жыл бұрын
С таким качественным дисплеем работать без сглаживания, себя не уважать
@13-Radeon
@13-Radeon 2 жыл бұрын
Адаптировал данную библиотеку под AVR на программный SPI, добавил поддержку нескольких шрифтов, так же добавил функцию форматированного вывода значения переменной со знаком и запятой. Сам демо поект собран в среде Code Vision AVR 2.05.0, под Atmega8L. В данной компиляции у меня дисплей имеет разрешение 240х280 в горизонтальной развертке. Владимир добавил возможность смены ориентации и изменение разрешения дисплея, так что все настраивается! drive.google.com/file/d/1_4ijNgu4xJqDpVWpNUmTr_0ztTrHzqdh/view?usp=sharing Во второй ссылке вся необходимая информация по дисплею, включая программу для генерации шрифтов, но нужно кое что знать об этом. В папке "Создание шрифтов" есть файл "Как создать шрифт". Поскольку саму функцию отрисовки шрифтов я тоже изменил, что бы ускорить функцию и уменьшить занимаемую память.... drive.google.com/file/d/1EOHFAokXYvg3XXALrQTWTfpFGdDAXY26/view?usp=sharing ОБРАТИТЕ ВНИМАНИЕ, ЧТО В ПОСЛЕДНЕМ АРХИВЕ ЛЕЖАТ И ПРИМЕРЫ ДЛЯ STM. ТЕ ЭКЗЕМПЛЯРЫ ИМЕЮТ МИНИМУМ ИЗМЕНЕНИЙ ОТ ТОГО ЧТО ПРЕДСТАВЛЕНО В ВИДЕО. ВСЕ ИЗМЕНЕНИЯ, КОТОРЫЕ НА МОЙ ВЗГЛЯД НАПРАВЛЕННЫЕ НА ОПТИМИЗАЦИЮ, РЕАЛИЗОВАНЫ ИМЕННО В ПРИМЕРЕ ПОД AVR!!! Разумеется программный SPI не ускоряет работу, просто мне так было удобней с моей отладочной платой... Прикрутить аппаратный SPI не проблема. В данном видео Владимир разжувал, где, что и за что....
My scorpion was taken away from me 😢
00:55
TyphoonFast 5
Рет қаралды 2,7 МЛН
黑天使只对C罗有感觉#short #angel #clown
00:39
Super Beauty team
Рет қаралды 36 МЛН
REAL or FAKE? #beatbox #tiktok
01:03
BeatboxJCOP
Рет қаралды 18 МЛН
01 - Беспилотник на ESP32 - Введение (VS Code + ESP-IDF)
15:48
Беспилотник на ESP32
Рет қаралды 834
IPS displays on ST7789 and ST7735 controllers
13:20
Электроника в объективе
Рет қаралды 224 М.
Nokia zoom 💀
0:12
Mohamed gamer
Рет қаралды 2,4 МЛН
Cómo meter un TELÉFONO en un aula📲 #cortos
0:28
Jelly Jail Spanish
Рет қаралды 1,1 МЛН
СДЕЛАЙ ТАК . Пульт будет работать вечно
9:39
Мужские интересы 79
Рет қаралды 604 М.
Самый лучший телефон
0:58
Hi Store Media
Рет қаралды 413 М.
Mac Mini M4 - ОН ИЗМЕНИТ ИГРУ
17:47
ЗЕ МАККЕРС
Рет қаралды 79 М.