マイクロプロセッサ用のグラフィックライブラリのLVGLプロジェクトへの統合

LVGL - LittleVGLとしても知られる軽量で用途の広いグラフィックライブラリ。





このライブラリは、STM32、ESP32などの多数のマイクロコンピュータをサポートしています。これまでのところ、ESP32およびSTM32f429Discoveryで完全なデモプログラムを実行することができました。ライブラリはオープンソースであり、ダークとライトをテーマにした多数のグラフィック要素をサポートしています。MITライセンスの下で配布されます。市販品でも自由に使用できます。デバイスにインストールせずにインタラクティブなオンラインデモ見ることができます



ライブラリは、2種類のディスプレイの接続をサポートしています



  1. バッファが内部RAMまたは外部SDRAMのMCU側にあるRGBインターフェイスを介して直接
  2. 外部ディスプレイコントローラー経由。この場合、MCUはSPIまたはI2Cバスを介してディスプレイコントローラーと通信できます。この場合、パフォーマンスを向上させるために、MCU内の中間レンダリングバッファを使用することもできます。


2つの典型的なハードウェアセットアップ
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をプロジェクトに統合します1つ目は、ライブラリ、表示、入力システムを初期化することです。




   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ミリ秒ごとにジャークすることをお勧めします。20msに増やしてみましたが、システムはまだ非常に応答性が高く、スムーズでした。永遠のループとして残すか、スレッドを使用することができます



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


ループは別の場所に配置する必要があります。私は間違いを犯し、lv_tick_incとlv_task_handlerを1つのループに詰め込みました。これがその結果です-ブレーキ



両方の方法が正しい間隔で異なるストリームに分割されたとき、すべてが正しくそして迅速に機能しました:





ライブラリには、内部バッファの数をカスタマイズする機能があります。



  1. LVGLが画面の内容をバッファに描画してディスプレイに送信するときの1つのバッファ
  2. 2つの部分画面バッファー、一方のバッファーでのレンダリング中に、もう一方のバッファーの内容が送信され、バックグラウンドで表示されます
  3. 2つのフルスクリーンバッファ


このサイトには、フォント画像のコンバーターがありますフォントをプロジェクトまたはメニューのアイコンに安全に追加できます。さらに、オプションで、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»);



このライブラリのもう1つの重要で優れた機能は、LinuxおよびWindowsでEclipseIDEを使用してデバッグできることです。







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