又一次移植最新lvgl8到esp32的踩坑记录

  • 一、创建工程
    • 1、在vscode新建esp32工程
    • 2、添加lvgl最新版本的相关仓库代码
    • 3、创建lv_conf.h
    • 4、修改main.c
    • 5、配置和编译
  • 二、出现的问题以及解决过程

上一次移植了lvgl8到esp32后,发现用别人的仓库里面的lvgl并不是最新的版本,没有集成gif组件,为了使用gif播放,同时也自己尝试走一遍从0开始的移植过程。 之前移植的记录看这里

一、创建工程

1、在vscode新建esp32工程

在vscode中,按ctrl+shift+p键打开命令面板,输入搜索“show examples projects”,点击ESP-IDF:展示示例项目,选择你所用的esp-idf版本后,将打开esp-idf的例程创建界面。我这里esp-idf的版本是4.3.2。然后随便选个最简单的hello_world作为创建模板就可以了

2、添加lvgl最新版本的相关仓库代码

打开上一步创建的hello_world目录,新建一个“components”目录
然后将lvgl和lvgl_esp32_drivers两个仓库的最新代码clone到components目录内
https://github.com/lvgl/lvgl
https://github.com/lvgl/lvgl_esp32_drivers
现在的工程目录结构应该是这样的

3、创建lv_conf.h

在lvgl的目录下,有一个lv_conf_template.h的模板头文件,将其复制到同目录内,重命名为lv_conf.h。然后将里面最开始的“#if 0”改为“#if 1”使其生效,其它的都不用动了。在后面的menucofig后,相关的配置会作用里面的各种宏定义。

4、修改main.c

这里直接贴代码

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/semphr.h"#include "esp_log.h"
#include "esp_system.h"
#include "esp_freertos_hooks.h"#include "../components/lvgl/lvgl.h"
#include "lvgl_helpers.h"/*-----------------函数声明-----------------------------------*/
void lvgl_test(void);
/*-----------------------------------------------------------*//* LVGL 移植部分 */
static void lv_tick_task(void *arg)
{(void)arg;lv_tick_inc(portTICK_PERIOD_MS);
}
SemaphoreHandle_t xGuiSemaphore;/* UI 任务 */
static void gui_task(void *arg)
{xGuiSemaphore = xSemaphoreCreateMutex();lv_init();          //lvgl内核初始化lvgl_driver_init(); //lvgl显示接口初始化static lv_disp_draw_buf_t draw_buf;lv_color_t *buf1 = heap_caps_malloc(LV_HOR_RES_MAX * LV_VER_RES_MAX * sizeof(lv_color_t), MALLOC_CAP_DMA);lv_color_t *buf2 = heap_caps_malloc(LV_HOR_RES_MAX * LV_VER_RES_MAX * sizeof(lv_color_t), MALLOC_CAP_DMA);lv_disp_draw_buf_init(&draw_buf, buf1, buf2, LV_HOR_RES_MAX * LV_VER_RES_MAX); /*Initialize the display buffer*/static lv_disp_drv_t disp_drv;         /*A variable to hold the drivers. Must be static or global.*/lv_disp_drv_init(&disp_drv);           /*Basic initialization*/disp_drv.draw_buf = &draw_buf;         /*Set an initialized buffer*/disp_drv.flush_cb = disp_driver_flush; /*Set a flush callback to draw to the display*/disp_drv.hor_res = 128;                /*Set the horizontal resolution in pixels*/disp_drv.ver_res = 160;                /*Set the vertical resolution in pixels*/lv_disp_drv_register(&disp_drv);       /*Register the driver and save the created display objects*/esp_register_freertos_tick_hook(lv_tick_task);lvgl_test();while (1){/* Delay 1 tick (assumes FreeRTOS tick is 10ms */vTaskDelay(pdMS_TO_TICKS(10));/* Try to take the semaphore, call lvgl related function on success */if (pdTRUE == xSemaphoreTake(xGuiSemaphore, portMAX_DELAY)){lv_timer_handler();xSemaphoreGive(xGuiSemaphore);}}
}// lvgl测试
void lvgl_test(void)
{lv_obj_t *label1 = lv_label_create(lv_scr_act());lv_label_set_long_mode(label1, LV_LABEL_LONG_WRAP); /*Break the long lines*/lv_label_set_recolor(label1, true);                 /*Enable re-coloring by commands in the text*/lv_label_set_text(label1, "#0000ff Re-color# #ff00ff words# #ff0000 of a# label, align the lines to the center""and  wrap long text automatically.");lv_obj_set_width(label1, 120); /*Set smaller width to make the lines wrap*/lv_obj_set_style_text_align(label1, LV_TEXT_ALIGN_CENTER, 0);lv_obj_align(label1, LV_ALIGN_CENTER, 0, -40);lv_obj_t *label2 = lv_label_create(lv_scr_act());lv_label_set_long_mode(label2, LV_LABEL_LONG_SCROLL_CIRCULAR); /*Circular scroll*/lv_obj_set_width(label2, 120);lv_label_set_text(label2, "It is a circularly scrolling text. ");lv_obj_align(label2, LV_ALIGN_CENTER, 0, 40);
}// 主函数
void app_main(void)
{xTaskCreatePinnedToCore(gui_task, "gui task", 1024 * 3, NULL, 1, NULL, 0);
}

5、配置和编译

然后menuconfig,根据自己需要配置(可参考之前的移植blog)
这里有点要注意,因为我没有导入lvgl的examples工程,所以“Enable the examples to be built”这个就不要勾选了。
最后点击编译。
理所当然是肯定会报错的。这些开源该死的频繁更新。。。

二、出现的问题以及解决过程

1、‘SPI_HOST_MAX’ undeclared (first use in this function); did you mean ‘GPIO_PORT_MAX’?"

位于lvgl_esp32_drivers内的lvgl_helpers.c,直接粗暴将这句“assert((0 <= host) && (SPI_HOST_MAX > host))”注释掉就行了

bool lvgl_spi_driver_init(int host,int miso_pin, int mosi_pin, int sclk_pin,int max_transfer_sz,int dma_channel,int quadwp_pin, int quadhd_pin)
{// assert((0 <= host) && (SPI_HOST_MAX > host));const char *spi_names[] = {"SPI1_HOST", "SPI2_HOST", "SPI3_HOST"};

2、‘DLV_HOR_RES_MAX’ undeclared (first use in this function); did you mean ‘LV_HOR_RES’?
‘DLV_VER_RES_MAX’ undeclared (first use in this function); did you mean ‘LV_VER_RES’?

lvgl_helpers.h缺少这两个宏定义,加上

 * When using RGB displays the display buffer size will also depends on the* color format being used, for RGB565 each pixel needs 2 bytes.* When using the mono theme, the display pixels can be represented in one bit,* so the buffer size can be divided by 8, e.g. see SSD1306 display size. */
#define LV_HOR_RES_MAX 240
#define LV_VER_RES_MAX 240#if defined (CONFIG_CUSTOM_DISPLAY_BUFFER_SIZE)
#define DISP_BUF_SIZE   CONFIG_CUSTOM_DISPLAY_BUFFER_BYTES

3、好了,编译通过了,是不是这就完了?不,Too young too simple。
程序启动时报错,然后不断重启。。。

又是一番爬之后,改这里吧:
还是lvgl_helpers.h这个文件。不知到为社么,显示缓存大小的计算定义在新版本中被改成了水平宽度x40了。我的是ST7735S,这里改成水平x垂直
#define DISP_BUF_SIZE (LV_HOR_RES_MAX * LV_VER_RES_MAX)

#define LV_HOR_RES_MAX 240
#define LV_VER_RES_MAX 240#if defined (CONFIG_CUSTOM_DISPLAY_BUFFER_SIZE)
#define DISP_BUF_SIZE   CONFIG_CUSTOM_DISPLAY_BUFFER_BYTES
#else
#if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7789)
#define DISP_BUF_SIZE  (LV_HOR_RES_MAX * 40)
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7735S
#define DISP_BUF_SIZE  (LV_HOR_RES_MAX * LV_VER_RES_MAX)
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7796S
#define DISP_BUF_SIZE  (LV_HOR_RES_MAX * 40)
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_HX8357
#define DISP_BUF_SIZE  (LV_HOR_RES_MAX * 40)

然后,就终于完成了

又一次移植最新lvgl8到esp32的踩坑记录相关推荐

  1. 将rtthread-4.0.3 移植到LS1B的踩坑记录

    从github 下了rt-thread 的最新版本rt-thread 4.0.3,发现其中对LS1B的支持太匮乏,并且在板子无法正常运行.好在对LS1C的支持还算完善,遂参考LS1C采用新框架移植串口 ...

  2. 最新Ubuntu20.04安装指南(防踩坑版)

    文章目录 最新Ubuntu20.04安装.配置指南(防踩坑版) 一.备份(!!!) (1)Windows系统镜像 (2)个人资料 (3)一些杂项 二.启动盘UEFI引导 1.启动盘制作 2.设置以U盘 ...

  3. pycharm+PyQt5+python最新开发环境配置,踩坑过程详解

    安装工具: Pycharm 专业版2017.3 PyQT5 python3 pyqt5-tools 设置扩展工具的参数找到setting->tools->external tools,点击 ...

  4. Alphapose - Windows下Alphapose(Pytorch 1.1+)版本2021最新环境配置步骤以及踩坑说明

    文章目录 1 Alphapose 2 环境配置 2.1 官方安装说明 2.2 Anaconda创建虚拟环境Alphapose 2.3 获取Alphapose仓库 2.4 安装相关依赖库 2.4.1 激 ...

  5. 乐鑫Esp32学习之旅 23 安信可 esp32-a1s 音频开发板移植最新 esp-adf 音频框架,小试牛刀如何实现在线文字转语音播放。

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 " ...

  6. tq2440 linux,移植最新内核Linux4.1.6到TQ2440开发板教程(一)-Go语言中文社区

    本次移植主要是移植最新内核Linux4.1.6到TQ2440开发板 开发板:TQ2440 内核:Linux4.1.6 目的:在开发板上实现内核的启动,并挂上nfs根文件系统 1. 下载最新内核linu ...

  7. 最新LVGL8.3.7版本汉字输入法的使用,使用自定义词典。

    访问LVGL官网:https://lvgl.io/,下载最新版8.3.7. 参考:https://blog.csdn.net/qq_59953808/article/details/126445608 ...

  8. Zynq MPSoC在自定义硬件平台中移植使用Xilinx Certified Ubuntu踩坑实录(以ZCU102为例)

    本文后续更新和资源在个人主页,欢迎点此查看 前言 在Zynq中移植Linux一直是对于我们这种初学者来说的老大难问题,这一问题在官方推出Petalinux后有所缓解.但Petalinux OS的操作简 ...

  9. 逐飞 RT1064 库 GCC (VSCode) 移植踩坑

    §对于逐飞RT1064库的GCC移植 1.移植相关工作   今天(2021-05-16)收到一位参加智能车竞赛的学生发送过来的信息,它对于逐飞RT1064的库进行了GCC 移植: 卓大大,我为逐飞的 ...

最新文章

  1. 那些年,我们一起刷过的计算机视觉比赛
  2. spark RDD的血缘关系
  3. mac上nginx静态页面访问403
  4. 排序算法——随机快速排序
  5. c语言宏定义替换字符串,C语言中,宏替换的替换规则
  6. 为什么耗资数亿的12306一直都非常难用?
  7. 传说中的世界500强面试题-推理能力(2)
  8. 多智能体(MARL)强化学习与博弈论
  9. 个人价值:个人价值冰山模型
  10. 专属微信二维码python制作_如何通过一行代码制作个人专属动态微信二维码?
  11. linux各种命令手册
  12. Win10安全证书过期怎么办
  13. oracle SQL以结尾函数,Oracle SQL 内置函数大全
  14. 经典算法研究系列:五、红黑树算法的实现与剖析
  15. 小程序 身份认证服务器,如何实现微信小程序与.net core应用服务端的无状态身份验证...
  16. 预测、迭代与优化:用AI探寻组合优化问题最优解
  17. c语言体积的单词,C语言程序:求常用圆形体的体积
  18. Java中高级面试题部分答案解析(3)
  19. wms仓库管理系统,进销存和ERP系统三者之间联系
  20. java 安卓application_Android中Application类用法

热门文章

  1. linux日志查看/项目日志查看/监控日志
  2. Vue实现Google登录
  3. html表格垂直居中的CSS代码,使用3行CSS代码使任何元素垂直居中
  4. polsarpro滤波后没有bmp文件_win10系统右键新建菜单中没有bmp如何解决
  5. office(word)如何使用格式刷的方法。
  6. 基于Linux下的VIC使用(1)VIC部分(Fortran版本)
  7. 计算机系统集成内容实习报告,网络系统集成的实习报告.docx
  8. 江苏省盐城中学信息竞赛队(YZOI)队规
  9. 循环进行Bitmap转BitmapSource导致内存溢出时可使用使用DeleteObject来释放资源
  10. 盲盒系统的玩法运营如何盈利