[Дизайн, Программирование микроконтроллеров] Интеграция в проект LVGL графической библиотеки для микроконтроллеров
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
LVGL — Light and Versatile Graphics Library также известная как LittleVGL.
Библиотека поддерживает большое количество микроконтроллеров, таких как STM32, ESP32 и другие. Мне пока удалось запустить полноценную демо программу на ESP32 и STM32f429 Discovery. Библиотека открытая, поддерживает большое количество графических элементов с Dark and Light темами. Распространяется под MIT license. Можно свободно использовать даже в коммерческих продуктах. Можно посмотреть интерактивное Online Demo без установки на устройство.
Библиотека поддерживает подключение двух типов дисплея.
- Напрямую через интерфейс RGB где буфер будет находится на стороне MCU во внутренней RAM или внешней SDRAM
- Через внешний контроллер дисплея. В этом случае MCU может связываться с контроллером дисплея через SPI или I2C шину. Для улучшения производительности, промежуточные буферы отрисовки внутри MCU также могут быть использованы в этом случае
Two typical hardware set-ups
SPL
MCU with TFT/LCD driver If your MCU has a TFT/LCD driver periphery then you can connect a display directly via RGB interface. In this case, the frame buffer can be in the internal RAM (if the MCU has enough RAM) or in the external RAM (if the MCU has a memory interface).
External display controller If the MCU doesn't have TFT/LCD driver interface then an external display controller (E.g. SSD1963, SSD1306, ILI9341) has to be used. In this case, the MCU can communicate with the display controller via Parallel port, SPI or sometimes I2C. The frame buffer is usually located in the display controller which saves a lot of RAM for the MCU.
Все очень гибко в этом плане. Если у вас есть драйвер то вы можете сами легко интегрировать библиотеку в свой проект
Самый простой способ, но и самый медленный это переписать callback отрисовки — my_flush_cb
void my_flush_cb(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
/*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/
int32_t x, y;
for(y = area->y1; y <= area->y2; y++) {
for(x = area->x1; x <= area->x2; x++) {
put_px(x, y, *color_p)
color_p++;
}
}
/* IMPORTANT!!!
* Inform the graphics library that you are ready with the flushing*/
lv_disp_flush_ready(disp);
}
put_px — Это отрисовка пикселя вашего драйвера. Из за того что отрисовка идет попиксельно это и происходит медленно. В документации библиотеки подробно описаны другие более эффективные способы интеграции
Предположим под ваш дисплей драйвер уже написан порт LVGL и вам надо только интегрировать его в проект. В этом случае первое это сделать инициализацию библиотеки, дисплея и системы ввода вывода:
lv_init();
tft_init();
touchpad_init();
lv_demo_widgets(); // Используется для примера из демо
Поскольку библиотека внутри себя имеет диспетчер задач. Да это мультипотоковая система, поправьте меня если это не так, то нам потребуется увеличивать внутренний счетчик диспетчера посредством вызова lv_tick_inc
void * tick_thread (void *args)
{
while(1) {
usleep(5*1000); /*Sleep for 5 millisecond*/
lv_tick_inc(5); /*Tell LVGL that 5 milliseconds were elapsed*/
}
}
Причем передавать в функцию надо миллисекунды которые прошли с момента ее последнего вызова или другими словами время с момента предыдущей итерации.
Чтобы не тратить ресурсы на лишний поток можно вызывать эту функцию по прерыванию от таймера. Как раз в STM32 есть SysTick таймер для таких целей:
void systickInit (uint16_t frequency)
{
RCC_ClocksTypeDef RCC_Clocks;
RCC_GetClocksFreq (&RCC_Clocks);
(void) SysTick_Config (RCC_Clocks.HCLK_Frequency / frequency);
}
extern "C" void SysTick_Handler (void)
{
lv_tick_inc(1); // 1 ms
}
SysTick timer
SPL
This timer is dedicated to real-time operating systems, but could also be used as a standard
downcounter. It features:
- A 24-bit downcounter
- Autoreload capability
- Maskable system interrupt generation when the counter reaches 0
- Programmable clock source.
Так же надо вызывать в цикле lv_task_handler. Рекомендуется дергать его каждые 5 ms для обеспечения хорошего отклика. Я пробовал увеличивать до 20 ms и система все еще оставалась довольно отзывчивой и плавной. Можно оставить как вечный цикл или использовать Thread
while(1) {
lv_task_handler();
my_delay_ms(5);
}
Циклы должны быть в разных местах. Я сделал ошибку и запихнул обе в один цикл. Вот что из этого получилось — Тормоза
Когда оба метода были разнесены в разные потоки с правильными интервалами все заработало корректно и быстро:
Извините, данный ресурс не поддреживается. :(
Библиотека имеет возможность настраивать количество внутренних буферов:
- Один буфер, когда LVGL рисует содержимое экрана в буфер и отправляет его на дисплей
- Два буфера с неполным размером экрана, пока идет отрисовка в одном буфере, содержимое другого буфера отправляется для отображения в фоновом режиме
- Два буфера размером с целый экран
На сайте есть конвертер для шрифтов и картинок. Можно спокойно добавить свой шрифт в проект или свою иконку в меню. Причем опционально можно грузить картинки с внешнего хранилища например CD-CARD или из массива байт расположенного внутренней Flash памяти.
How to use the generated file in LittlevGL?
SPL
For C arrays
Copy the result C file into your LittlevGL project
In a C file of your application declare the image as: LV_IMG_DECLARE(my_image_name);
Set the image for an lv_img object: lv_img_set_src(img1, &my_image_name);
For external binary files (e.g. SD card)
Set up a new driver. To learn more read the Tutorial.
Set the image for an lv_img object: lv_img_set_src(img1, «S:/path/to/image»);
Еще одна важная и приятная плюшка этой библиотеки, что для ее отладки можно использовать Eclipse IDE в среде Linux и Windows.
Приятно что, для OpenSource библиотеки она хорошо документирована. Имеется множество примеров и портов. Библиотека обросла довольно большим комьюнити.
Я запускал порт для ESP32. Даже при использовании mapping для выводов SPI т.е. не дефолтных, на которых получается лучшая скорость передачи, все работало без замедлений:
ESP32 ST7789 LVGL
ESP32 ILI9341 LVGL
Материалы по теме
SPL
===========
Источник:
habr.com
===========
Похожие новости:
- [C, Программирование микроконтроллеров, Системное программирование, Учебный процесс в IT] Очередная книга про разработку операционных систем
- [Автомобильные гаджеты, Компьютерное железо, DIY или Сделай сам, Дизайн, Разработка под Arduino] STONE LCD Screen for Car Dashboard with RTL8762CJF MCU
- [DIY или Сделай сам, Дизайн, Мониторы и ТВ, Производство и разработка электроники, Разработка под Android] STM32 development board tutorial:use STONE STVC101WT-01 to control STM32
- [Графический дизайн, Дизайн] Дизайн-концепт мерча для сотрудников
- [ERP-системы, Дизайн, Дизайн мобильных приложений, Прототипирование] Как мы решаем проблему отсутствия UI\UX дизайна в 1С с помощью Java Script и React.js
- [Microsoft Edge, Дизайн, Интерфейсы, Разработка под Windows, Софт] В Windows 10 Developer Preview 20161 показали обновления меню «Пуск» и режима миниатюр в Edge
- [DIY или Сделай сам, Программирование микроконтроллеров, Производство и разработка электроники, Разработка робототехники, Схемотехника] Запускаем камеру от телефона, или что делать, когда ничего не получается?
- [Видеокарты, Дизайн игр, Работа с 3D-графикой] Анализ графики Red Dead Redemption 2 (перевод)
- [Интернет вещей, Программирование микроконтроллеров, Разработка для интернета вещей, Разработка систем связи] MQTTv5.0: Обзор новых функций
- [Программирование микроконтроллеров, Производство и разработка электроники] История разработки одного дозиметра (Часть 1)
Теги для поиска: #_dizajn (Дизайн), #_programmirovanie_mikrokontrollerov (Программирование микроконтроллеров), #_lvgl_stm32_esp32_ui_interface, #_dizajn (
Дизайн
), #_programmirovanie_mikrokontrollerov (
Программирование микроконтроллеров
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 23:38
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
LVGL — Light and Versatile Graphics Library также известная как LittleVGL. Библиотека поддерживает большое количество микроконтроллеров, таких как STM32, ESP32 и другие. Мне пока удалось запустить полноценную демо программу на ESP32 и STM32f429 Discovery. Библиотека открытая, поддерживает большое количество графических элементов с Dark and Light темами. Распространяется под MIT license. Можно свободно использовать даже в коммерческих продуктах. Можно посмотреть интерактивное Online Demo без установки на устройство. Библиотека поддерживает подключение двух типов дисплея.
Two typical hardware set-upsSPLMCU with TFT/LCD driver If your MCU has a TFT/LCD driver periphery then you can connect a display directly via RGB interface. In this case, the frame buffer can be in the internal RAM (if the MCU has enough RAM) or in the external RAM (if the MCU has a memory interface).
External display controller If the MCU doesn't have TFT/LCD driver interface then an external display controller (E.g. SSD1963, SSD1306, ILI9341) has to be used. In this case, the MCU can communicate with the display controller via Parallel port, SPI or sometimes I2C. The frame buffer is usually located in the display controller which saves a lot of RAM for the MCU. Все очень гибко в этом плане. Если у вас есть драйвер то вы можете сами легко интегрировать библиотеку в свой проект Самый простой способ, но и самый медленный это переписать callback отрисовки — my_flush_cb void my_flush_cb(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{ /*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/ int32_t x, y; for(y = area->y1; y <= area->y2; y++) { for(x = area->x1; x <= area->x2; x++) { put_px(x, y, *color_p) color_p++; } } /* IMPORTANT!!! * Inform the graphics library that you are ready with the flushing*/ lv_disp_flush_ready(disp); } put_px — Это отрисовка пикселя вашего драйвера. Из за того что отрисовка идет попиксельно это и происходит медленно. В документации библиотеки подробно описаны другие более эффективные способы интеграции Предположим под ваш дисплей драйвер уже написан порт LVGL и вам надо только интегрировать его в проект. В этом случае первое это сделать инициализацию библиотеки, дисплея и системы ввода вывода: lv_init();
tft_init(); touchpad_init(); lv_demo_widgets(); // Используется для примера из демо Поскольку библиотека внутри себя имеет диспетчер задач. Да это мультипотоковая система, поправьте меня если это не так, то нам потребуется увеличивать внутренний счетчик диспетчера посредством вызова lv_tick_inc void * tick_thread (void *args)
{ while(1) { usleep(5*1000); /*Sleep for 5 millisecond*/ lv_tick_inc(5); /*Tell LVGL that 5 milliseconds were elapsed*/ } } Причем передавать в функцию надо миллисекунды которые прошли с момента ее последнего вызова или другими словами время с момента предыдущей итерации. Чтобы не тратить ресурсы на лишний поток можно вызывать эту функцию по прерыванию от таймера. Как раз в STM32 есть SysTick таймер для таких целей: void systickInit (uint16_t frequency)
{ RCC_ClocksTypeDef RCC_Clocks; RCC_GetClocksFreq (&RCC_Clocks); (void) SysTick_Config (RCC_Clocks.HCLK_Frequency / frequency); } extern "C" void SysTick_Handler (void) { lv_tick_inc(1); // 1 ms } SysTick timerSPLThis timer is dedicated to real-time operating systems, but could also be used as a standard
downcounter. It features:
Так же надо вызывать в цикле lv_task_handler. Рекомендуется дергать его каждые 5 ms для обеспечения хорошего отклика. Я пробовал увеличивать до 20 ms и система все еще оставалась довольно отзывчивой и плавной. Можно оставить как вечный цикл или использовать Thread while(1) {
lv_task_handler(); my_delay_ms(5); } Циклы должны быть в разных местах. Я сделал ошибку и запихнул обе в один цикл. Вот что из этого получилось — Тормоза Когда оба метода были разнесены в разные потоки с правильными интервалами все заработало корректно и быстро: Извините, данный ресурс не поддреживается. :( Библиотека имеет возможность настраивать количество внутренних буферов:
На сайте есть конвертер для шрифтов и картинок. Можно спокойно добавить свой шрифт в проект или свою иконку в меню. Причем опционально можно грузить картинки с внешнего хранилища например CD-CARD или из массива байт расположенного внутренней Flash памяти. How to use the generated file in LittlevGL?SPLFor C arrays
Copy the result C file into your LittlevGL project In a C file of your application declare the image as: LV_IMG_DECLARE(my_image_name); Set the image for an lv_img object: lv_img_set_src(img1, &my_image_name); For external binary files (e.g. SD card) Set up a new driver. To learn more read the Tutorial. Set the image for an lv_img object: lv_img_set_src(img1, «S:/path/to/image»); Еще одна важная и приятная плюшка этой библиотеки, что для ее отладки можно использовать Eclipse IDE в среде Linux и Windows. Приятно что, для OpenSource библиотеки она хорошо документирована. Имеется множество примеров и портов. Библиотека обросла довольно большим комьюнити. Я запускал порт для ESP32. Даже при использовании mapping для выводов SPI т.е. не дефолтных, на которых получается лучшая скорость передачи, все работало без замедлений: ESP32 ST7789 LVGL ESP32 ILI9341 LVGL Материалы по темеSPL=========== Источник: habr.com =========== Похожие новости:
Дизайн ), #_programmirovanie_mikrokontrollerov ( Программирование микроконтроллеров ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 23:38
Часовой пояс: UTC + 5