LVGL——STM32F4移植lvgl8

1.下载LVGL源码

打开github,点击lvgl在github的仓库,依次点击master、tags、v8.3.3

 切换到V8.3.3分支后,再点code、下载zip

 

把下载好的lvgl-8.3.3.zip文件解压,至此,源码下载完毕

 

 

2、开始移植

2.1把源码搬运到工程文件夹里

在RTT_Templates(STM3232F407)_LVGLv8目录下新建一个lvgl文件夹

把lvgl-8.3.3\src文件夹直接复制到新建的lvgl文件夹里,这个src里面就是源码

把lvgl-8.3.3\examples\porting文件夹复制到新建的lvgl文件夹里,这是移植用的接口

把lvgl-8.3.3目录下的lvgl.h、lv_conf_template.h、LICENCE.txt、README.md一共4个文件复制到新建的lvgl文件夹里,后面两个可以不用,不影响移植

现在,RTT_Templates(STM3232F407)_LVGLv8\lvgl目录下一共这几个文件:

 

 

 

搬运好了代码,我们得给文件改个名字,不然文件内部包含的头文件名字不一致

把RTT_Templates(STM3232F407)_LVGLv8\lvgl目录下的lv_conf_template.h文件名字改成lv_conf.h

 

 把RTT_Templates(STM3232F407)_LVGLv8\lvgl\porting目录下所有文件名字的_template删了,改完之后长这样

 

至此,我们的代码搬运工作结束。

2.2把搬运好的代码添加到KEIL工程

 打开keil,点击文件扩展按钮,新建三个组,名字分别为LVGL_SRC、LVGL_PORTING、LVGL_DEMO

 

 先对LVGL_SRC组添加文件,把touch\lvgl\src路径下的所有.c文件都添加进去,你没有听错,是所有.c文件,包括所有子目录,可以结合Ctrl+A快捷键全选之后再点击添加,提高效率。

添加好之后长这样:(一张图显示不下)

把\lvgl\porting路径下所有的.c文件添加到LVGL_PORTING组,这个文件少,就三个
LVGL_DEMO组先不管,需要跑DEMO的时候再添加。

 

 

接下来包含头文件。

把...\lvgl、...\lvgl\src、...\lvgl\porting三个路径包含。

 

 好了,现在需要的库都添加完了。

2.3动手改代码

先点一下编译,发现 181 Error(s), 5 Warning(s)。

 

 编译器找不到"…/…/lv_conf.h"这个文件,lv_conf.h就在...\lvgl路径下,我们刚才把lv_conf.h的路径包含了,所有不用…/…/,直接在lv_conf_internal.h(41行)删了就行

 

把lv_conf.h文件#if 0 改成#if 1

 

同样的,把lv_port_disp.c、lv_port_disp.h、lv_port_indev.c、lv_port_indev.c四个文件的#if 0 都改成#if 1 (没有触摸功能lv_port_indev.c、lv_port_indev.c就不用改1),这四个文件包含的头文件名字还需修改,具体看下图。这四个文件中的两个.h文件中,路径为#include "lvgl/lvgl.h"改成#include “lvgl.h”。

 

 

 

 

 

 

 把keil改成C99模式

 

 点击全部保存,我们先把keil关闭,在RTT_Templates(STM3232F407)_LVGLv8目录下,对lvgl文件夹点右键-属性,把只读的选项取消勾选,应用于子文件夹和文件,避免keil重复编译,不然每次点击编译,所有文件都编译一遍,等一万年。

 

 

 打开keil,为了不让keil每次都把所有代码编译一遍,在设置-Output选项中,不要勾选Create Batch File 创建批处理文件,在设置-Target选项中,不要勾选 使用交叉模块优化,也不要勾选 use Micro LIB,因为LVGL有个二维码的控件使用Micro LIB编译会报错。

 好了,我们现在再次点击编译,发现又有好多个错误。

 原来是lv_port_disp.c文件里面有几个宏定义没有定义好。

我们在lv_conf.h中定义好屏幕的水平像素和垂直像素大小,顺手把LV_COLOR_DEPTH 改成16位(根据实际情况改,如果屏幕是32位色就不用改)

 

 

 把lv_port_disp.c的里面的example 2 和3都注释了,只留example1,点击编译,编译通过,警告不用管,大多是因为定义了函数但是没有使用而报警告,不影响。

 

 

接着在SysTick_Handler中断中添加lvgl的心跳接口。

在滴答滴中断中调用lv_tick_inc(1);

 

 2.4添加屏幕的接口

在lv_port_disp.c文件的顶部包含自己的lcd.h,用于调用lcd相关的接口

根据实际情况,在lv_port_disp.c文件中给disp_drv.hor_res和disp_drv.ver_res两个参数赋值,可以是lcd初始化之后获取的,也可以是固定的

 

在disp_flush函数中,注释原来的for循环,把自己的LCD填充颜色的函数放进去。

 

至此,我们屏幕显示的接口移植完毕。

 

void lv_example_led_1(void)
{
    /*Create a LED and switch it OFF*/
    lv_obj_t * led1  = lv_led_create(lv_scr_act());
    lv_obj_align(led1, LV_ALIGN_CENTER, -80, 0);
    lv_led_off(led1);

    /*Copy the previous LED and set a brightness*/
    lv_obj_t * led2  = lv_led_create(lv_scr_act());
    lv_obj_align(led2, LV_ALIGN_CENTER, 0, 0);
    lv_led_set_brightness(led2, 150);
    lv_led_set_color(led2, lv_palette_main(LV_PALETTE_RED));

    /*Copy the previous LED and switch it ON*/
    lv_obj_t * led3  = lv_led_create(lv_scr_act());
    lv_obj_align(led3, LV_ALIGN_CENTER, 80, 0);
    lv_led_on(led3);
}
void gui_task(void *pvParameters)
{
    lv_init();              // lvgl系统初始化
    lv_port_disp_init();  // lvgl显示接口初始化,放在lv_init()的后面
    
//    ui_Screen2_screen_init();
    lv_example_led_1();
    while(1)
    {
        lv_task_handler(); // lvgl的事务处理
        rt_thread_delay(1);
    }
}

编译,下载,点灯成功。

SPI颜色数据传输问题:

/*Swap the 2 bytes of RGB565 color. Useful if the display has an 8-bit interface (e.g. SPI)*/
#define LV_COLOR_16_SWAP 1

 

使用动态内存, lv_conf.h文件修改如下:

/*1: use custom malloc/free, 0: use the built-in `lv_mem_alloc()` and `lv_mem_free()`*/
#define LV_MEM_CUSTOM 1
#if LV_MEM_CUSTOM == 0
    /*Size of the memory available for `lv_mem_alloc()` in bytes (>= 2kB)*/
    #define LV_MEM_SIZE (48U * 1024U)          /*[bytes]*/

    /*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/
    #define LV_MEM_ADR 0     /*0: unused*/
    /*Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc*/
    #if LV_MEM_ADR == 0
        #undef LV_MEM_POOL_INCLUDE
        #undef LV_MEM_POOL_ALLOC
    #endif

#else       /*LV_MEM_CUSTOM*/
    #define LV_MEM_CUSTOM_INCLUDE <rtthread.h>//<stdlib.h>   /*Header for the dynamic memory function*/
    #define LV_MEM_CUSTOM_ALLOC   rt_malloc
    #define LV_MEM_CUSTOM_FREE    rt_free
    #define LV_MEM_CUSTOM_REALLOC rt_realloc
#endif     /*LV_MEM_CUSTOM*/

 

posted @ 2022-10-14 15:56  我是,一株蒜。  阅读(673)  评论(0编辑  收藏  举报