Video není dostupné.
Omlouváme se.
STM32 + ST7789 Добавляем поддержку шрифтов. Примеры работы со шрифтами и битовыми изображениями.
Vložit
- čas přidán 9. 02. 2020
- STM32 + ST7789 Добавляем поддержку шрифтов в быструю и очень компактную библиотеку. Примеры работы со шрифтами и битовыми изображениями.
STM32 + Дисплей ST7789. Быстрая и компактная библиотека - • STM32 + Дисплей ST7789...
Канал в телеграмм - t.me/vladimir_medintsev
Канал Яндекс.Дзен - zen.yandex.ru/vladimir_medintsev
Канал на RuTube - rutube.ru/channel/1797552/
Канал на CZcams - / vladimirmedintsev
------------------------------------------
Если вы хотите поддержать автора канала номер карты Сбер:
2202-2023-2480-4008
------------------------------------------
Библиотека - yadi.sk/d/yYAcEDXok7-d1g
И все таки, Владимир, Вы делитесь своим опытом, хоть и размышляли на коммерческие темы. За это Вам огромное спасибо! Продолжайте в том же духе! Крайне полезная информация для саморазвития.
Спасибо.
Отлично! Как раз подбираю монитор для корпуса на din-рейку.
Рисовать шрифты крестиками в символьном массиве да ещё обрабатывать это не препроцессором при компиляции, а оставлять в нагрузку чипу - это самое то однокристалкам :))) Осталось только винду в однокристалку загнать... :)))
Если кому трудно сделать шрифт отдельно (кроме дурины, все компиляторы имеют инструменты для редактирования шрифтов), то, хотя бы, отдать это дело препроцессору - дефайнами крестики менять на единички, подчёркивание на нолик и получать из этого записи в двоичном виде сразу на этапе компиляции. Да и описывать битовые матрицы сразу в коде двоичными числами чуть менее наглядно, чем крестиками.
Про препроцессор очень хорошая идея. Я до нее не догадался. Очень спасибо. Таким образом можно решить много проблем.
Не поленился, сходил на канал, откуда взят данный пример и посмотрел как там это реализовано. Идея в том, что массив на самом деле не символьный. А перед определением шрифта подключается файл с пачкой дефайнов (#include "font.h" на 05:16):
#define ________ 0x00
#define _______X 0x01
.........
#define XXXXXXXX 0xFF
Т.е. всё уже отдано на откуп препроцессору.
@@SergeLevin Уже увидел. И мне это все больше нравится.
@@VladimirMedintsev не знаю какой у вас С версии а у меня
0x0f == 0b00001111
Значит true
по синтаксису сразу было понятно что это дефайны. там же коды(X _) не в строках были.
По поводу шрифтов страдал тоже, сердце успокоилось на uGFX. Хоть и тяжеловата, но могуча. А главное, что шрифты можно брать прямо из /usr/share/fonts/truetype/
TheDotFactory
Лайк как и обычно)
🔥
Когда-то нашел программу LCD font maker , как по мне оказалась удобней других.
Сглаженные шрифты, подготовленные в графическом редакторе на таком экранчике выглядят идеально). Сделал вывод цифр крупным шрифтом таким образом, картинки хранятся на spi flash.
какой редактор и какая процедура?
@@sledleo , редактор любой подходящий, смысл в том, чтобы сделать сглаживание шрифтов и вывести в нужном формате цветности(565). Каждый символ отдельным файлом .bmp Использовал GIMP. Позже нашел github.com/lvgl/lv_font_conv, конвертер шрифтов в bmp, сглаживание есть, опций много, но пока не использовал, и для моего варианта там не хватает выбора цвета текста и фона.
Подготовил файлы bmp в GIMP, разные по ширине символы разделил на два подмножества (цифры одной ширины, а точка и т.п. другой ширины), записал на флэш w25q64, туда же хотел записать таблицу сопоставления символ - адрес символа, но так как был отдельный мало использованный eeprom, то записал на eeprom, с учетом что это первые отладочные экземпляры и так проще было загружать произвольные изображения по uart и править таблицу загруженных.
Символы выводятся на экран как есть, если надо много вариантов цветов текста и фона, то добавляются соответствующие подготовленные изображения, да, работы руками в редакторе много, если нужен весь алфавит или много цветовых вариантов, но я делал только цифры и несколько значков для единиц измерения.
Вывод символа: ищем символ в таблице символов, читаем символ по найденному адресу в буфер озу (один spi) и выводим на экран(другой spi), by DMA.
Для ускорения выводятся только те символы строки, которые изменились в ней с прошлого раза.(а также все последующие за измененным, так как измененная ширина может сбить оставшуюся часть строки). Оптимизация для находящихся на одном месте экрана строк, которые периодически обновляются.
Ссылки на код дать не могу - он в полностью отлаженном, но непричесанном варианте, пока не созрел для github).
Обожаю экран от нокии 1202, жаль, что фиг где достаёшь сейчас. В магазине одном по 70р в свое время все экраны скупил, лет 8 назад. В первую машину ваз2110 делал бортовой комп на нем. Описание протокола общения с эбу в интернете нашлось, и в итоге мне это 3 раза в ремонте помогло, один раз хреновы бензином заправил я и вылез чек по детонации, второй раз катушка барахлила, вылезла ошибка по пропускаем и третий раз ошибка по датчику коленвала отловил, провод отгнил.
Бесценный канал!
интересно, сам неделю назад делал себе инструмент для создания шрифтов для мини дисплейчика на ws2812.
на js/vue за вечер управился. догадывался что есть готовые сервисы/рпограммы, просто самому интересно было разобраться.
Со шрифтом 5х8 работает изумительно, а 7х11 кириллицу выводит кракозябрами
Возможно, можно было использовать старую библиотеку от Нокии. Контроллеру (по крайней мере ST7789S) можно задать любые направления отрисовки через MADCTL (36h): Memory Data Access Control .
Вот github.com/littlevgl/lv_font_conv :). Когда устал от стремных шрифтов на эмбедах, запилил спецификацию и конвертор из TTF. С кернингом, сжатием и субпиксельным сглаживанием. Вот тут фоточка на 0.96" дисплее github.com/puzrin/dispenser/blob/master/doc/assembly.md#pcb-assembly. Это сейчас на LittlevGL поддерживается, но формат шрифта описан подробно, желающие могут привинтить куда душе угодно.
Спасибо вам огромное, очень красиво шрифт смотрится.
Можно использовать всего один шрифт размером например 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 и т.д
Ого, не ожидал вас тут увидеть. Спасибо за код и платку ст-линк в2.1, работает изумительно
Символы _ и X анализирует компилятор а не целевая программа, поэтому занимаемое шрифтами место останется таким же как и с помощью записи в виде шестнадцатиразрядных чисел
Все строки состоящие из символов _ и X состоят из восьми символов и где-то в вашей программе есть следующее #define _X_X_X_X 0x55
Да, да, спасибо уже увидел как там хитро все реализовано. И честно говоря мне это жутко понравилось. Так что теперь возьму на вооружение.
Я до такого приема действительно не додумался.
Здравствуйте Владимир !!! Библиотека действительно получилась классная ))) Спасибо вам, испытал.
Единственно шрифты, почему то у меня печатаются зеркально ((( , Использую st7735
Использовал шрифт 7x11
Здравствуйте! Спасибо за ваши видео, безценно для начинающего.
Работаю с True Studio . Ваша библиотека там успешно заработала. Подскажите как реализовать там русский язык, просто напечатанные символы не выводятся.
Значит что-то не так с кодировкой текста в используемой IDE. У вас там случайно не unicode включена? Как бы вы же сидите перед компьютером. Проверьте что ваша функция отдает в библиотеку и далее и далее. Отладку никто не отменял.
@@VladimirMedintsev Спасибо, будем искать!
разобраться не получается с русскими буквами , если выводить 7*11 как отдельный символ ST7789_DrawChar_7x11 то выводит нормально, а если строкой ST7789_print_7x11 то каракули почему то. 5*7 выводит все нормально. Нужна помощь автора. Еще подскажите есть дисплейчик 240*240 St7789, ничего не выводится, только горит подсветка, как можно определить что он не исправный?
эхххх, я думал, он масштабируется до 240*320 :) придётся адафрутовскую колупать
UPD Семён Семёныч! (с) как я сразу не заметил, что размеры экрана uint8_t ))) колупаю Вашу библиотеку, в топку адафрут :) UPD и после передачи данных (и команд) надо бы притормозить разок __NOP(), а то у меня артефакты появляются :) Вот теперь всё работает, спасибище :)
Простите не понял, где артефакты? Где nop() поставить?
@@VladimirMedintsev после *((__IO uint8_t *)&SPI1->DR) = Cmd; и, соответственно, Data. Это на 18мбит SPI, с меньшей скоростью наверное уже паузу полноценную надо будет ставить, пока не проверял. ну и 16 бит там, где высота/ширина и область вывода данных задаётся.
Вы внимательно посмотрите, там ДЕФАЙНАМИ скорее всего сделано, в итоге тот же массив.
Здравствуите , где наити команды инициализации .настроики этого дисплея
Внутри функции init ну или в даташите
Здравствуйте, не подскажите как добавить шрифт крупнее?
По аналогии с уже добавленными.
1:37 39 строка, проверки на
А как подключить вашу библиотеку в STM32CubeIDE для платы BluePill? Я, вроде бы, разобрался в том, как подключить SPI, кварц, переназначить пины для BLK, DC и RES; также изменил в библиотеках и шрифтах HAL-библиотеку для своего микроконтроллера (STM32F103C8T6), но, учитывая, что вы, судя по всему, программировали в Keil, есть какое-то несовпадение по дополнительным библиотекам ввода-вывода.
P.S.: только начинаю осваивать STM32. Осваиваю с определённой целью: сделать кое-какое устройство на основе этого микроконтроллера и экранчика. Так что не судите строго, если задаю глупый вопрос...
эта библиотека - хлам. Хотите быстро сделать устройство на bluepill, то устанавливайте на него sm32duino и берите готовую библиотеку от cbm80amiga. Она работает в разы быстрее хлама в видео, а пользоваться ей в разы удобнее.
@@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...
@@BizonAll Ого я сегодня то же самое сделал подменил. У меня заработало
@@Sborka_Electron если бы вы на видео показали все свои шаги для подключения этой библиотеки, от момента создания проекта до момента подключения дисплея к микроконтроллеру, а также работающий дисплей, я был бы вам очень благодарен!
Я два месяца на это смотрел. Что необходимо сделать: 1. Создать пустой проект в кубе под микроконтроллер вашей макетки.
2. Скопировать в проект файлы библиотеки. 3. Добавить их в проект. 4. Изменить 2 функции в которых проходит работа с SPI. И все, и все будет работать.
Здравствуйте можете показать код инициализации дисплея 7789 на С
В описании этого видео есть ссылка на библиотеку. Скачайте и там код на Си. И там инициализация.
Здраствуйте . Попробовал вашу библиотеку только с дисплеем st7789 1.14inch 135X240 ТАК у меня и не запустился дислей
А у меня запустился :-)
@@VladimirMedintsev именно 135х240
Важно не разрешение, а контроллер. Если контроллер правильный то должно всё работать. Можно попробовать посмотреть что там по spi, уменьшить скорость).
@@VladimirMedintsev скорость нормальная , а я могу вам отправить чтоб вы посмотрели может все таки где то я ошибаюсь
Адаптировал данную библиотеку под 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 не проблема. В данном видео Владимир разжувал, где, что и за что....
С таким качественным дисплеем работать без сглаживания, себя не уважать