STM32+HAL库+FreeRTOS移植LVGL(8.3)驱动SPI协议的LCD触摸屏—从点亮到提速之移植篇_freertos lcd
前言
本章将系统讲解LVGL在嵌入式平台的完整开发流程,分为三大实战阶段:首先完成LVGL基础移植,接着通过DMA加速与源码级优化提升性能,最终结合GUI-Guider进行高效UI设计。我们将以踩坑日记的形式,深入剖析移植过程中的典型问题及解决方案。首篇聚焦LVGL移植环节,详细演示从零搭建图形框架的关键步骤。
如果你已成功移植lvgl,但是觉得显示速度过慢,可直接进入下一章提速篇。
一、点亮准备
下载 lvgl 源码
github:https://github.com/lvgl/lvgl
如果打不开github可以使用 Watt Toolkit 进行加速,直接百度搜索下载即可。
二、裁剪lvgl文件
只需要保留以下文件
之后再打开examples,只保留porting文件,并把文件中的_template删除(这是移植规范,表示当前项目为有效移植文件,而非未修改的模板)。
然后在cubemx生成的文件中加入LVGL文件并把上面保留的文件复制进去。
三、添加lvgl文件
打开keil5,创建四个文件并添加对应文件。
LVGL_src:存放 lvgl 源码,必须添加lvgl/src中的所有.c和.h文件(包括文件夹中的文件),特别多需要耐心添加。
LVGL_porting:存放lvgl接口文件。
LVGL:存放配置文件和头文件(lvgl.h和lv_conf.h)
LVGL_MYUI:存放自己的ui代码(暂时不用添加)
之后需要配置文件:打开C99,加入文件路径。
四、修改lvgl源码
1.使能LVGL
将 lv_port_disp.c 、 lv_port_disp.h 、 lv_port_indev.c 、 lv_port_indev.h、 lv_conf.h文件最开头的if 0改成 if 1
2.修改lv_conf.h文件
添加屏幕分辨率,和头文件
#if USE_HORIZONTAL==0||USE_HORIZONTAL==1//判断横屏或竖屏#define MY_DISP_HOR_RES LCD_W#define MY_DISP_VER_RES LCD_H#else#define MY_DISP_HOR_RES LCD_H#define MY_DISP_VER_RES LCD_W#endif
3.修正代码
1.删除所有_template
2.将 lvgl/lvgl.h 改为 lvgl.h
3.将 ../../lvgl.h 改为 lvgl.h
4.修改lv_port_disp.c文件
1.添加头文件
2.注释 Example for 2 和 Example for 3
3.修改 disp_flush 函数
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p){ if(disp_flush_enabled) { /*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 y2; y++) { for(x = area->x1; x x2; x++) { /*Put a pixel to the display. For example:*/ /*put_px(x, y, *color_p)*/GUI_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_drv);}
4.编译,如果报错检查一下文件有没有全部添加进去。再看一下报错内容,百度或者ai检查是哪里出现问题。
5.触摸功能
修改 lv_port_indev.c 文件
lv_port_indev_init()函数只保留以下内容。
修改代码
static bool touchpad_is_pressed(void){tp_dev.scan(0);if(tp_dev.sta&TP_PRES_DOWN)//触摸屏被按下{return true;} /*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*/ (*x) = tp_dev.x; (*y) = tp_dev.y;}
五、功能测试
1.添加 lvgl 的心跳函数
2.准备测试代码
使用正点原子的代码示例进行测试,到正点原子官网下载例程,这里使用开关进行测试。
打开 lv_switch(开关)\\Middlewares\\LVGL\\GUI_APP ,将文件中的所有文件导入工程
加入到LVGL_MYUI中,添加文件路径
3.开始测试
main函数中只需要 delay_init。
打开freertos.c 添加头文件
lv_task中添加初始化代码和测试代码
void lv_task(void const * argument){ /* USER CODE BEGIN lv_task */LCD_Init();lv_init();lv_port_disp_init();lv_port_indev_init();lv_mainstart(); /* Infinite loop */ for(;;) { lv_timer_handler(); /* LVGL计时器 */ vTaskDelay(5); } /* USER CODE END lv_task */}
4.编译烧录
测试结果,可以看到 lcd初始化后 调用 LCD_Clear(RED); 时的刷新率还比较快,但是显示 lvgl 的ui界面肉眼可见的非常慢。需要使用 DMA 来进行提速,可以看下一篇文章提速篇。
提速后的效果
触摸功能测试
代码:
gitee:Chenpz/LVGL_SPI - Gitee.com
百度网盘: https://pan.baidu.com/s/13eEts1zqMX169ks8NTL2AA?pwd=xdfn 提取码: xdfn