lvgl的移植及大坑

一,文件准备

进入官网获取源码https://lvgl.io/

笔者lcd及源码情况

二,进行裁剪

下载好的源码我们只需留下这些文件 

  接着继续对examples文件夹进行裁剪,我们只需要留下porting

最后进给lv_conf_template.h改个名字,改为 lv_conf.h,得到最终的文件

三,移植到个人的工程 

 读者需要在自己的工程中创建一个文件夹,如下:

 创建文件甲的结构为:

将剪裁好的源码放入lvgl的文件夹下: 

在Keil中添加文件: 

创建相应文件夹: 

Middlewares/lvgl/examples/porting 组添加 Middlewares/LVGL/GUI/lvgl/examples/porting 目录下的 lv_port_disp_template.c lv_port_indev_template.c 文件

Middlewares/lvgl/src/core 分组中添加 core 文件夹下的全部.c 文件

Middlewares/lvgl/src/draw 组中添加 draw 文件夹下除 nxp_pxp nxp_vglite sdl
stm32_dma2d 文件夹之外的全部 .c 文件

 Middlewares/lvgl/src/extra 组中添加 extra 文件夹下除了 lib 文件夹之外的全部.c 文件

Middlewares/lvgl/src/font 组中添加 font 文件夹下的全部.c 文件

Middlewares/lvgl/src/gpu 组中添加 draw/stm32_dma2d draw/sdl 文件夹下的全部 .c

Middlewares/lvgl/src/hal 组中添加 hal 文件夹下的全部.c 文件

Middlewares/lvgl/src/misc 组中添加 misc 文件夹下的全部.c 文件

 Middlewares/lvgl/src/widgets 组中添加 widgets 文件夹下的全部.c 文件

添加头文件

在main.c中加入相应头文件

添加心跳(在添加心跳前你需要初始化一个1ms的时钟,并开启中断):

在main函数中进行初始化

在while(1)中加入LVGL调用函数 

开始对接:打开 Middlewares/lvgl/examples/porting 分组中的 lv_port_disp_template.c/h (显示屏相关) 和 lv_port_indev_template.c/h (触摸输入相关)文件,将这 4 个文件中的条件编译指令 #if 0 都 修改成#if 1,如:

其他如法炮制。 

四,对接LCD显示:

添加头文件:

修改lv_port_disp_init()函数 

笔者屏幕情况及上面所选缓冲区大小:

static lv_color_t buf_1[X* Y]; 

lv_disp_draw_buf_init(&draw_buf_dsc_1, buf_1, NULL, X* Y); 

X为你屏幕的宽度,Y最小值为10。

修改lv_port_disp_init()函数最后要修改的地方:

LVGL初始化函数和填充函数修改,在相应的地方加入你的函数:

大坑一:除非你不会写自己的填充函数,或你的lcd.c没有,不然不要使用法一,不然你的LCD显示就像拉窗帘一样,来刷新屏幕。 

读者可以参考笔者的填充函数:

/*
 * 名字:LCD色块填充函数
 * 功能:进行色块填充
 * 参数sx:色块填充的开始x坐标
 * 参数sy:色块填充的开始y坐标
 * 参数ex:色块填充的结束x坐标
 * 参数ey:色块填充的结束y坐标
 * 参数color:要填充的颜色指针
 * 返回值:无
*/
void LCD_Color_Fill(u16 sx, u16 sy, u16 ex, u16 ey, u16* color)
{
	u16 height, width;
	width = ex - sx + 1;            
    height = ey - sy + 1;
    //设置显示窗口大小           
	LCD_SetWindows(sx,sy,ex,ey);
	for(uint32_t y = 0; y <width*height; y++) 
	{
		Lcd_WriteData_16Bit(*color);
		color++;
  }
}

到此显示部分移植完成。 

五,触摸部分移植

添加头文件及相关变量,如果你配置正确你的第7行应该和我一样:

 将触摸无关的删掉,剪裁后如下:

/**
 * @file lv_port_indev_templ.c
 *
 */

 /*Copy this file as "lv_port_indev.c" and set this value to "1" to enable content*/
#if 1

/*********************
 *      INCLUDES
 *********************/
#include "lv_port_indev_template.h"
#include "../../lvgl.h"

#include "touch.h" 

/*********************
 *      DEFINES
 *********************/

/* 触摸坐标存储数组 */
int getX_Y[ 2 ];

/**********************
 *      TYPEDEFS
 **********************/

/**********************
 *  STATIC PROTOTYPES
 **********************/

static void touchpad_init(void);
static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
static bool touchpad_is_pressed(void);
static void touchpad_get_xy(lv_coord_t * x, lv_coord_t * y);

/**********************
 *  STATIC VARIABLES
 **********************/
lv_indev_t * indev_touchpad;


/**********************
 *      MACROS
 **********************/

/**********************
 *   GLOBAL FUNCTIONS
 **********************/

void lv_port_indev_init(void)
{
    
    static lv_indev_drv_t indev_drv;

    /*------------------
     * Touchpad
     * -----------------*/

    /*Initialize your touchpad if you have*/
    touchpad_init();

    /*Register a touchpad input device*/
    lv_indev_drv_init(&indev_drv);
    indev_drv.type = LV_INDEV_TYPE_POINTER;
    indev_drv.read_cb = touchpad_read;
    indev_touchpad = lv_indev_drv_register(&indev_drv);

    
}

/**********************
 *   STATIC FUNCTIONS
 **********************/

/*------------------
 * Touchpad
 * -----------------*/

/*Initialize your touchpad*/
static void touchpad_init(void)
{
    /*Your code comes here*/
		
}

/*Will be called by the library to read the touchpad*/
static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{
    static lv_coord_t last_x = 0;
    static lv_coord_t last_y = 0;

    /*Save the pressed coordinates and the state*/
    if(touchpad_is_pressed()) {
        touchpad_get_xy(&last_x, &last_y);
        data->state = LV_INDEV_STATE_PR;
    } else {
        data->state = LV_INDEV_STATE_REL;
    }

    /*Set the last pressed coordinates*/
    data->point.x = last_x;
    data->point.y = last_y;
}

/*Return true is the touchpad is pressed*/
static bool touchpad_is_pressed(void)
{
    /*Your code comes here*/
    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*/
		
}


#else /*Enable this file at the top*/

/*This dummy typedef exists purely to silence -Wpedantic.*/
typedef int keep_pedantic_happy;
#endif

修改LVGL的触摸初始化函数(笔者的触摸初始化已经在cubemx配置时实现了,读者有触摸初始化函数放入在这即可): 

修改LVGL触摸检测函数:

 修改LVGL 获取坐标函数:

至此触摸配置完成。 

六,进行lvgl.h配置

修改色深(笔者屏幕为16色的): 

修改缓冲大小,内存不够可以将这里改小一些:

 修改点击灵敏度(这里笔者改为15ms):

七,实验

画一个标签:

如果在中间显示Label及移植成功,如果你这里显示一堆错误很有可能是内存不够。 

 此时你在添加这行代码lv_switch_create( lv_scr_act() );显示一个滑块,可能会出现意想不到的错误。如:运行卡在硬件错误句柄这里。

你需要打开你芯片的改.s文件,将 Stack_Size        EQU     0x400改为如下

八,结束语

有问题给笔者留言,共同进步!!!!!
  • 12
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
在进行STM32 LVGL移植之前,需要进行一些准备工作。首先,需要准备一个STM32工程,并确保该工程中包含了TFT LCD控制器,即LTDC。通过LTDC,STM32F429系列芯片可以直接外接RGB LCD屏幕,实现液晶驱动。 其次,需要下载LVGL组件包。可以在lvgl-8.0.2目录下找到lvgl.h、lv_conf_template.h、LICENCE.txt和README.md这四个文件。将这四个文件复制到新建的GUI文件夹中,并确保lv_conf_template.h文件中的配置符合你的具体需求。 在移植LVGL过程中,还需要根据具体的硬件平台和需求,对LVGL进行配置和适配。这包括根据自己的需求进行UI设计、设置图形库的显示驱动程序、处理输入事件、内存管理以及定时器等的适配。通过参考LVGL的文档和示例代码,可以更详细地了解如何进行移植,并按照具体需求进行相应的配置和调整。 需要注意的是,LVGL移植过程可能会涉及到一些底层硬件的操作和配置,因此需要对硬件平台有一定的了解和熟悉。同时,移植过程中可能会遇到一些问题和挑战,需要进行一定的调试和优化。建议在移植过程中保持耐心,并及时查阅LVGL的官方文档和社区资源,以获取更多的帮助和支持。 总之,STM32 LVGL移植需要准备好STM32工程和LVGL组件包,并根据具体的硬件平台和需求进行配置和适配。移植过程中可能会遇到一些问题和挑战,但通过参考LVGL的文档和示例代码,并保持耐心和坚持,最终可以成功完成移植并使用LVGL来实现液晶驱动和UI设计。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值