Комментарии 11
UPD: Добавил ещё кириллический шрифт в файлы, может пригодится, чтобы так же не изворачиваться
Первое, что вам необходимо узнать, — это какой контроллер установлен в вашем дисплее.
Затем нужно узнать, какая у него частота обработки одного бита, передаваемого через протокол. Из опыта: самое простое и эффективное — передавать данные через протокол SPI.
Дальше нужно узнать частоту шины микроконтроллера, через которую вы будете передавать данные на пины.
Затем составьте минимальный набор команд для обновления одного пикселя, с лёгкостью подсчитайте, сколько времени будут выполняться эти команды, и далее посчитайте, сколько пикселей вам нужно обновить для смены одного кадра. И умножьте на желаемую частоту анимаций.
Так вы получите необходимые требования по частоте передачи данных для плавной анимации и заранее поймёте, реальна ли вообще эта задача.
К слову у вас ST7789 который довольно плохо, самый лучший это NV3030B для TFT дисплея (Банально открываете документацию и смотрите на скорости обработки данных по SPI)
Ну ещё не слова про DMA, хотя тут он просто необходим
Раз DMA, то и двойная буферизация.
Спасибо что обратили внимание. Если честно статья ориентирована на новичков (коим я и являюсь), потому по техническим деталям отделался одним предложением.
По существу: Оптимизация тут не про максимальный фреймрейт, а про минимум поедания ресурсов без серьезных потерь качества.
DMA конечно используется, инициализация шины идет через spi_bus_initialize(…, SPI_DMA_CH_AUTO), а сам драйвер esp_lcd работает на асинхронном DMA с прерыванием on_color_trans_done.
Поэтому два буфера есть и живут в PSRAM (а не внутренней sram), я уменьшил trans_queue_depth (до 4) и max_transfer_sz (до 40 строк). В итоге пиковое потребление DMA-памяти упало с ~380 КБ до ~77 КБ, что критично для параллельной работы остальных модулей
да тут очень бы интересен пример кода без использования lvgl. esp_idf на lvgl ориентировано, я не видел альтернативных вариантов, только под ardiuno
UPD: Добавил в файлы display.cpp / display.h. Это чистая работа с драйвером (esp_lcd, SPI, DMA, PSRAM, double buffering) без моей анимации.
Есть момент: функция swap_gb565() — это компенсация конкретной BGR-раскладки моей панели. Сейчас она работает на лету . Если у вас RGB — она не нужна. В будущем планирую запечь её в LUT , но пока оставил так для калибровки
я бы сказал тут вообще ни слова ни строки кода про это.
впрочем esp_idf а равно и arduino имеет это "аппаратное ускорение" нескольких видов дисплейных интерфейсов "из коробки", да и поддержку ST7789 официальную, он может не только spi, просто это размазано по 4 слоям hal.
постановка вопроса тут странная: контроллер выбирает изготовитель дисплейного модуля в зависимости от матрицы, поэтому обычно имеем "что дают". я вообще не видел модулей с этим самым NV3030B
Если что, все эти контроллеры спокойно работают с подобной матрицей; просто новых-то особо не делают, вот и остаётся мусор, а хороший контроллер всё труднее найти.
Ну, в будущем вообще ничего такого не будет: старое поколение вымрет, а новому оно не надо — скажут: «Ты чё, дед, это прошлый век», — и полезут в ИИ )
Уже сейчас среди людей до 30 лет трудно найти таких, которые не просто интересовались бы подобным, а имели бы понимание того, как всё это работает
про драйвер я уже писал выше — ST7789 мне подошёл именно из-за скруглённых краёв матрицы и пропорций, которые позволяют уместить и лицо, и текст, приятный визуал относительно других модулей и корпуса. А узкое место тут — память и CPU, которые нужны для остальных модулей (FSM, моторы, парсеры, сеть, память и т.д.)
Насчёт «поколения не то» — инженерия это слои. Есть те, кто проектирует матрицы и драйверы. А есть те, кто использует эти решения в прикладных проектах. Мне нужно было нарисовать лицо, а не написать драйвер. ESP-IDF даёт esp_lcd из коробки — я им и воспользовался. кто-то копает вглубь, кто-то строит вширь, и то и то важно
Именно! Мне просто подошёл дисплей по дизайну и пропорциям под проект. Хотя в целом мне нужны были большие разделённые пиксели OLED монохром, но найти именно такой, в нужном цвете пикселей не удалось — потому решал эти дизайн-задачи программно, а не железом.
А драйвер... ну, ST7789. Он работает, есть в ESP-IDF из коробки (esp_lcd_new_panel_st7789), и с ним всё получилось. Если бы попался другой — разницы бы не было, главное, чтобы SPI и DMA тянули.

Качественная анимация на микроконтроллере с оптимизацией, через мои костыли: