0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

APM32F411在RT-Thread系統(tǒng)下移植LVGL-8.3

Geehy極海半導體 ? 來源:Geehy極海半導體 ? 2024-12-04 10:48 ? 次閱讀

1. LVGL簡單介紹

關于LVGL的介紹,大家可以去它的官方文檔查看。下面關于LVGL的介紹均是引用自對官方文檔的翻譯。

LVGL,全稱是 Light and Versatile Graphics Library ,是一款免費開源的輕量多功能圖形庫。LVGL 提供創(chuàng)建嵌入式 GUI 所需的一切,該 GUI 具有易于使用的圖形元素、美觀的視覺效果和低內(nèi)存占用。

主要特性:

· 強大的構建塊,如按鈕、圖表、列表、滑塊、圖像等。

· 具有動畫、抗鋸齒、不透明度、平滑滾動的高級圖形

· 各種輸入設備,如觸摸板、鼠標、鍵盤、編碼器

· UTF-8 編碼的多語言支持

· 多顯示器支持,即同時使用多個TFT、單色顯示器

· 具有類似 CSS 樣式的完全可定制的圖形元素

· 獨立于硬件:與任何微控制器或顯示器一起使用

· 可擴展:能夠使用很少的內(nèi)存(64 kB 閃存、16 kB RAM)進行操作

· 支持操作系統(tǒng)、外部存儲器和 GPU,但不是必需的

· 即使具有高級圖形效果,也可進行單幀緩沖區(qū)操作

· 用 C 編寫以實現(xiàn)最大兼容性(C++ 兼容)

· 無需嵌入式硬件即可在 PC 上啟動嵌入式 GUI 設計的模擬

· 綁定到 MicroPython

· 快速 GUI 設計的教程、示例、主題

· 文檔可在線獲取并以 PDF 形式提供

· 根據(jù) MIT 許可免費且開源

運行的設備要求:

基本上,每個能夠驅動顯示器的現(xiàn)代控制器都適合運行 LVGL。最低要求是:

· 16、32 或 64 位微控制器或處理器

· 建議使用 > 16 MHz 時鐘速度

· 閃存/ROM:> 64 kB 用于非常重要的組件(建議> 180 kB)

· 內(nèi)存:

靜態(tài) RAM 使用量:~2 kB,具體取決于所使用的功能和對象類型堆棧:> 2kB(建議> 8 kB)動態(tài)數(shù)據(jù)(堆):> 2 KB(如果使用多個對象,建議> 48 kB)。LV_MEM_SIZE通過在 中設置lv_conf.h。顯示緩沖區(qū):> “水平分辨率”像素(建議> 10 “水平分辨率” )MCU 或外部顯示控制器中的一個幀緩沖區(qū)

· C99 或更新版本的編譯器

2. LVGL學習資源

下面搜集了一些LVGL的學習資源。

1、LVGL官網(wǎng):

https://lvgl.io/

2、LVGL官網(wǎng)文檔教程:

https://docs.lvgl.io/master/

3、百問網(wǎng)對LVGL官方文檔的翻譯:

https://lvgl.100ask.net/master/

4、LVGL Github倉庫:

https://github.com/lvgl/lvgl

5、lvgl基于Visual sudio 的PC模擬器

https://github.com/lvgl/lv_sim_visual_studio

6、百問網(wǎng)基于LVGL的一個項目:

https://forums.100ask.net/t/topic/602

3. 移植前準備

移植的硬件平臺:

MCU:APM32F411

LCD驅動芯片:ST7789V

觸摸IC:CST816T

本次移植是基于 RT-Thread 系統(tǒng)上運行 LVGL 的,所以在移植前,我們需要準備好可以正常運行 RT-Thread 的Demo工程(可以到極海官網(wǎng)下載APM32F411的SDK)。

另外,還需準備好可以正常運行LCD的驅動和觸摸IC的驅動的代碼。

1、準備一份可以運行RT-Thread的Demo工程

209aaf44-b091-11ef-93f3-92fbcf53809c.jpg

2、下載LVGL_8.3源碼

到官方 Github 倉庫,然后選擇 LVGL_8.3 版本。

209f06b6-b091-11ef-93f3-92fbcf53809c.jpg

下載到的LVGL源碼,然后存放到工程目錄下的 middlewares 文件夾。

4. LVGL移植

4.1 移動和修改移植的接口文件

(1)移植接口文件修改

下載了LVGL的源碼之后,我們把移植要使用到的接口文件,修改文件名后,放到工程目錄的另一個文件夾。

20b50ef2-b091-11ef-93f3-92fbcf53809c.jpg

(2)移植配置文件修改

在LVGL源碼的根目錄下有一個 lv_conf_template.h 頭文件,這個文件是 LVGL 庫的配置文件,可以修改該文件來設置庫的基本行為,禁用未使用的模塊和功能,調(diào)整編譯時緩沖區(qū)的大小等。

20bfa92a-b091-11ef-93f3-92fbcf53809c.jpg

上面把LVGL移植接口和配置文件都復制到了工程的下面這個目錄:

20d35a1a-b091-11ef-93f3-92fbcf53809c.jpg

4.2 Keil工程配置

(1)Keil工程添加文件

把LVGL的源碼導入到Keil工程下,其中 LVGL 源碼目錄下的 src 目錄的C文件可以全部導入Keil工程,然后再導入LVGL的移植接口文件。如下圖:

20e517dc-b091-11ef-93f3-92fbcf53809c.jpg

導入完成之后如下:

20f6b564-b091-11ef-93f3-92fbcf53809c.jpg

(2)修改工程頭文件路徑包含

21165d1a-b091-11ef-93f3-92fbcf53809c.jpg

(3)勾選C99模式

LVGL源碼的編譯需要C99模式的支持,不然會出現(xiàn)大量的報錯。

211ef006-b091-11ef-93f3-92fbcf53809c.jpg

4.3 LVGL修改源碼

(1)修改 startup_apm32f411.s 文件的棧大小

官方提供的啟動文件的棧設置的比較小,我們需要改大一些。

2125462c-b091-11ef-93f3-92fbcf53809c.jpg

(2)修改LVGL的配置文件 lvgl_conf.c

212990ce-b091-11ef-93f3-92fbcf53809c.jpg

然后,下面是LVGL各個模塊的配置,可以根據(jù)自己的需要是否打開還是關閉。

該文件還有色彩深度的配置,顯示屏寬高的配置等,需要根據(jù)自己的硬件進行配置,不一一列舉了。

(3)修改LVGL顯示接口文件lv_port_disp.c

該文件就是LVGL的顯示接口文件,需要我們先準備好LCD顯示的描點函數(shù)。該文件主要要修改的點有:

1、打開顯示接口文件宏定義

2143bd32-b091-11ef-93f3-92fbcf53809c.jpg

2、修改lv_port_disp_init函數(shù)

對于lv_port_disp_init函數(shù),官方提供了3種寫緩存的方式及設置顯示分辨。我們可以選擇其中一種方式即可,修改后的函數(shù)如:

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 to your display driver's `flush_cb` to copy its content to your display.

* The buffer has to be greater than 1 display row

*

* There are 3 buffering configurations:

* 1. Create ONE buffer:

* LVGL will draw the display's content here and writes it to your display

*

* 2. Create TWO buffer:

* 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. Double buffering

* Set 2 screens sized buffers and set disp_drv.full_refresh = 1.

* This way LVGL will always provide the whole rendered screen in `flush_cb`

* and you only need to change the frame buffer's address.

*/

/* Example for 1) */

static lv_disp_draw_buf_t draw_buf_dsc_1;

static lv_color_t buf_1[MY_DISP_HOR_RES * DISP_BUFFER_LINES]; /*A buffer for 10 rows*/

lv_disp_draw_buf_init(&draw_buf_dsc_1, buf_1, NULL, MY_DISP_HOR_RES * DISP_BUFFER_LINES); /*Initialize the display buffer*/

// /* Example for 2) */

// static lv_disp_draw_buf_t draw_buf_dsc_2;

// static lv_color_t buf_2_1[MY_DISP_HOR_RES * DISP_BUFFER_LINES]; /*A buffer for 10 rows*/

// static lv_color_t buf_2_2[MY_DISP_HOR_RES * DISP_BUFFER_LINES]; /*An other buffer for 10 rows*/

// lv_disp_draw_buf_init(&draw_buf_dsc_2, buf_2_1, buf_2_2, MY_DISP_HOR_RES * DISP_BUFFER_LINES); /*Initialize the display buffer*/

// /* Example for 3) also set disp_drv.full_refresh = 1 below*/

// static lv_disp_draw_buf_t draw_buf_dsc_3;

// static lv_color_t buf_3_1[MY_DISP_HOR_RES * MY_DISP_VER_RES]; /*A screen sized buffer*/

// static lv_color_t buf_3_2[MY_DISP_HOR_RES * MY_DISP_VER_RES]; /*Another screen sized buffer*/

// lv_disp_draw_buf_init(&draw_buf_dsc_3, buf_3_1, buf_3_2,

// MY_DISP_VER_RES * MY_DISP_VER_RES); /*Initialize the display buffer*/

/*-----------------------------------

* Register the display in LVGL

*----------------------------------*/

static 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 = MY_DISP_HOR_RES;

disp_drv.ver_res = MY_DISP_VER_RES;

/*Used to copy the buffer's content to the display*/

disp_drv.flush_cb = disp_flush;

/*Set a display buffer*/

disp_drv.draw_buf = &draw_buf_dsc_1;

/*Required for Example 3)*/

//disp_drv.full_refresh = 1;

/* Fill a memory array with a color if you have GPU.

* Note that, in lv_conf.h you can enable GPUs that has built-in support in LVGL.

* But if you have a different GPU you can use with this callback.*/

//disp_drv.gpu_fill_cb = gpu_fill;

/*Finally register the driver*/

lv_disp_drv_register(&disp_drv);

}

3、修改disp_flush函數(shù)

該函數(shù)就是調(diào)用底層LCD描點函數(shù)進行繪制UI界面的。

// LCD描點函數(shù)

void LCD_Color_Fill(u16 sx, u16 sy, u16 ex, u16 ey, u16 *color)

{

u16 i, j;

u16 height, width;

width = ex - sx + 1;

height = ey - sy + 1;

LCD_Address_Set(sx,sy+OFFSET_Y,ex,ey+OFFSET_Y);

for (i = 0; i < height; i++)

{

for (j = 0; j < width; j++)

{

LCD_WR_DATA(color[i * width + j]);

}

}

}

static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)

{

// 調(diào)用底層LCD描點函數(shù)

LCD_Color_Fill(area->x1, area->y1, area->x2, area->y2, (uint16_t *)color_p);

/*IMPORTANT!!!

*Inform the graphics library that you are ready with the flushing*/

lv_disp_flush_ready(disp_drv);

}

4.4 添加和修改RT-Thread環(huán)境的LVGL文件支持

我們需要把LVGL運行在RT-Thread系統(tǒng),所以我們需要添加LVGL的RT-Thread接口文件。官方其實已經(jīng)做好了對應的文件,我們復制到工程目錄下修改即可。

(1)添加LVGL的RT-Thread接口文件到Keil工程

215f9386-b091-11ef-93f3-92fbcf53809c.jpg

然后把這兩個文件加入到Keil工程目錄下:

216a6284-b091-11ef-93f3-92fbcf53809c.jpg

(2)修改lv_rt_thread_conf.h頭文件

因為官方已經(jīng)做好了RT-Thread接口文件了,我們只需要簡單修改即可。修改如下:

2171e400-b091-11ef-93f3-92fbcf53809c.jpg

4.5 添加LVGL Demo例程

前面的移植和修改代碼已經(jīng)完成了LVGL的移植工程,下面我們添加一個簡單的 LVGLDemo 例程進行測試。

我們可以在官方的源碼目錄 .demos 目錄下選一個示例程序,或者也可以自己找一個其他的簡單的LVGL示例代碼。我下面選一個日歷demo例程進行演示。

217a5bf8-b091-11ef-93f3-92fbcf53809c.jpg

最后編譯工程源碼和下載到APM32F411中。

217f1d28-b091-11ef-93f3-92fbcf53809c.jpg

編譯會有一些警告,這是LVGL源碼引入的,有些語**有警告,可以暫時忽略。

在APM32F411運行結果如下:

2199b156-b091-11ef-93f3-92fbcf53809c.jpg

5. 給LVGL添加觸摸接口

前面的移植已經(jīng)把顯示接口給完成了,而且上面也可以正常顯示了。但是LVGL的輸入接口還沒移植進來,不過有了前面的移植過程,添加觸摸輸入接口就很簡單了。主要就是修改 lv_port_indev.c 文件。

(1)把 lv_port_indev.c 文件的宏定義改為1

21a529be-b091-11ef-93f3-92fbcf53809c.jpg

(2)修改 touchpad_is_pressed 和 touchpad_get_xy 函數(shù)

/*Return true is the touchpad is pressed*/

static bool touchpad_is_pressed(void)

{

/*Your code comes here*/

uint8_t num = cst816t_get_touch_points_num(); // 是否有觸摸點

if ((num != 0) && (num != 0xFF))

{

return true;

}

else

{

return false;

}

}

/*Get the x and y coordinates if the touchpad is pressed*/

static void touchpad_get_xy(lv_coord_t * x, lv_coord_t * y)

{

/*Your code comes here*/

// uint16_t tp_x = 0, tp_y = 0;

cst816t_read_pos((uint16_t *)x, (uint16_t *)y); // 底層獲取觸摸坐標函數(shù)

// (*x) = tp_x;

// (*y) = tp_y;

}

cst816t_read_pos 函數(shù)是要我們先寫好的獲取觸摸坐標的函數(shù)。另外還有一些沒用到的代碼我給注釋掉了。

增加完上述代碼就可以發(fā)現(xiàn)在屏幕可以點擊進行修改日期了,說明觸摸接口移植完成。

最后,APM32F411在RT-Thread系統(tǒng)下移植LVGL工程就全部完成了。整個過程還是比較簡單的,而且網(wǎng)上也有很多相關的教程。不過移植過程中還是碰到不是小問題的,有些細節(jié)并沒有在文章中一一寫出來,在移植過程中遇到一些問題就需要我們根據(jù)報錯提示對應解決就好。另外,在移植前最重要的就是要保證LCD驅動和觸摸驅動代碼正確,然后再進行移植,這樣出現(xiàn)問題我們比較好分析和定位問題。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 微控制器
    +關注

    關注

    48

    文章

    7574

    瀏覽量

    151707
  • 嵌入式
    +關注

    關注

    5087

    文章

    19150

    瀏覽量

    306356
  • 移植
    +關注

    關注

    1

    文章

    379

    瀏覽量

    28153
  • GUI
    GUI
    +關注

    關注

    3

    文章

    662

    瀏覽量

    39783
  • RT-Thread
    +關注

    關注

    31

    文章

    1299

    瀏覽量

    40258

原文標題:APM32芯得 EP.47 | APM32F411在RT-Thread系統(tǒng)下移植LVGL-8.3

文章出處:【微信號:geehysemi,微信公眾號:Geehy極海半導體】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    RT-Thread NUC97x 移植 LVGL

    不涉及 rt-thread 驅動,但是它是 LVGLrt-thread 的接口。LVGL rt
    發(fā)表于 07-08 09:37 ?1500次閱讀

    RT-Thread最小系統(tǒng)移植方法

    目標為進一步研究RT-Thread,掌握系統(tǒng)移植的基本方法
    發(fā)表于 06-02 09:47 ?525次閱讀
    <b class='flag-5'>RT-Thread</b>最小<b class='flag-5'>系統(tǒng)</b>的<b class='flag-5'>移植</b>方法

    RT-thread源碼移植到STM32F10x和STM32F4xx

    RT-thread源碼移植到STM32F10x和STM32F4xx: 一、源碼下載 點擊入門->下載 ? 歷史版本里邊隨便選取一個 ? 會
    的頭像 發(fā)表于 11-15 09:38 ?2649次閱讀
    <b class='flag-5'>RT-thread</b>源碼<b class='flag-5'>移植</b>到STM32<b class='flag-5'>F</b>10x和STM32<b class='flag-5'>F</b>4xx

    ART Pi Smart基于RT-Thread Smart系統(tǒng)LVGL移植簡介

    1、基于RT-Thread Smart系統(tǒng)LVGL移植我申請測試申請的高級功能的,由于是有限的(本來要求測試一個月,但是板子只有不到一個月)。的,特別是
    發(fā)表于 08-03 16:35

    移植RT-Thread的原理與方法

    ,rtt論壇搜索“國產(chǎn)MCU移植”即可閱讀。本文不介紹具體移植步驟,而是如往常一樣,分享移植的原理與方法。 移植原理
    的頭像 發(fā)表于 09-17 09:41 ?7854次閱讀

    【國產(chǎn)MCU移植】HC32F460基于Keil MDK 移植 RT-Thread Nano

    【國產(chǎn)MCU移植】HC32F460基于Keil MDK 移植 RT-Thread Nano
    發(fā)表于 11-18 18:51 ?65次下載
    【國產(chǎn)MCU<b class='flag-5'>移植</b>】HC32<b class='flag-5'>F</b>460基于Keil MDK <b class='flag-5'>移植</b> <b class='flag-5'>RT-Thread</b> Nano

    【國產(chǎn)MCU系列】 HK32F030 上移植 RT-Thread Nano

    如需下載相關開源資料請點擊閱讀原文這是一個航順 HK32F030 的 RT-Thread Nano 移植示例,記錄了 Keil 裸機工程的基礎上進行
    發(fā)表于 11-21 18:51 ?42次下載
    【國產(chǎn)MCU系列】<b class='flag-5'>在</b> HK32<b class='flag-5'>F</b>030 上<b class='flag-5'>移植</b> <b class='flag-5'>RT-Thread</b> Nano

    【國產(chǎn)MCU移植移植RT-Thread到國產(chǎn)芯片HC32F460PETB

    【國產(chǎn)MCU移植移植RT-Thread到國產(chǎn)芯片HC32F460PETB
    發(fā)表于 11-23 18:06 ?37次下載
    【國產(chǎn)MCU<b class='flag-5'>移植</b>】<b class='flag-5'>移植</b><b class='flag-5'>RT-Thread</b>到國產(chǎn)芯片HC32<b class='flag-5'>F</b>460PETB

    RT-Thread系統(tǒng)移植到STM32f103

    RT-Thread系統(tǒng)移植到STM32f103
    發(fā)表于 12-09 12:51 ?26次下載
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>系統(tǒng)</b><b class='flag-5'>移植</b>到STM32<b class='flag-5'>f</b>103

    【國產(chǎn)MCU系列】 HK32F030 上移植 RT-Thread Nano

    這是一個航順 HK32F030 的 RT-Thread Nano 移植示例,記錄了 Keil 裸機工程的基礎上進行 RT-Thread N
    發(fā)表于 01-25 17:42 ?4次下載
    【國產(chǎn)MCU系列】<b class='flag-5'>在</b> HK32<b class='flag-5'>F</b>030 上<b class='flag-5'>移植</b> <b class='flag-5'>RT-Thread</b> Nano

    基于 Keil MDK 移植 RT-Thread Nano

    本文介紹如何基于 Keil MDK 移植 RT-Thread Nano ,并以一個 stm32f103 的基礎工程作為示例進行講解。 RT-Thread Nano 已集成
    發(fā)表于 01-26 17:04 ?16次下載
    基于 Keil MDK <b class='flag-5'>移植</b> <b class='flag-5'>RT-Thread</b> Nano

    RT-Thread已經(jīng)全面支持極海APM32F1系列MCU

    近日,RT-Thread 和其高級會員合作伙伴極海半導體宣布:正式完成APM32F4系列MCU的RT-Thread 物聯(lián)網(wǎng)操作系統(tǒng)適配及RT-Thr
    發(fā)表于 08-30 09:45 ?1203次閱讀

    APM32F030RCT6_軟件問題_RT-Thread注冊設備時,進入硬件報錯

    APM32F030RCT6_軟件問題_RT-Thread注冊設備時,進入硬件報錯
    發(fā)表于 11-09 21:03 ?0次下載
    <b class='flag-5'>APM32F</b>030RCT6_軟件問題_<b class='flag-5'>RT-Thread</b><b class='flag-5'>在</b>注冊設備時,進入硬件報錯

    RT-Thread文檔_內(nèi)核移植

    RT-Thread文檔_內(nèi)核移植
    發(fā)表于 02-22 18:31 ?3次下載
    <b class='flag-5'>RT-Thread</b>文檔_內(nèi)核<b class='flag-5'>移植</b>

    RT-Thread文檔_RT-Thread SMP 介紹與移植

    RT-Thread文檔_RT-Thread SMP 介紹與移植
    發(fā)表于 02-22 18:31 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與<b class='flag-5'>移植</b>