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

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

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

littleVGL開源圖形庫的主要特性與移植過程

嵌入式單片機(jī) ? 來源:嵌入式單片機(jī) ? 作者:梁工17737718720 ? 2022-07-10 16:29 ? 次閱讀

1.littleVGL介紹

LVGL(Light and Versatile Graphics Library)是一個免費(fèi)的開源圖形庫,提供創(chuàng)建具有易于使用的圖形元素、漂亮的視覺效果和低內(nèi)存占用的嵌入式 GUI 所需的一切。

1.1 littleVGL 的主要特性如下:

? 具有非常豐富的內(nèi)置控件, buttons, charts, lists, sliders, images

? 高級圖形效果:動畫,反鋸齒,透明度,平滑滾動

? 支持多種輸入設(shè)備, touchpad, mouse, keyboard, encoder

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

? 支持多個和多種顯示設(shè)備,例如同步顯示在多個彩色屏或單色屏上

? 完全自定制的圖形元素

? 硬件獨(dú)立于任何微控制器或顯示器

? 可以縮小到最小內(nèi)存 (64 kB Flash, 16 kB RAM)

? 支持操作系統(tǒng)、外部儲存和 GPU(非必須)

? 僅僅單個幀緩沖設(shè)備就可以呈現(xiàn)高級視覺特效

? 使用 C 編寫以獲得最大兼容性(兼容 C++)

? 支持 PC 模擬

? 為加速 GUI 設(shè)計(jì),提供教程,案例和主題,支持響應(yīng)式布局

? 提供了在線和離線文檔

? 基于自由和開源的 MIT 協(xié)議

1.2 LVGL移植過程

獲取LVGL官方驅(qū)動,例程。

https://gitcode.net/mirrors/lvgl/lvgl/-/tree/v6.0

LVGL版本眾多,更新很快,初學(xué)者建議使用老版本,資料多,便于學(xué)習(xí)。

現(xiàn)在我們獲取6.0版本。

f486c4ec-f774-11ec-ba43-dac502259ad0.png

https://gitcode.net/mirrors/lvgl/lv_examples

獲取LVGL官方例程。

f4964a84-f774-11ec-ba43-dac502259ad0.png

開始移植,先準(zhǔn)備好一個STM32工程,新建LVGLLVGL_APP文件夾

LVGL :存放官方驅(qū)動和例程等庫文件

LVGL_APP :存放自己的程序

下載的官方驅(qū)動文件和例程解壓并存放在LVGL文件夾中,接著把 LVGL/lvgl-v6.0/lv_conf_template.h LVGL/lv_examples-v6.0/lv_ex_conf_templ.h

倆個配置模板文件統(tǒng)統(tǒng)拷貝到 LVGL目錄下,然后對這個 2 文件分別重命名為

lv_conf.h lv_ex_conf.h。接著還要在LVGL目錄下新建一個 lvgl_driver子目錄,這個目錄是用來放底層驅(qū)動文件的。

f4a3e40a-f774-11ec-ba43-dac502259ad0.png

找到LVGL/lvglv-6.0/porting里面的

lv_port_disp_template.c,lv_port_disp_template.h,

然后將兩個個文件拷貝到 LVGLlvgl_driver 目錄下面,并分別重命名為

lv_port_disp.c, lv_port_disp.h,

f4b293a6-f774-11ec-ba43-dac502259ad0.png

接著我們打開 Keil 工程,點(diǎn)擊圖標(biāo),打開分組管理面板, Groups 欄下新建 LVGLLVGL_APP 、LVGL_driver,選中 LVGL分組,接著點(diǎn)擊 Add Files 把,LVGLlvgl-v6.0src

文件下的所有c文件全部添加。

f4d04c34-f774-11ec-ba43-dac502259ad0.png

新建LVGL_driver,將底層驅(qū)動文件添加進(jìn)去。

f4f92b4a-f774-11ec-ba43-dac502259ad0.png

點(diǎn)擊圖標(biāo),選擇c/c++選項(xiàng),將頭文件目錄添加,如下圖所示:

打開lv_conf.h文件。

10行:0修改為1,使整個配置文件生效。

#if 1

23、24行:LV_HOR_RES_MAX LV_HOR_RES_MAX,這個是告訴LVGL顯示屏分辨率多大,請根據(jù)自己的屏幕大小將分辨率寫入其中

LV_HOR_RES_MAX240

LV_HOR_RES_MAX320

32行:LV_COLOR_DEPTH 顏色深度,屏幕采用RGB565,選擇16。

#define LV_COLOR_DEPTH 16

56行:LV_DPI 的值,默認(rèn)值為 100,我們把他設(shè)置到 60,這個宏是用來調(diào)節(jié)界面縮 放比例的,此值越大,控件分布的就越散,控件自身的間隔也會變大

#define LV_DPI 60

72行:LV_MEM_SIZE 的大小,這個就是控制 littleVGL中所謂的動態(tài)數(shù)據(jù)堆的大小,是用來給控件的創(chuàng)建動態(tài)分配空間的,我們這里設(shè)置為 20KB 的大小

#define LV_MEM_SIZE(20U * 1024U)

145行:LV_USE_GPU ,我們把它設(shè)置為 0,即不使能 GPU 功能

#define LV_USE_GPU 0

148行:LV_USE_FILESYSTEM ,設(shè)置為0,即不使能文件系統(tǒng) 的功能

#define LV_USE_FILESYSTEM 0

234行:

LV_THEME_LIVE_UPDATE,

LV_USE_THEME_TEMPL,

LV_USE_THEME_DEFAULT,

LV_USE_THEME_ALIEN,

LV_USE_THEME_NIGHT,

LV_USE_THEME_MONO,

LV_USE_THEME_MATERIAL,

LV_USE_THEME_ZEN,

LV_USE_THEME_NEMO

這些宏都是跟littleVGL自帶的主題相關(guān)的,如果要演示官方自帶的例程,這些全部使能,注意,在實(shí)際項(xiàng)目中,我們一般最多使能一個,如果我們項(xiàng)目根本就用不到其自帶的主題,那么我們應(yīng)該把這些宏全部禁止,因?yàn)檫@樣可以節(jié)省 flash ram現(xiàn)在我們要演示官方例程,可以把他們?nèi)渴鼓堋?/span>

修改 lv_ex_conf.h 文件

9行:0修改為1 使能整個文件

#if 1

然后把下面這些宏設(shè)定為1,其余保持不變即可。

LV_EX_KEYBOARD,

LV_EX_MOUSEWHEEL,

LV_USE_TESTS,

LV_USE_TUTORIALS,

LV_USE_BENCHMARK,

LV_USE_DEMO,

LV_USE_TERMINAL

lVGL 提供心跳節(jié)拍

Lvgl有自己的任務(wù)系統(tǒng),所以在此咱們?yōu)?/span>LVGL提供一個系統(tǒng)基準(zhǔn)時間。

打開delay.c,添加#include "lvgl.h"頭文件,在系統(tǒng)定時器中斷服務(wù)函數(shù)里面添加lv_tick_inc(1);

(這里可以使用任何一個定時器的中斷服務(wù)函數(shù)作為時間基準(zhǔn),并不是只能是系統(tǒng)定時器。但是要注意,中斷服務(wù)函數(shù)需每1ms觸發(fā)一次。)

編譯 工程報錯。

仔細(xì)觀察錯誤,這一共是兩種錯誤。

第一個錯誤:點(diǎn)擊跳轉(zhuǎn),lv_conf.h文件 485行。

將頭文件lvgl修改為lvgl-v6.0

f5160ad0-f774-11ec-ba43-dac502259ad0.png

第二個錯:

將這5個文件,將頭文件都修改為#include "lvgl.h"即可

f52acfc4-f774-11ec-ba43-dac502259ad0.png

再編譯一下,就只剩下警告,沒有錯誤了,接下來我們來解決警告。在這些警告中,仔細(xì)看其實(shí)就只有 68, 111, 550 這三種警告,我可以告訴大家,這個警告對我們項(xiàng)目沒有任何影響的,但是強(qiáng)迫癥患者看著就是難受,辛虧 Keil 可以通過設(shè)置,把某種警告給屏蔽掉,點(diǎn)擊

圖標(biāo),切換到 C/C++選項(xiàng)卡, Misc Controls 中填入 --diag_suppress=68 --diag_supp

ress=111 --diag_suppress=550,如下圖所示.

f550184c-f774-11ec-ba43-dac502259ad0.png

點(diǎn)擊確定,再次編譯就沒有警告了。

修改底層驅(qū)動:打開lv_port_disp.c文件

7行:0修改為1

12行:頭文件修改為:#include "lv_port_disp.h"

f576ce7e-f774-11ec-ba43-dac502259ad0.png

然后就是修改

void lv_port_disp_init(void)

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

這兩個函數(shù)。

第一個函數(shù)是用來給LVGL提供一個繪制對象的緩沖區(qū)。內(nèi)容修改如下:

void lv_port_disp_init(void)

{

/* Example for 1) */

static lv_disp_buf_t disp_buf_1;

static lv_color_t buf1_1[LV_HOR_RES_MAX * 10]; /*A buffer for 10 rows*/

lv_disp_buf_init(&disp_buf_1, buf1_1, NULL, LV_HOR_RES_MAX * 10); /*Initialize the display buffer*/

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

* Register the display in LittlevGL

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

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 = LV_HOR_RES_MAX;

disp_drv.ver_res = LV_VER_RES_MAX;

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

disp_drv.flush_cb = disp_flush;

/*Set a display buffer*/

disp_drv.buffer = &disp_buf_1;

/*Finally register the driver*/

lv_disp_drv_register(&disp_drv);

}

第二個函數(shù)是為了給LCD屏寫入數(shù)據(jù)顯示的函數(shù),所以咱們調(diào)用LCD顯示函數(shù)。如下:

static void disp_flush(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;

int32_t y;

for(y = area->y1; y <= area->y2; y++) {

for(x = area->x1; x <= area->x2; x++) {

/* Put a pixel to the display. For example: */

/* put_px(x, y, *color_p)*/

//這個地方需要寫LCD的底層驅(qū)動函數(shù)

//可以寫畫點(diǎn)函數(shù)

LCD_Fast_DrawPoint(x,y,color_p->full);

color_p++;

}

}

/* IMPORTANT!!!

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

lv_disp_flush_ready(disp);

}

然后修改h文件:

f58ba4ca-f774-11ec-ba43-dac502259ad0.png

至此,顯示底層驅(qū)動就修改好了。

LVGL移植成功。

測試:寫如下函數(shù):

void Lglv_text(void)

{

obj1 = lv_obj_create(lv_scr_act(),NULL);//創(chuàng)建對象1

lv_obj_set_pos(obj1,20,20);//設(shè)置坐標(biāo)位置

lv_obj_set_size(obj1,100,100);//設(shè)置大小

obj2 = lv_obj_create(lv_scr_act(),NULL);//創(chuàng)建對象2

lv_obj_set_size(obj2,50,50);//設(shè)置大小

lv_obj_align(obj2,NULL,LV_ALIGN_CENTER,0,0);//設(shè)置坐標(biāo)位置為屏幕中央。

}

在主函數(shù)里面調(diào)用:

f5abeffa-f774-11ec-ba43-dac502259ad0.png

編譯下載:出現(xiàn)兩個基礎(chǔ)的對象。

f5c3f1b8-f774-11ec-ba43-dac502259ad0.png

到此,LVGL移植成功

審核編輯:湯梓紅

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

    關(guān)注

    146

    文章

    16665

    瀏覽量

    347742
  • GUI
    GUI
    +關(guān)注

    關(guān)注

    3

    文章

    631

    瀏覽量

    39289
  • 圖形庫
    +關(guān)注

    關(guān)注

    0

    文章

    16

    瀏覽量

    8993
  • LVGL
    +關(guān)注

    關(guān)注

    0

    文章

    79

    瀏覽量

    2734

原文標(biāo)題:一個現(xiàn)在很多MCU都用的一個GUI(圖形化設(shè)計(jì))

文章出處:【微信號:qrsworld,微信公眾號:嵌入式單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    嵌入式界面神器littleVGL介紹

    littleVGL 是近幾年開始流行的一個小型開源嵌入式 GUI ,具有界面精美,消耗資源小,可移植度高,響應(yīng)式布局等特點(diǎn),全采用純 c
    發(fā)表于 06-30 10:00 ?3116次閱讀
    嵌入式界面神器<b class='flag-5'>littleVGL</b>介紹

    開源GUI LittlevGL移植分享的嗎

    無意間發(fā)現(xiàn)一個開源的GUILittlevGL官方地址:https://littlevgl.com/STM32F429Discovery移植
    發(fā)表于 06-03 04:35

    LittlevGL在AT32上的移植說明

    ;lt;span]LittlevGL 是一個開源免費(fèi)的GUI,支持觸摸屏操作,移植簡單方便,開發(fā)者一直在不斷完善更新。這篇應(yīng)用筆記描述如何將LittlevGL
    發(fā)表于 09-13 17:15

    LittlevGL 開源圖形 精選資料分享

    LittlevGL 項(xiàng)目作者是來自匈牙利首都布達(dá)佩斯的 Gábor Kiss-Vámosi 。Kiss 在2009年開始寫 LittlevGL,2016年重寫并發(fā)布在 GitHub 上。官網(wǎng)
    發(fā)表于 07-30 07:33

    littleVGL主要特性有哪些

    一、前言littlevgl是一個小型開源嵌入式 GUI (簡稱LVGL),界面精美,消耗資源小,可移植度高,支持響應(yīng)式布局,全采用純 c
    發(fā)表于 08-23 06:59

    STM32移植LittleVgl

    STM32移植LittleVgl(LVGL)嵌入式開源圖形目錄STM32移植
    發(fā)表于 08-24 07:16

    Littlevgl介紹與移植

    Littlevgl介紹與移植1、簡介 Littlevgl是一種純C語言編寫的GUI,控件多且美,移植簡單,只要對接一個顯示接口,需要觸摸的再加一個觸摸控制接口。2、
    發(fā)表于 10-27 09:05

    LittlevGL開源圖形有哪些特性

    LittlevGL是什么?LittlevGL開源圖形有何功能?LittlevGL
    發(fā)表于 11-05 09:18

    LittlevGL的相關(guān)資料分享

    LittleVgl,一款開源嵌入式圖形用戶界面。https://littlevgl.cn/使用簡單小巧,界面也漂亮。很適合用在嵌入式上。在
    發(fā)表于 11-05 09:09

    LittleVGL v7.5.0在STM32F103x上的移植過程

    LittlevGL是一個免費(fèi)的開源圖形,提供了創(chuàng)建嵌入式GUI所需的一切,具有易于使用的圖形元素、漂亮的視覺效果和低內(nèi)存占用。最低要求:N
    發(fā)表于 01-11 06:50

    如何移植littleVGL?

    如何移植littleVGL
    發(fā)表于 01-20 07:50

    免費(fèi)開源的GUI:LittlevGL介紹、下載、配置、編譯

    免費(fèi)開源GUI:LittlevGL介紹、下載、配置、編譯
    的頭像 發(fā)表于 02-03 15:12 ?2.4w次閱讀
    免費(fèi)<b class='flag-5'>開源</b>的GUI:<b class='flag-5'>LittlevGL</b>介紹、下載、配置、編譯

    實(shí)戰(zhàn)貼:開源GUI LittlevGL在MCU上的移植

    前幾天看見正點(diǎn)原子發(fā)布了LittlevGL的教程,這個GUI貌似又火了,于是應(yīng)讀者要求,我也來移植一下,將正點(diǎn)原子的這個GUI移植到小熊派上,不到一會功夫就搞定了,總的來說挺簡單,沒遇到...
    發(fā)表于 10-27 14:06 ?10次下載
    實(shí)戰(zhàn)貼:<b class='flag-5'>開源</b>GUI <b class='flag-5'>LittlevGL</b>在MCU上的<b class='flag-5'>移植</b>

    嵌入式linux之go語言開發(fā)(十三)LittlevGL,漂亮的嵌入式GUI的go語言綁定

    LittleVgl,一款開源嵌入式圖形用戶界面。https://littlevgl.cn/使用簡單小巧,界面也漂亮。很適合用在嵌入式上。在
    發(fā)表于 11-02 10:21 ?11次下載
    嵌入式linux之go語言開發(fā)(十三)<b class='flag-5'>LittlevGL</b>,漂亮的嵌入式GUI的go語言綁定

    誰說單片機(jī)不能圖形編程,介紹MCU的TOP 5圖形GUI!

    LittlevGL(LVGL) 是一款開源的嵌入式圖形用戶界面(GUI),專為嵌入式系統(tǒng)設(shè)計(jì)。LVGL以其輕量級、靈活性和強(qiáng)大的功能而備受開發(fā)者青睞,資源夠的情況下可
    的頭像 發(fā)表于 12-07 10:42 ?6356次閱讀
    誰說單片機(jī)不能<b class='flag-5'>圖形</b>編程,介紹MCU的TOP 5<b class='flag-5'>圖形</b>GUI<b class='flag-5'>庫</b>!