Video není dostupné.
Omlouváme se.

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

Sdílet
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

Komentáře • 62

  • @fly8r358
    @fly8r358 Před 4 lety

    И все таки, Владимир, Вы делитесь своим опытом, хоть и размышляли на коммерческие темы. За это Вам огромное спасибо! Продолжайте в том же духе! Крайне полезная информация для саморазвития.

  • @shamanhex
    @shamanhex Před 3 lety

    Отлично! Как раз подбираю монитор для корпуса на din-рейку.

  • @f33net
    @f33net Před 4 lety +12

    Рисовать шрифты крестиками в символьном массиве да ещё обрабатывать это не препроцессором при компиляции, а оставлять в нагрузку чипу - это самое то однокристалкам :))) Осталось только винду в однокристалку загнать... :)))
    Если кому трудно сделать шрифт отдельно (кроме дурины, все компиляторы имеют инструменты для редактирования шрифтов), то, хотя бы, отдать это дело препроцессору - дефайнами крестики менять на единички, подчёркивание на нолик и получать из этого записи в двоичном виде сразу на этапе компиляции. Да и описывать битовые матрицы сразу в коде двоичными числами чуть менее наглядно, чем крестиками.

    • @VladimirMedintsev
      @VladimirMedintsev  Před 4 lety

      Про препроцессор очень хорошая идея. Я до нее не догадался. Очень спасибо. Таким образом можно решить много проблем.

    • @SergeLevin
      @SergeLevin Před 4 lety +3

      Не поленился, сходил на канал, откуда взят данный пример и посмотрел как там это реализовано. Идея в том, что массив на самом деле не символьный. А перед определением шрифта подключается файл с пачкой дефайнов (#include "font.h" на 05:16):
      #define ________ 0x00
      #define _______X 0x01
      .........
      #define XXXXXXXX 0xFF
      Т.е. всё уже отдано на откуп препроцессору.

    • @VladimirMedintsev
      @VladimirMedintsev  Před 4 lety

      @@SergeLevin Уже увидел. И мне это все больше нравится.

    • @philkulibin2602
      @philkulibin2602 Před 4 lety

      @@VladimirMedintsev не знаю какой у вас С версии а у меня
      0x0f == 0b00001111
      Значит true

    • @silentage6310
      @silentage6310 Před 4 lety +1

      по синтаксису сразу было понятно что это дефайны. там же коды(X _) не в строках были.

  • @aka_DRY
    @aka_DRY Před 4 lety +7

    По поводу шрифтов страдал тоже, сердце успокоилось на uGFX. Хоть и тяжеловата, но могуча. А главное, что шрифты можно брать прямо из /usr/share/fonts/truetype/

  • @ussh469
    @ussh469 Před 4 lety

    Лайк как и обычно)

  • @MrSasha3050
    @MrSasha3050 Před 4 lety +1

    🔥

  • @user-ot5js1gy5j
    @user-ot5js1gy5j Před 4 lety +3

    Когда-то нашел программу LCD font maker , как по мне оказалась удобней других.

  • @AlexandrZverev
    @AlexandrZverev Před 4 lety +2

    Сглаженные шрифты, подготовленные в графическом редакторе на таком экранчике выглядят идеально). Сделал вывод цифр крупным шрифтом таким образом, картинки хранятся на spi flash.

    • @sledleo
      @sledleo Před 3 lety

      какой редактор и какая процедура?

    • @AlexandrZverev
      @AlexandrZverev Před 3 lety

      @@sledleo , редактор любой подходящий, смысл в том, чтобы сделать сглаживание шрифтов и вывести в нужном формате цветности(565). Каждый символ отдельным файлом .bmp Использовал GIMP. Позже нашел github.com/lvgl/lv_font_conv, конвертер шрифтов в bmp, сглаживание есть, опций много, но пока не использовал, и для моего варианта там не хватает выбора цвета текста и фона.
      Подготовил файлы bmp в GIMP, разные по ширине символы разделил на два подмножества (цифры одной ширины, а точка и т.п. другой ширины), записал на флэш w25q64, туда же хотел записать таблицу сопоставления символ - адрес символа, но так как был отдельный мало использованный eeprom, то записал на eeprom, с учетом что это первые отладочные экземпляры и так проще было загружать произвольные изображения по uart и править таблицу загруженных.
      Символы выводятся на экран как есть, если надо много вариантов цветов текста и фона, то добавляются соответствующие подготовленные изображения, да, работы руками в редакторе много, если нужен весь алфавит или много цветовых вариантов, но я делал только цифры и несколько значков для единиц измерения.
      Вывод символа: ищем символ в таблице символов, читаем символ по найденному адресу в буфер озу (один spi) и выводим на экран(другой spi), by DMA.
      Для ускорения выводятся только те символы строки, которые изменились в ней с прошлого раза.(а также все последующие за измененным, так как измененная ширина может сбить оставшуюся часть строки). Оптимизация для находящихся на одном месте экрана строк, которые периодически обновляются.
      Ссылки на код дать не могу - он в полностью отлаженном, но непричесанном варианте, пока не созрел для github).

  • @Ryazanec13
    @Ryazanec13 Před 3 lety

    Обожаю экран от нокии 1202, жаль, что фиг где достаёшь сейчас. В магазине одном по 70р в свое время все экраны скупил, лет 8 назад. В первую машину ваз2110 делал бортовой комп на нем. Описание протокола общения с эбу в интернете нашлось, и в итоге мне это 3 раза в ремонте помогло, один раз хреновы бензином заправил я и вылез чек по детонации, второй раз катушка барахлила, вылезла ошибка по пропускаем и третий раз ошибка по датчику коленвала отловил, провод отгнил.

  • @masterkit9517
    @masterkit9517 Před 4 lety +6

    Бесценный канал!

  • @silentage6310
    @silentage6310 Před 4 lety +3

    интересно, сам неделю назад делал себе инструмент для создания шрифтов для мини дисплейчика на ws2812.
    на js/vue за вечер управился. догадывался что есть готовые сервисы/рпограммы, просто самому интересно было разобраться.

  • @Kaaaaaaaaaarrrrr
    @Kaaaaaaaaaarrrrr Před 4 lety +1

    Со шрифтом 5х8 работает изумительно, а 7х11 кириллицу выводит кракозябрами

  • @sergeydrachuk8612
    @sergeydrachuk8612 Před 3 lety

    Возможно, можно было использовать старую библиотеку от Нокии. Контроллеру (по крайней мере ST7789S) можно задать любые направления отрисовки через MADCTL (36h): Memory Data Access Control .

  • @vitalypuzrin
    @vitalypuzrin Před 4 lety +2

    Вот github.com/littlevgl/lv_font_conv :). Когда устал от стремных шрифтов на эмбедах, запилил спецификацию и конвертор из TTF. С кернингом, сжатием и субпиксельным сглаживанием. Вот тут фоточка на 0.96" дисплее github.com/puzrin/dispenser/blob/master/doc/assembly.md#pcb-assembly. Это сейчас на LittlevGL поддерживается, но формат шрифта описан подробно, желающие могут привинтить куда душе угодно.

    • @VladimirMedintsev
      @VladimirMedintsev  Před 4 lety

      Спасибо вам огромное, очень красиво шрифт смотрится.

  • @konstantingolinskiy4944
    @konstantingolinskiy4944 Před 4 lety +2

    Можно использовать всего один шрифт размером например 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 Před 3 lety

      Ого, не ожидал вас тут увидеть. Спасибо за код и платку ст-линк в2.1, работает изумительно

  • @allaksusallaksus2402
    @allaksusallaksus2402 Před 4 lety +2

    Символы _ и X анализирует компилятор а не целевая программа, поэтому занимаемое шрифтами место останется таким же как и с помощью записи в виде шестнадцатиразрядных чисел

  • @allaksusallaksus2402
    @allaksusallaksus2402 Před 4 lety +3

    Все строки состоящие из символов _ и X состоят из восьми символов и где-то в вашей программе есть следующее #define _X_X_X_X 0x55

    • @VladimirMedintsev
      @VladimirMedintsev  Před 4 lety +2

      Да, да, спасибо уже увидел как там хитро все реализовано. И честно говоря мне это жутко понравилось. Так что теперь возьму на вооружение.
      Я до такого приема действительно не додумался.

  • @Ironziz
    @Ironziz Před 4 lety

    Здравствуйте Владимир !!! Библиотека действительно получилась классная ))) Спасибо вам, испытал.
    Единственно шрифты, почему то у меня печатаются зеркально ((( , Использую st7735
    Использовал шрифт 7x11

  • @Ch-zp9ft
    @Ch-zp9ft Před 4 lety

    Здравствуйте! Спасибо за ваши видео, безценно для начинающего.
    Работаю с True Studio . Ваша библиотека там успешно заработала. Подскажите как реализовать там русский язык, просто напечатанные символы не выводятся.

    • @VladimirMedintsev
      @VladimirMedintsev  Před 4 lety

      Значит что-то не так с кодировкой текста в используемой IDE. У вас там случайно не unicode включена? Как бы вы же сидите перед компьютером. Проверьте что ваша функция отдает в библиотеку и далее и далее. Отладку никто не отменял.

    • @Ch-zp9ft
      @Ch-zp9ft Před 4 lety

      @@VladimirMedintsev Спасибо, будем искать!

  • @user-uc5no6sy7y
    @user-uc5no6sy7y Před 3 lety

    разобраться не получается с русскими буквами , если выводить 7*11 как отдельный символ ST7789_DrawChar_7x11 то выводит нормально, а если строкой ST7789_print_7x11 то каракули почему то. 5*7 выводит все нормально. Нужна помощь автора. Еще подскажите есть дисплейчик 240*240 St7789, ничего не выводится, только горит подсветка, как можно определить что он не исправный?

  • @MrCrossRaccoon
    @MrCrossRaccoon Před 4 lety

    эхххх, я думал, он масштабируется до 240*320 :) придётся адафрутовскую колупать

    • @MrCrossRaccoon
      @MrCrossRaccoon Před 4 lety +1

      UPD Семён Семёныч! (с) как я сразу не заметил, что размеры экрана uint8_t ))) колупаю Вашу библиотеку, в топку адафрут :) UPD и после передачи данных (и команд) надо бы притормозить разок __NOP(), а то у меня артефакты появляются :) Вот теперь всё работает, спасибище :)

    • @VladimirMedintsev
      @VladimirMedintsev  Před 4 lety

      Простите не понял, где артефакты? Где nop() поставить?

    • @MrCrossRaccoon
      @MrCrossRaccoon Před 4 lety +1

      @@VladimirMedintsev после *((__IO uint8_t *)&SPI1->DR) = Cmd; и, соответственно, Data. Это на 18мбит SPI, с меньшей скоростью наверное уже паузу полноценную надо будет ставить, пока не проверял. ну и 16 бит там, где высота/ширина и область вывода данных задаётся.

  • @stari40k
    @stari40k Před 4 lety

    Вы внимательно посмотрите, там ДЕФАЙНАМИ скорее всего сделано, в итоге тот же массив.

  • @rinatkin7703
    @rinatkin7703 Před 3 lety

    Здравствуите , где наити команды инициализации .настроики этого дисплея

    • @VladimirMedintsev
      @VladimirMedintsev  Před 3 lety

      Внутри функции init ну или в даташите

  • @user-qg6bp4pu3p
    @user-qg6bp4pu3p Před 3 lety

    Здравствуйте, не подскажите как добавить шрифт крупнее?

  • @AxGxP
    @AxGxP Před 4 lety

    1:37 39 строка, проверки на

  • @BizonAll
    @BizonAll Před 3 lety

    А как подключить вашу библиотеку в STM32CubeIDE для платы BluePill? Я, вроде бы, разобрался в том, как подключить SPI, кварц, переназначить пины для BLK, DC и RES; также изменил в библиотеках и шрифтах HAL-библиотеку для своего микроконтроллера (STM32F103C8T6), но, учитывая, что вы, судя по всему, программировали в Keil, есть какое-то несовпадение по дополнительным библиотекам ввода-вывода.
    P.S.: только начинаю осваивать STM32. Осваиваю с определённой целью: сделать кое-какое устройство на основе этого микроконтроллера и экранчика. Так что не судите строго, если задаю глупый вопрос...

    • @bdfy8349
      @bdfy8349 Před 3 lety

      эта библиотека - хлам. Хотите быстро сделать устройство на bluepill, то устанавливайте на него sm32duino и берите готовую библиотеку от cbm80amiga. Она работает в разы быстрее хлама в видео, а пользоваться ей в разы удобнее.

    • @BizonAll
      @BizonAll Před 3 lety

      @@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 Před 3 lety

      @@BizonAll Ого я сегодня то же самое сделал подменил. У меня заработало

    • @BizonAll
      @BizonAll Před 3 lety

      @@Sborka_Electron если бы вы на видео показали все свои шаги для подключения этой библиотеки, от момента создания проекта до момента подключения дисплея к микроконтроллеру, а также работающий дисплей, я был бы вам очень благодарен!

    • @VladimirMedintsev
      @VladimirMedintsev  Před 3 lety

      Я два месяца на это смотрел. Что необходимо сделать: 1. Создать пустой проект в кубе под микроконтроллер вашей макетки.
      2. Скопировать в проект файлы библиотеки. 3. Добавить их в проект. 4. Изменить 2 функции в которых проходит работа с SPI. И все, и все будет работать.

  • @rinatkin7194
    @rinatkin7194 Před 3 lety

    Здравствуйте можете показать код инициализации дисплея 7789 на С

    • @VladimirMedintsev
      @VladimirMedintsev  Před 3 lety

      В описании этого видео есть ссылка на библиотеку. Скачайте и там код на Си. И там инициализация.

  • @generalleitenant42
    @generalleitenant42 Před 3 lety

    Здраствуйте . Попробовал вашу библиотеку только с дисплеем st7789 1.14inch 135X240 ТАК у меня и не запустился дислей

    • @VladimirMedintsev
      @VladimirMedintsev  Před 3 lety

      А у меня запустился :-)

    • @generalleitenant42
      @generalleitenant42 Před 3 lety

      @@VladimirMedintsev именно 135х240

    • @VladimirMedintsev
      @VladimirMedintsev  Před 3 lety

      Важно не разрешение, а контроллер. Если контроллер правильный то должно всё работать. Можно попробовать посмотреть что там по spi, уменьшить скорость).

    • @generalleitenant42
      @generalleitenant42 Před 3 lety

      @@VladimirMedintsev скорость нормальная , а я могу вам отправить чтоб вы посмотрели может все таки где то я ошибаюсь

  • @13-Radeon
    @13-Radeon Před rokem

    Адаптировал данную библиотеку под 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 не проблема. В данном видео Владимир разжувал, где, что и за что....

  • @user-tz8cu7pe9d
    @user-tz8cu7pe9d Před 3 lety +2

    С таким качественным дисплеем работать без сглаживания, себя не уважать