lvgl最新版本在STM32上的移植使用

2021-02-25 嵌入式實驗基地
前言

另:本公眾號由於開通得比較晚,所以不具備留言功能。所以大家想看哪些內容,可以在公眾號聊天界面留言,小編會參考大家的意見輸出、整理一些相關的內容。一起成長、一起進步。期待留言~

下面我們一起來看一看LVGL在STM32上的移植使用。

lvgl簡介

LittlevGL是一個免費的開源圖形庫,提供了創建嵌入式GUI所需的一切,具有易於使用的圖形元素、漂亮的視覺效果和低內存佔用。

特點:

可裁剪 用於小內存(80 KB FLASH,12 KB RAM)操作模擬器 無需嵌入式硬體就可以在電腦上開始GUI設計

運行的硬體要求:

lvgl資料

LVGL的資料很豐富,下面列出一些常用的資料連結:

1、lvgl英文官網:

https://lvgl.io/

2、lvgl中文網:

https://littlevgl.cn/    (還在建設中)

3、lvgl源碼:

https://github.com/lvgl/lvgl

4、lvgl基於Visual sudio 的PC模擬器:

https://github.com/lvgl/lv_sim_visual_studio

5、正點原子lvgl教程資料:

http://www.openedv.com/docs/book-videos/zdyzshipin/4free/littleVGL.html

6、基於荔枝派Nano開發板的lvgl教程:

http://nano.lichee.pro/application/littlevgl.html

7、基於野牛開發板的 lvgl 6.0 例程:

https://gitee.com/mzy2364/LittlevGL_Demo

8、lvgl在線體驗例程(可在瀏覽器體驗):

https://lvgl.io/demos

9、lvgl官網教程:

https://docs.lvgl.io/latest/en/html/index.html

10、lvgl官方DEMO:

https://github.com/lvgl/lv_examples

lvgl移植到STM32

1、下載源碼

源碼連結中下載一份源碼,lvgl已經更新迭代了很多個版本,這裡我們選擇目前最新的7.10.1版本來移植:

注意:不同版本之間可能有很大的不同,所以看本篇教程移植的的小夥伴儘量使用與本文相同的版本。

下載得到:

2、準備stm32工程

下面我基於普中的stm32f103開發板來移植,首先準備一個lcd顯示的例程,並更名為lvgl_test:

3、新建GUI文件夾

在工程目錄下新建一個GUI文件夾,GUI文件夾下新建兩個子文件夾:

把剛才下載的lvgl-7.10.1裡的所有內容複製到lvgl文件夾中,lvgl_app文件夾暫時留空。

4、移植文件更名

下面,我們把GUI\lvgl\examples\porting下的文件進行一個更名操作(其實不更名也可以,為了文件名看起來規範一些我們進行一個更名):

這是移植相關的幾個文件,其中:

lv_port_disp:顯示相關。

lv_port_indev:輸入相關。

lv_port_fs:文件系統相關。

5、配置文件更名

把GUI\lvgl\下的lv_conf_template.h文件複製到GUI文件夾下並更名為lv_conf.h:

6、keil工程配置

(1)導入文件

打開keil工程,在工程下新建三個組,並導入文件:

導入完成後得到:

這裡的lvgl_porting中我們暫時只導入lv_port_disp.c文件,這是顯示相關的移植文件。本篇筆記先把顯示打通,其它兩個文件後續有機會再弄。

(2)包含頭文件路徑

下面包含頭文件路徑:

(3)修改堆棧大小

因為官方說明文檔中推薦我們堆、棧大小設置為8k:

所以這裡我們就按推薦進行設置:

(4)設置C99模式

lvgl需要編譯器支持C99或更新的標準:

C99模式可進行如下設置:

(5)使能lv_conf.h的條件編譯

進行上面的設置後我們首先進行編譯,會報很多個錯誤:

這是因為需要lv_conf.h裡的一些東西,打開lv_conf.h裡的條件編譯即可:

再次編譯,編譯通過:

(6)lvgl配置

我們可以對lvgl進行一些定製配置,這些配置內容在lv_conf.h文件中,下面進行一些關鍵配置:

顯示器寬度:#define LV_HOR_RES_MAX (240)顯示器高度:#define LV_VER_RES_MAX (480)色彩深度: #define LV_COLOR_DEPTH 16提供給lvgl的空間: #define LV_MEM_SIZE  (32U * 1024U)

其中調整LV_DPI  可以調整各控制項間的緊湊,可根據實際情況進行更改;LV_MEM_SIZE  為lvgl可用空間,資源允許的情況下可以稍微設大些,這個設置過小的話,在跑一些稍微複雜的demo時界面就會刷不出來。

這裡只是列出了幾個常用的配置,lv_conf.h還有很多的配置,可根據實際情況進行配置。

(7)填充、修改lv_port_disp.c

lv_port_disp.c裡面的內容主要有:

我們需要重點關注lv_port_disp_init顯示接口初始化函數與disp_flush屏幕刷新兩個函數。

其中,lv_port_disp_init函數裡主要要選擇一種寫緩存的方式及設置顯示分辨。我們選擇第一種寫緩存的方式,修改後的函數如:

void lv_port_disp_init(void)
{
    /*
     * Initialize your display
     * ---*/
    disp_init();

    /*----
     * Create a buffer for drawing
     *---*/

    /* LVGL requires a buffer where it internally draws the widgets.
     * Later this buffer will passed your display drivers `flush_cb` to copy its content to your display.
     * The buffer has to be greater than 1 display row
     *
     * There are three buffering configurations:
     * 1. Create ONE buffer with some rows:
     *      LVGL will draw the display's content here and writes it to your display
     *
     * 2. Create TWO buffer with some rows:
     *      LVGL will draw the display's content to a buffer and writes it your display.
     *      You should use DMA to write the buffer's content to the display.
     *      It will enable LVGL to draw the next part of the screen to the other buffer while
     *      the data is being sent form the first buffer. It makes rendering and flushing parallel.
     *
     * 3. Create TWO screen-sized buffer:
     *      Similar to 2) but the buffer have to be screen sized. When LVGL is ready it will give the
     *      whole frame to display. This way you only need to change the frame buffer's address instead of
     *      copying the pixels.
     * */

    /* Example for 1) */
    static lv_disp_buf_t draw_buf_dsc_1;
    static lv_color_t draw_buf_1[LV_HOR_RES_MAX * 10];                          /*A buffer for 10 rows*/
    lv_disp_buf_init(&draw_buf_dsc_1, draw_buf_1, NULL, LV_HOR_RES_MAX * 10);   /*Initialize the display buffer*/

    // /* Example for 2) */
    // static lv_disp_buf_t draw_buf_dsc_2;
    // static lv_color_t draw_buf_2_1[LV_HOR_RES_MAX * 10];                        /*A buffer for 10 rows*/
    // static lv_color_t draw_buf_2_1[LV_HOR_RES_MAX * 10];                        /*An other buffer for 10 rows*/
    // lv_disp_buf_init(&draw_buf_dsc_2, draw_buf_2_1, draw_buf_2_1, LV_HOR_RES_MAX * 10);   /*Initialize the display buffer*/

    // /* Example for 3) */
    // static lv_disp_buf_t draw_buf_dsc_3;
    // static lv_color_t draw_buf_3_1[LV_HOR_RES_MAX * LV_VER_RES_MAX];            /*A screen sized buffer*/
    // static lv_color_t draw_buf_3_1[LV_HOR_RES_MAX * LV_VER_RES_MAX];            /*An other screen sized buffer*/
    // lv_disp_buf_init(&draw_buf_dsc_3, draw_buf_3_1, draw_buf_3_2, LV_HOR_RES_MAX * LV_VER_RES_MAX);   /*Initialize the display buffer*/

    /*
     * Register the display in LVGL
     *----*/

    lv_disp_drv_t disp_drv;                         /*Descriptor of a display driver*/
    lv_disp_drv_init(&disp_drv);                    /*Basic initialization*/

    /*Set up the functions to access to your display*/

    /*Set the resolution of the display*/
    disp_drv.hor_res = 240;
    disp_drv.ver_res = 400;

    /*Used to copy the buffer's content to the display*/
    disp_drv.flush_cb = disp_flush;

    /*Set a display buffer*/
    disp_drv.buffer = &draw_buf_dsc_1;

#if LV_USE_GPU
    /*Optionally add functions to access the GPU. (Only in buffered mode, LV_VDB_SIZE != 0)*/

    /*Blend two color array using opacity*/
    disp_drv.gpu_blend_cb = gpu_blend;

    /*Fill a memory array with a color*/
    disp_drv.gpu_fill_cb = gpu_fill;
#endif

    /*Finally register the driver*/
    lv_disp_drv_register(&disp_drv);
}

disp_flush需要調用底層lcd操作接口,這裡修改為:

這裡我們調用一個寫像素點的函數,也可以直接調用一個顯示的填充方形函數。

最後,需要再頭文件中聲明lv_port_disp_init函數:

(8)配置一個定時器為lvgl提供心跳

lvgl需要一個心跳節拍,可以使用系統滴答定時器,也可以使用其它定時器。我們這裡的配置如下:

TIM4_Init(999, 71);     // 1ms進入一次中斷,為lvgl提供心跳

void TIM4_IRQHandler(void)
{
 if(TIM_GetITStatus(TIM4,TIM_IT_Update))
 {
  lv_tick_inc(1);
 }
 TIM_ClearITPendingBit(TIM4,TIM_IT_Update); 
}

(9)測試官方demo

下面開始進行測試,至此我們的GUI\lvgl_app文件夾裡還沒有任何內容,我們下載官方提供的demo來進行測試,同樣地,下載官方demo:

官方給我們提供了很多demo:

複製lv_examples-7.10.1整個文件夾至GUI\lvgl_app文件夾下並更名為lv_examples:

把GUI\lvgl_app\lv_examples下的lv_ex_conf_template.h複製到GUI文件夾下並更名為lv_ex_conf.h,這是demo的配置文件:

想跑哪個demo就配置相關宏。

下面我們跑一個lv_demo_widgets的demo進行演示:

主函數:

運行測試:

至此,lvgl顯示移植成功。要想演示其它綜合demo或控制項例子也同上面一樣導入源文件、包含頭文件、打開demo宏開關等步驟進行演示。

     本次要分享的內容就要結束啦,希望對正在學習LVGL的童鞋有幫助,更多精彩內容,歡迎各位加群一起交流。

         公眾號點擊加群獲取群二維碼,點擊獲取資料,獲取所有實驗源碼!

相關焦點

  • ESP32在Arduino環境下玩轉 LVGL,ESP32移植LVGL詳細教程
    演示效果對於「ESP32」上使用「LVGL」,我在三種設備上進行了測試,屏幕驅動型號分別為:「1.14寸ST7789V」、「3.5寸ILI9488」、「3.5寸ST7796S」,為了方便對比看完這些演示,你應該明白我為什麼使用LVGL了吧,同樣的GUI源碼可以很方便的在各種移植了LVGL的硬體上使用,達到同樣的演示效果,這是我最喜歡的part了3.
  • ESP32平臺開發LVGL圖形界面
    LVGL的官方文檔簡單地描述了如何在ESP32上面移植LVGL,並且已經提供移植好的示例工程,開發者只需要作簡單的導入即可。LVGL關於ESP32的官方介紹頁面如下圖。github上的工程導入到gitee上,再通過gitee來進行下載,如下圖所示。
  • STM32 上使用 PWM
    並給出了在正點原子 STM32L475 pandora 開發板上驗證的代碼示例。硬體平臺簡介本文基於正點原子 STM32L475 pandora 開發板,給出了 PWM 的具體應用示例代碼,由於 RT-Thread 上層應用 API 的通用性,因此這些代碼不局限於具體的硬體平臺,用戶可以輕鬆將它移植到其它平臺上。
  • mbedtls | 移植mbedtls庫到STM32裸機的兩種方法
    mbedtls遵循 Apache 2.0 開源許可協議,目前由 TrustedFirmware 維護(Linaro主持的一個治理開放社區項目),在Github上已收穫 2.6k star,目前Github上發布的最新版本為 2.24.0 版本,開源倉庫地址為:「https://github.com/ARMmbed/mbedtls
  • 在 STM32 上使用 C++ 指南
    本文描述了如何使用在搭載了 RT-Thread 系統的 STM32 平臺上使用 C++,包括 C++ 的配置和應用等。
  • MicroPython 1.17 版本發布
    此版本旨在遵循每 2 個月(左右)發布一次的時間表,之前的 v1.16 於 2021 年 6 月 18 日發布。v1.17:F-strings、新 machine.I2S 類、ESP32-C3 支持和 LEGO_HUB_NO6 板此版本的 MicroPython 添加了對 f-strings (PEP-498) 的支持,與標準通 Python 相比有一些限制。F 字符串本質上是 "".format() 的語法糖,使格式化字符串更加方便。
  • LVGL『Color picker顏色選擇器控制項』介紹
    ., 分享這篇文章聲明:該專欄內容僅供個人學習使用,禁止商業用途,如需轉載,請聯繫我授權顧名思義,拾色器允許選擇顏色。可以依次選擇顏色的色相,飽和度和值。小部件具有兩種形式:圓形(圓盤)和矩形。在這兩種形式中,長按對象,顏色選擇器將更改為顏色的下一個參數(色相,飽和度或值)。此外,雙擊將重置當前參數。
  • 從原理圖PCB到移植RTOS【細說STM32】【一】
    今天是第一章節,我們介紹一下如何移植標準的官網代碼(裸機,無OS)到iBox開發板上,控制LED閃爍。如此簡單的試驗,還是希望給你不一樣的體驗。【一、安裝編譯工具Keil】1、為什麼選擇keil在這個操作之前,原本應該解釋為什麼選擇「Cortex-M」,為什麼選擇「M3」、為什麼選擇「ST」。這樣容易扯遠了。
  • STM32與Arduino問答集
    最新資訊在哪可找到?答:支持!www.stm32duino.com       此論壇網專門針對STM32系列晶片板,即時更新相關ArduinoIDE 環境API。 問:我如何開始著手?答:1.v=TePglhSkghg           stm32duino 支持包:https://github.com/rogerclarkmelbourne/Arduino_STM32         2.如何上傳代碼到你的板上:                   a.通過串口適配器(TTL電平:3.3V):http://stm32duino.com
  • STM32MP157A-DK1開發板評測
    在提供好的Linux鏡像上做開發, 把這個開發板子當做一個Mini工控電腦.2.      利用OpenSTLinux提供的SDK, 開發自己的應用程式.3.      利用開源的OpenSTLinux原始碼, 定製自己的內核和鏡像.4.      不要Linux,從Baremetal出發, 移植/運行其他OS,或者乾脆不用OS.
  • 分享 | STM32MP157A-DK1開發板評測
    還是按照俗套先來看看板子(點擊圖片可放大查看)這個系列板子有兩個版本: STM32MP157A-DK1和STM32MP157C-DK2, 本文主角是前者. 兩者差別:1. DK1與DK2的主控晶片不同。
  • 五分鐘淺析STM32的五大嵌入式作業系統
    每個組件可提供大量的配置選項(實時內核也可作為可選配置),使用eCos提供的配置工具可以很方便地配置,並通過不同的配置使得eCos能夠滿足不同的嵌入式應用要求。eCos作業系統的可配置性非常強大,用戶可以自己加入所需的文件系統。eCos作業系統同樣支持當前流行的大部分嵌入式CPU,eCos作業系統可以在16位、32位和64位等不同體系結構之間移植。
  • STM32晶片全面支持LabVIEW嵌入設計
    也因要對不同晶片不同編譯器進行定製化移植,才可進行嵌入應用設計,因艱澀難奧,導致問者廖廖。後來簡化了,只推出針對32位ARM晶片的軟體模塊,並且針對TI和NXP的幾顆CPU晶片做了移植,將編譯器綁定到KEIL上。如LM3S8962等晶片。
  • 安排,LVGL『keyboard鍵盤控制項』介紹
    ., 分享這篇文章聲明:該專欄內容僅供個人學習使用,禁止商業用途,如需轉載,請聯繫我授權Keyboard 對象是一個特殊的 Button 矩陣,具有預定義的按鍵映射和其他功能,以實現虛擬鍵盤來編寫文本。
  • 分享一個老外封裝的STM32最全常用驅動庫,相見恨晚有木有!
    應有盡有,超級強大,超級好用,麻麻再也不用擔心我不會移植驅動了。原作基於STM32F4探索者和F7開發,可以十分方便的移植到其他STM32內核平臺,包含了2個版本,一個是標準庫函數,另一個是HAL庫版本。       不廢話,截圖感受下:
  • 移植mbedtls庫到MCU裸機的兩種方法
    mbedtls遵循 Apache 2.0 開源許可協議,目前由 TrustedFirmware 維護(Linaro主持的一個治理開放社區項目),在Github上已收穫 2.6k star,目前Github上發布的最新版本為 2.24.0 版本,開源倉庫地址為:「https://github.com/ARMmbed/mbedtls
  • STM32下載編程工具 | STVP介紹、下載、安裝和使用教程
    下面針對STVP進行詳細介紹、下載、安裝和使用描述:STVP:ST Visual Programmer,即ST的一套可視化下載編程工具。STVP提供了一個面向ST單片機的Flash全功能燒寫環境,可方便的用於讀取、寫入和校驗晶片內部存儲器與選項字節。
  • STM32MP157C-DK2公板快速上手
    OpenSTLinux Distribution (STM32MP1Distrib), one or more firmware example(s) for the STM32CubeMP1 package and the tool (STM32CubeProg) to install this image on the STM32MP15xx-EV1 Evaluation boards.
  • 原理分析--STM32_FLASH模擬實現EEPROM功能
    原理分析--STM32_FLASH模擬實現EEPROM功能一、二糖有話說上一篇只寫了如何移植及使用因為如果你能理解其原理,你就可以將其移植到其他平臺,不只限於ST的晶片,所以要體會它的思路及方法。stm32的FLASH擦除是按整頁或者整扇區擦除的,不同晶片的頁或者扇區(下邊統稱為頁)的大小是不一樣的,有1K,16K,64K,128K等大小。
  • 適合STM32的三大嵌入式作業系統
    基於STM平臺且滿足實時控制要求作業系統,有以下5種可供移植選擇。分別為μClinux、μC/OS-II、eCos、FreeRTOS和都江堰作業系統(djyos)。下面分別介紹這五種嵌入式作業系統的特點及不足。μClinux是一種優秀的嵌入式Linux版本,其全稱為micro-control Linux,從字面意思看是指微控制Linux。