参考资料

徐宏的博客:移植最新的 LVGL 到安信可ESP32\C3模组,显示一个二维码。

项目目录:

1.ESP32c3 移植lvgl核心组件教程
2.ESP32C3 移植 lvgl/lv_demos 教程


@[TOC](文章目录)


一、新建一个工程模板




二、克隆lvgl所需要的库

找到刚才创建的工程blink,在里面创建一个 components 文件夹


克隆所需的最新的 LVGL依赖库,(2021.11.16) V8.1 为例:

git clone -b release/v8.1 https://github.com/lvgl/lvgl

克隆所需的最新的针对ESP32芯片系列的LVGL驱动库

git clone https://github.com/lvgl/lvgl_esp32_drivers




三、你可能会遇到下面这个问题(示例):



四、开始移植


代码如下(示例):

lvgl_init.h

#include "freertos/FreeRTOS.h"
#include "freertos/event_groups.h"
#include "lvgl.h"
#include "freertos/semphr.h"
#include "esp_system.h"/* Littlevgl specific */
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif#include "lvgl_helpers.h"
#include "lvgl/src/hal/lv_hal_disp.h"#define LV_TICK_PERIOD_MS 1
#define BUF_W 20
#define BUF_H 10void lv_tick_task(void *arg);
void guiTask1(void *pvParameter);
void Show_State();

lvgl_init.c

#include "lvgl_init.h"
// #include "lv_examples/src/lv_demo_music/lv_demo_music.h"
// #include "lv_examples/src/lv_demo_benchmark/lv_demo_benchmark.h"
// #include "lv_examples/src/lv_demo_widgets/lv_demo_widgets.h"
/***********************  STATIC PROTOTYPES**********************/void lv_tick_task(void *arg)
{lv_tick_inc(LV_TICK_PERIOD_MS);
}
/* Creates a semaphore to handle concurrent call to lvgl stuff* If you wish to call *any* lvgl function from other threads/tasks* you should lock on the very same semaphore! */
SemaphoreHandle_t xGuiSemaphore;/*********************** GUI_SHOW_CODE_START***********************/
lv_obj_t *label_1;
lv_obj_t *label_2;void Show_State()
{lv_obj_t *scr = lv_scr_act(); //创建scrlv_obj_set_pos(scr, 0, 0);lv_scr_load(scr);label_1 = lv_label_create(scr);                         //创建labellv_label_set_recolor(label_1, 1);                       //颜色可变换lv_label_set_long_mode(label_1, LV_LABEL_LONG_DOT);     //设置滚动模式lv_obj_set_pos(label_1, 10, 10);                        //设置位置lv_obj_set_size(label_1, 160, 30);                      //设定大小lv_label_set_text(label_1, "This is a GUI thread yes"); //设定文本内容label_2 = lv_label_create(scr);                            //创建labellv_label_set_recolor(label_2, 1);                          //颜色可变换lv_label_set_long_mode(label_2, LV_LABEL_LONG_SCROLL);     //设置滚动模式lv_obj_set_pos(label_2, 10, 40);                           //设置位置lv_obj_set_size(label_2, 160, 40);                         //设定大小lv_label_set_text(label_2, "This is the Intetnet thread"); //设定文本内容
}
/*********************** GUI_SHOW_CODE_END***********************/void guiTask1(void *pvParameter)
{(void)pvParameter;xGuiSemaphore = xSemaphoreCreateMutex();lv_init();/* Initialize SPI or I2C bus used by the drivers */lvgl_driver_init();lv_color_t *buf1 = heap_caps_malloc(DISP_BUF_SIZE * sizeof(lv_color_t), MALLOC_CAP_DMA);// memset(buf1,0x00ff,DISP_BUF_SIZE * sizeof(lv_color_t));assert(buf1 != NULL);/* Use double buffered when not working with monochrome displays */
#ifndef CONFIG_LV_TFT_DISPLAY_MONOCHROMElv_color_t *buf2 = heap_caps_malloc(DISP_BUF_SIZE * sizeof(lv_color_t), MALLOC_CAP_DMA);//memset(buf2,0x00ff,DISP_BUF_SIZE * sizeof(lv_color_t));assert(buf2 != NULL);
#elsestatic lv_color_t *buf2 = NULL;
#endifstatic lv_disp_draw_buf_t disp_buf;uint32_t size_in_px = DISP_BUF_SIZE;#if defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_IL3820 || defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_JD79653A || defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_UC8151D || defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SSD1306/* Actual size in pixels, not bytes. */size_in_px *= 8;
#endif/* Initialize the working buffer depending on the selected display.* NOTE: buf2 == NULL when using monochrome displays. */lv_disp_draw_buf_init(&disp_buf, buf1, buf2, size_in_px);lv_disp_drv_t disp_drv;lv_disp_drv_init(&disp_drv);disp_drv.hor_res = LV_HOR_RES_MAX;disp_drv.ver_res = LV_VER_RES_MAX;disp_drv.flush_cb = disp_driver_flush;disp_drv.draw_buf = &disp_buf;lv_disp_drv_register(&disp_drv);/* Register an input device when enabled on the menuconfig */
#if CONFIG_LV_TOUCH_CONTROLLER != TOUCH_CONTROLLER_NONElv_indev_drv_t indev_drv;lv_indev_drv_init(&indev_drv);indev_drv.read_cb = touch_driver_read;indev_drv.type = LV_INDEV_TYPE_POINTER;lv_indev_drv_register(&indev_drv);
#endif/* Create and start a periodic timer interrupt to call lv_tick_inc */const esp_timer_create_args_t periodic_timer_args = {.callback = &lv_tick_task,.name = "periodic_gui"};esp_timer_handle_t periodic_timer;ESP_ERROR_CHECK(esp_timer_create(&periodic_timer_args, &periodic_timer));ESP_ERROR_CHECK(esp_timer_start_periodic(periodic_timer, LV_TICK_PERIOD_MS * 1000));Show_State();// lv_demo_music();// lv_demo_benchmark();// lv_demo_widgets();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_task_handler();xSemaphoreGive(xGuiSemaphore);}}/* A task should NEVER return */free(buf1);
#ifndef CONFIG_LV_TFT_DISPLAY_MONOCHROMEfree(buf2);
#endifvTaskDelete(NULL);
}

blink.c

/* Blink ExampleThis example code is in the Public Domain (or CC0 licensed, at your option.)Unless required by applicable law or agreed to in writing, thissoftware is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES ORCONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "sdkconfig.h"#include "lvgl_init.h"/* Can use project configuration menu (idf.py menuconfig) to choose the GPIO to blink,or you can edit the following line and set a number here.
*/
#define BLINK_GPIO CONFIG_BLINK_GPIO
extern void guiTask1(void *pvParameter);void app_main(void)
{/* Configure the IOMUX register for pad BLINK_GPIO (some pads aremuxed to GPIO on reset already, but some default to otherfunctions and need to be switched to GPIO. Consult theTechnical Reference for a list of pads and their defaultfunctions.)*/xTaskCreatePinnedToCore(guiTask1, "gui", 4096 * 2, NULL, 1, NULL, 1);gpio_reset_pin(BLINK_GPIO);/* Set the GPIO as a push/pull output */gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);while (1){/* Blink off (output low) */printf("Turning off the LED\n");gpio_set_level(BLINK_GPIO, 0);vTaskDelay(1000 / portTICK_PERIOD_MS);/* Blink on (output high) */printf("Turning on the LED\n");gpio_set_level(BLINK_GPIO, 1);vTaskDelay(1000 / portTICK_PERIOD_MS);}
}

编译烧录,看看结果

出现了乱码,花屏!!!

五、乱码,花屏,颜色不对解决方法

如果出现乱码,花屏,颜色不对,不要慌,
乱码,花屏:一般是屏幕的驱动问题
颜色不对:一般是颜色反转问题,在IDF设置中可以进行设置,前面有说到

说回来我这个花屏的问题:
我使用的是AT7735S-1.44寸的显示屏

这时候就正常了输出了

下一篇说一下怎么移植效果例程!

1.ESP32c3 移植lvgl核心组件教程相关推荐

  1. arduino tft 方向_ESP32在Arduino环境下玩转 LVGL,ESP32移植LVGL详细教程

    微信关注 "DLGG创客DIY"设为"星标",重磅干货,第一时间送达. ❝ 转载自慕容流年 https://me.csdn.net/qq_41868901 ❞ ...

  2. 乐鑫ESP32移植LVGL 7.10

    零. 声明 本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下: 第一篇:ESP-IDF基本介绍,主要会涉及模组,芯片,开发板的介绍,环境搭建,程序编译下载,启动流程等一些基本的操作,让你对 ...

  3. linux笔记(8):东山哪吒D1H移植lvgl(HDMI输出)

    文章目录 1. 下载,修改,编译源码 1.1下载源码 1.1.1新建一个`lvgl`目录,在该目录下下载源码 1.1.2 在`lvgl`目录下再建一个`myspace/lvgl_demo`目录,把参与 ...

  4. UEFI移植LVGL

    自己组装过游戏主机的应该都有看到过,进入BIOS设置,酷炫的界面便呈现在眼前,而很多BIOS,使用的还是标准的界面.现在有个趋势,phoenix和insyde也在慢慢朝这种GUI界面发展,而AMI的使 ...

  5. MCUXpresso开发NXP RT1060(3)——移植LVGL到NXP RT1060

    目录 开发环境 目录 一.开发环境 二.准备工作 三.移植步骤 1.修改lv_conf.h 2.显示功能移植 3.触摸功能移植 4.tick及timer 四.结果展示 五.参考资料 一.开发环境 1. ...

  6. 我的世界html导入整合包教程,我的世界Windows整合包移植到Mac教程

    我的世界Windows整合包移植到Mac教程,游戏狗小编下面为大家带来如何将我的世界Windows整合包移植到Mac的方法介绍,感兴趣的一起来看看我的世界Windows整合包移植到Mac教程. 1.启 ...

  7. IMX6ULL移植LVGL

    IMX6ULL移植LVGL 话不多说,直接开干!!! 1.移植准备 1.1.源码克隆 文件名 克隆命令 描述 lvgl git clone https://github.com/lvgl/lvgl.g ...

  8. STM32移植LVGL(LittleVGL)

    STM32移植LVGL(LittleVGL) 一.什么是LVGL https://lvgl.io/ 这是LVGL的官网, http://lvgl.100ask.org/8.2/intro/index. ...

  9. STM32移植LVGL+旋转编码器接口对接

    写在前面:本菜鸟结合了许多大佬的文章,成功实现了基于LVGL的GUI设计,小开心~浅浅记录一下!~ 本文以单片机STM32F103VET6为核心,利用ST7796芯片驱动分辨率为480*320的LCD ...

  10. 【LVGL】学习笔记--(1)Keil中嵌入式系统移植LVGL

    一 LVGL简介 最近emwin用的比较烦躁,同时被LVGL酷炫的界面吸引到了,所以准备换用LVGL试试水. LVGL(轻量级和通用图形库)是一个免费和开源的图形库,它提供了创建嵌入式GUI所需的一切 ...

最新文章

  1. Existing Linux Wireless drivers
  2. 空间离散点拟合成空间平面
  3. 一轮项目冲刺——移山小分队(2)
  4. Shell(2)——shell里面的变量
  5. Python3 isspace()方法
  6. 查看.Net Framework版本的方法
  7. 搜索推荐项目EFLS开源 | 阿里妈妈联邦学习解决方案详解
  8. oracle企业版配置,在 Oracle 数据库 11
  9. 小学四年级计算机在线考试,四年级信息技术试卷一.doc
  10. 章节3.4----队列的实现与应用
  11. java error_java基础:Error和Exception
  12. 随机生成爆破密码字典.txt
  13. 2018年度最佳网页设计与开发教程
  14. ping 查看IP——MAC——计算机名
  15. Android实战开发-Kotlin教程(组件篇 2.2)
  16. PB语言实现反射机制
  17. 思科路由器的基本配置
  18. 后端程序员看前端想死(二)进入页面之后js分析
  19. 互联网二次造富:从技术公司到运营平台的蜕变
  20. 居然能查看微信访客记录,这款神器牛逼了。

热门文章

  1. SHELL编程命令大全
  2. linux_安装_SecureCRT下载安装登陆ubuntu配色和文件传输
  3. 高德地图语音助手实测:驾车导航基本实现动口不动手
  4. 飞客蠕虫病毒的介绍与处理办法
  5. 16S多样性组成谱研究,9.13分的Water Research轻松二连发!
  6. 开源编解码项目FFmpeg迎来20周年生日 凭一己之力养活全球无数播放器!
  7. 计算机二级vfp考试怎么学,计算机二级VFP考试基础教程(7)
  8. Tapestry5项目的导入
  9. 气象要素色斑图的配色
  10. ios开发之商城类软件 - 框架构思