دمج مكتبة رسومات لوحدات التحكم الدقيقة في مشروع LVGL

LVGL - مكتبة رسومات خفيفة ومتعددة الاستخدامات تُعرف أيضًا باسم LittleVGL.





تدعم المكتبة عددًا كبيرًا من وحدات التحكم الدقيقة مثل STM32 و ESP32 وغيرها. لقد تمكنت حتى الآن من تشغيل برنامج تجريبي كامل على ESP32 و STM32f429 Discovery. المكتبة مفتوحة المصدر ، وتدعم عددًا كبيرًا من العناصر الرسومية ذات السمات الداكنة والفاتحة. موزعة بموجب ترخيص MIT. يمكن استخدامها بحرية حتى في المنتجات التجارية. يمكنك مشاهدة عرض توضيحي تفاعلي عبر الإنترنت دون تثبيت على الجهاز



تدعم المكتبة توصيل نوعين من شاشات العرض



  1. مباشرة عبر واجهة RGB حيث سيكون المخزن المؤقت على جانب MCU في ذاكرة الوصول العشوائي الداخلية أو SDRAM الخارجية
  2. عبر وحدة تحكم عرض خارجية. في هذه الحالة ، يمكن لوحدة التحكم MCU الاتصال بوحدة التحكم في الشاشة عبر ناقل SPI أو I2C. لتحسين الأداء ، يمكن أيضًا استخدام المخازن المؤقتة للعرض الوسيطة داخل MCU في هذه الحالة.


إعدادان نموذجيان للأجهزة
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.





كل شيء مرن للغاية في هذا الصدد. إذا كان لديك برنامج تشغيل ، ولكن المكتبة لا تحتوي حتى الآن على منفذ لبرنامج التشغيل هذا ، فيمكنك بسهولة دمج المكتبة في مشروعك بنفسك.



أسهل طريقة ، ولكن أبطأ طريقة هي إعادة كتابة استدعاء الرسم - 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
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 مللي ثانية لضمان الاستجابة الجيدة. حاولت زيادة 20 مللي ثانية وكان النظام لا يزال مستجيبًا وسلسًا تمامًا. يمكن تركها كحلقة أبدية أو استخدام Thread



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


يجب أن تكون الحلقات في أماكن مختلفة. لقد ارتكبت خطأ وحشأت lv_tick_inc و lv_task_handler في حلقة واحدة. إليك ما تمخض عنه - الفرامل



عندما تم تقسيم كلتا الطريقتين إلى تدفقات مختلفة على فترات زمنية صحيحة ، كان كل شيء يعمل بشكل صحيح وسريع:





المكتبة لديها القدرة على تخصيص عدد المخازن المؤقتة الداخلية:



  1. مخزن مؤقت واحد عندما يرسم LVGL محتويات الشاشة إلى مخزن مؤقت ويرسلها إلى الشاشة
  2. اثنان من مخازن الشاشة الجزئية ، أثناء العرض في مخزن مؤقت واحد ، يتم إرسال محتويات المخزن المؤقت الآخر ليتم عرضها في الخلفية
  3. اثنين من المخازن المؤقتة ملء الشاشة


الموقع يحتوي على محول للالخطوط و الصور . يمكنك إضافة الخط الخاص بك بأمان إلى المشروع أو الرمز الخاص بك في القائمة. علاوة على ذلك ، يمكنك اختياريًا تحميل الصور من وحدة تخزين خارجية ، مثل CD-CARD ، أو من مجموعة البايت الموجودة في ذاكرة فلاش الداخلية.



كيفية استخدام الملف الذي تم إنشاؤه في 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»);



ميزة أخرى مهمة ورائعة لهذه المكتبة هي أنه يمكنك استخدام Eclipse IDE على Linux و Windows لتصحيحها.







من الجيد أنه بالنسبة لمكتبة OpenSource موثقة جيدًا. هناك العديد من الأمثلة والموانئ. نمت المكتبة إلى مجتمع كبير إلى حد ما ، حيث



أطلقت منفذًا لـ ESP32. حتى عند استخدام تعيين دبابيس SPI ، أي ليست تلك الافتراضية ، حيث يتم الحصول على أفضل معدل



للباود ، كل شيء يعمل بدون تباطؤ: ESP32 ST7789 LVGL

ESP32 ILI9341 LVGL



مواد ذات صلة
docs.lvgl.io/latest/en/html/porting/sys.html

Basic systick configuration on the STM32




All Articles