使用RT-Thread studio 移植 LVGL到RT-Thread中

其实RT-Thread 移植LVGL 官方已经出来很多教程,但是但是他出的教程都是基于一些他们适配的BSP,但是其他不适配的怎么办呢? 当然是手搓了。

前期准备

1   在本次移植前,你必须要有在RT-Thread studio中你屏幕的显示和触摸驱动。
 这个简单拉,直接把正点原子的代码移植一下就好拉。

2.你最好还是先在裸机上移植一次,这个可以跟着正点原子litleVGL(LVGL旧版本名称 要
用 这个搜索视频才能搜索的到)视频教程移植一次,这样你移植就会块很多,但是不弄也行。

捞的话就不说了,开始

在移植好屏幕驱动的的工程中,添加LVGL包
在这里插入图片描述

编译一下(会把软件包添加进来) ,这里编译肯定是有错误的,因为我们还有几个文件没有添加进去。添加文件,首先我们是要有这些文件。

找到我们studio安装目录下 ,添加包工程下的下面4个文件
在这里插入图片描述

直接复制这4个文件,在studio中,选择applications 粘贴,顺便把名字改一下,必须改这样LVGL才能调用。把每个文件后面的_template去掉,

在这里插入图片描述
在这里插入图片描述
1.点开 lv_port_disp.c 修改 ,修改这三处
在这里插入图片描述
接下来的三个也修改一下看图。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
大家,体谅一下哈,没写几次博客,可能有些啰嗦,有些地方没表达清楚

接下来就是把我们自己的打点函数和LVGL对接拉

在这里插入图片描述
找到下面的函数,具体修改看我下面的注释
在这里插入图片描述

如果没错的话,你现在编译是不会出错了的。但是别急,还有些东西没弄
现在我们移植触摸接口,

在这里插入图片描述

由于我们只使用到触摸功能,LVGL还有一些按键功能什么鬼的,但是我们不用所以我们要修改

在这里插入图片描述

还有哈,还有哈。是有点麻烦,

我们需要添加一个 lv_conf.h 头文件,本来我们是直接要和前面一样使用他的工程模板的,但是那个改起来太麻烦了,所有我们就抄的别的工程的

在这里插入图片描述

//添加一个头文件名字别错了, 把这些复制进去

#ifndef LV_CONF_H
#define LV_CONF_H

#define LV_COLOR_16_SWAP 0
#define LV_COLOR_DEPTH 16
#define LV_USE_PERF_MONITOR 1

#include <rtconfig.h>
#define LV_HOR_RES_MAX          480    //你屏幕的高
#define LV_VER_RES_MAX          800    //你屏幕的宽

//我们要使能的demo 假如你要使能其他的可以去,packages文件夹下找到
//lv_conf_template.h 下找到对应的宏复制过来哈,就不详述拉

#define LV_USE_DEMO_RTT_MUSIC       1  
#define LV_DEMO_RTT_MUSIC_AUTO_PLAY 1

#define LV_FONT_MONTSERRAT_12       1
#define LV_FONT_MONTSERRAT_16       1

#endif

==我们知道,操作系统中运行需要一个一个线程,LVGL好像也有一个任务调度的所以我们添加一个 lv_demo.c ==
在这里插入图片描述

//复制进去哈,假如你自己写的话,最好也看看这个模板,有些地方要注意
#include <rtthread.h>
#include <lvgl.h>
#include <lv_port_indev.h>
#define DBG_TAG    "LVGL.demo"
#define DBG_LVL    DBG_INFO
#include <rtdbg.h>
#include "MyApplication.h"

#ifndef LV_THREAD_STACK_SIZE
#define LV_THREAD_STACK_SIZE 4096
#endif

#ifndef LV_THREAD_PRIO
#define LV_THREAD_PRIO (RT_THREAD_PRIORITY_MAX*2/3)
#endif

static lv_obj_t * label;

static void slider_event_cb(lv_event_t * e)
{
    lv_obj_t * slider = lv_event_get_target(e);

    /*Refresh the text*/
    lv_label_set_text_fmt(label, "%"LV_PRId32, lv_slider_get_value(slider));
    lv_obj_align_to(label, slider, LV_ALIGN_OUT_TOP_MID, 0, -15);    /*Align top of the slider*/
}

/**
 * Create a slider and write its value on a label.
 */
void lv_example_get_started_3(void)
{
    /*Create a slider in the center of the display*/
    lv_obj_t * slider = lv_slider_create(lv_scr_act());
    lv_obj_set_width(slider, 200);                          /*Set the width*/
    lv_obj_center(slider);                                  /*Align to the center of the parent (screen)*/
    lv_obj_add_event_cb(slider, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);     /*Assign an event function*/

    /*Create a label below the slider*/
    label = lv_label_create(lv_scr_act());
    lv_label_set_text(label, "0");
    lv_obj_align_to(label, slider, LV_ALIGN_OUT_TOP_MID, 0, -15);    /*Align top of the slider*/
}


static void lvgl_thread(void *parameter)
{
    lv_example_get_started_3();

    while(1)
    {

        lv_task_handler();  //必须要哈  LVGL任务调度
        
        rt_thread_mdelay(5);
    }
}

static int lvgl_demo_init(void)
{

       MX_GPIO_Init();
       MX_FSMC_Init();     
       LCD_Init();         //LCD初始化
       tp_dev.init();      //触摸屏初始化
       
       lv_init();         //LVGL 初始化


    rt_thread_t tid;
    tid = rt_thread_create("LVGL", lvgl_thread, RT_NULL, LV_THREAD_STACK_SIZE, LV_THREAD_PRIO, 0);
    if(tid == RT_NULL)
    {
        LOG_E("Fail to create 'LVGL' thread");
    }
    rt_thread_startup(tid);

    return 0;
}


INIT_APP_EXPORT(lvgl_demo_init);

最后,编译------报错 --吐了。
这个好像是LVGL和cubemx冲突了,找到cubemx把
void Error_Handler(void); 注释掉

在这里插入图片描述
编译-------下载,屏幕中出现一个可以滑动的进度条
恭喜你------

在这里插入图片描述

移植了一个星期,把所有踩过的坑都分享给大家,最后祝大家头发早日掉光!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐