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*/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?