Integrasi ke dalam proyek LVGL dari pustaka grafis untuk mikrokontroler

LVGL - Perpustakaan Grafik Ringan dan Serbaguna juga dikenal sebagai LittleVGL.





Perpustakaan mendukung sejumlah besar mikrokontroler seperti STM32, ESP32, dan lainnya. Sejauh ini saya telah berhasil menjalankan program demo penuh di ESP32 dan STM32f429 Discovery. Pustaka bersifat open source, mendukung sejumlah besar elemen grafik dengan tema Gelap dan Terang. Didistribusikan di bawah lisensi MIT. Dapat digunakan secara bebas bahkan dalam produk komersial. Anda dapat menonton Demo Online interaktif tanpa menginstal di perangkat



Pustaka mendukung menghubungkan dua tipe tampilan



  1. Langsung melalui antarmuka RGB dimana buffer akan berada di sisi MCU di RAM internal atau SDRAM eksternal
  2. Melalui pengontrol tampilan eksternal. Dalam hal ini, MCU dapat berkomunikasi dengan pengontrol tampilan melalui bus SPI atau I2C. Untuk meningkatkan kinerja, buffer render menengah di dalam MCU juga dapat digunakan dalam kasus ini.


Dua pengaturan perangkat keras yang khas
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.





Semuanya sangat fleksibel dalam hal ini. Jika Anda memiliki driver, tetapi perpustakaan belum memiliki port untuk driver ini, maka Anda dapat dengan mudah mengintegrasikan perpustakaan ke dalam proyek Anda sendiri.



Cara termudah, tetapi juga yang paling lambat adalah dengan menulis ulang gambar 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 - Ini adalah rendering piksel driver Anda. Karena fakta bahwa rendering piksel demi piksel, ini lambat. Dokumentasi perpustakaan menjelaskan cara integrasi lain yang lebih efisien.



Mengintegrasikan LVGL ke dalam proyek. Yang pertama adalah menginisialisasi perpustakaan, tampilan dan sistem input.




   lv_init();
   tft_init();
   touchpad_init();

   lv_demo_widgets();  //     


Karena perpustakaan memiliki pengelola tugas di dalam dirinya sendiri. Ya, ini adalah sistem multi-utas, perbaiki saya jika tidak demikian, maka kita perlu meningkatkan penghitung internal dispatcher dengan memanggil 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*/
    }
}


Selain itu, Anda perlu mentransfer ke fungsi milidetik yang telah berlalu sejak saat panggilan terakhirnya, atau dengan kata lain, waktu sejak momen iterasi sebelumnya.



Agar tidak membuang sumber daya pada utas tambahan, Anda dapat memanggil fungsi ini pada penghitung waktu. STM32 memiliki timer SysTick untuk tujuan berikut:




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
 }


Timer SysTick
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.




Anda juga perlu memanggil lv_task_handler di loop. Disarankan untuk menyentaknya setiap 5 md untuk memastikan respons yang baik. Saya mencoba meningkatkan ke 20ms dan sistemnya masih cukup responsif dan mulus. Bisa dibiarkan sebagai loop abadi atau menggunakan Thread



while(1) {
  lv_task_handler();
  my_delay_ms(5);
}


Loop harus berada di tempat yang berbeda. Saya membuat kesalahan dan memasukkan lv_tick_inc dan lv_task_handler ke dalam satu loop. Inilah yang terjadi - Rem



Ketika kedua metode dibagi menjadi aliran yang berbeda pada interval yang benar, semuanya bekerja dengan benar dan cepat:





Pustaka memiliki kemampuan untuk menyesuaikan jumlah buffer internal:



  1. Satu buffer ketika LVGL menggambar konten layar ke buffer dan mengirimkannya ke tampilan
  2. Dua buffer layar parsial, saat merender dalam satu buffer, konten buffer lainnya dikirim untuk ditampilkan di latar belakang
  3. Dua buffer layar penuh


Situs ini memiliki konverter untuk font dan gambar . Anda dapat dengan aman menambahkan font Anda ke proyek atau ikon Anda di menu. Selain itu, Anda juga dapat memuat gambar dari penyimpanan eksternal, seperti CD-CARD, atau dari array byte yang terletak di memori Flash internal.



Bagaimana cara menggunakan file yang dihasilkan di LittlevGL?
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»);



Fitur penting dan bagus lainnya dari pustaka ini adalah Anda dapat menggunakan Eclipse IDE di Linux dan Windows untuk men-debugnya.







Sangat menyenangkan bahwa itu didokumentasikan dengan baik untuk pustaka OpenSource. Ada banyak contoh dan port. Perpustakaan telah berkembang menjadi komunitas yang cukup besar .



Saya meluncurkan port untuk ESP32. Bahkan saat menggunakan pemetaan untuk pin SPI yaitu bukan yang default, di mana baud rate terbaik diperoleh, semuanya bekerja tanpa perlambatan:



ESP32 ST7789 LVGL

ESP32 ILI9341 LVGL



Materi terkait
docs.lvgl.io/latest/en/html/porting/sys.html

Basic systick configuration on the STM32




All Articles