前言

基于ESP32 IDF框架移植的LVGL,IDF版本为4.3.1,LVGL版本为8.1.1。屏幕为中景园的1.47寸172x320分辨率的圆角IPS,驱动芯片为st7789v3。

B站视频效果:

https://www.bilibili.com/video/BV1VP4y137K1?spm_id_from=333.999.0.0https://www.bilibili.com/video/BV1VP4y137K1?spm_id_from=333.999.0.0

在lvgl_esp32_drivers文件夹下,有个lvgl_tft文件夹,其中找到st7789.c、st7789.h驱动文件。修改屏幕起始像素偏移量offsety1、offsety2,即加上34。

void st7789_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map)
{uint8_t data[4] = {0};uint16_t offsetx1 = area->x1;uint16_t offsetx2 = area->x2;uint16_t offsety1 = area->y1;uint16_t offsety2 = area->y2;offsety1 += 34;offsety2 += 34;#if (CONFIG_LV_TFT_DISPLAY_OFFSETS)offsetx1 += CONFIG_LV_TFT_DISPLAY_X_OFFSET;offsetx2 += CONFIG_LV_TFT_DISPLAY_X_OFFSET;offsety1 += CONFIG_LV_TFT_DISPLAY_Y_OFFSET;offsety2 += CONFIG_LV_TFT_DISPLAY_Y_OFFSET;#elif (LV_HOR_RES_MAX == 240) && (LV_VER_RES_MAX == 240)
#if (CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT)offsetx1 += 80;offsetx2 += 80;
#elif (CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED)offsety1 += 80;offsety2 += 80;
#endif
#endif/*Column addresses*/st7789_send_cmd(ST7789_CASET);data[0] = (offsetx1 >> 8) & 0xFF;data[1] = offsetx1 & 0xFF;data[2] = (offsetx2 >> 8) & 0xFF;data[3] = offsetx2 & 0xFF;st7789_send_data(data, 4);/*Page addresses*/st7789_send_cmd(ST7789_RASET);data[0] = (offsety1 >> 8) & 0xFF;data[1] = offsety1 & 0xFF;data[2] = (offsety2 >> 8) & 0xFF;data[3] = offsety2 & 0xFF;st7789_send_data(data, 4);/*Memory write*/st7789_send_cmd(ST7789_RAMWR);size_t size = (size_t)lv_area_get_width(area) * (size_t)lv_area_get_height(area);st7789_send_color((void*)color_map, size * 2);
}

同样在lvgl_esp32_drivers文件夹下找到lvgl_helpers.h文件,增加两个屏幕横向和纵向最大值宏定义。

#define LV_HOR_RES_MAX  320
#define LV_VER_RES_MAX  172

同时在下面的条件编译选项中修改一下DISP_BUF_SIZE。

#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 * LV_VER_RES_MAX)
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7735S
#define DISP_BUF_SIZE  (LV_HOR_RES_MAX * 40)
#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)
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SH1107
#define DISP_BUF_SIZE  (LV_HOR_RES_MAX * LV_VER_RES_MAX)
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9481
#define DISP_BUF_SIZE  (LV_HOR_RES_MAX * 40)
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9486
#define DISP_BUF_SIZE  (LV_HOR_RES_MAX * 40)
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9488
#define DISP_BUF_SIZE  (LV_HOR_RES_MAX * 40)
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9341
#define DISP_BUF_SIZE  (LV_HOR_RES_MAX * 40)
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SSD1306
#if defined (CONFIG_LV_THEME_MONO)
#define DISP_BUF_SIZE  (LV_HOR_RES_MAX * (LV_VER_RES_MAX / 8))
#else
#define DISP_BUF_SIZE  (LV_HOR_RES_MAX * LV_VER_RES_MAX)
#endif
#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X)
#define DISP_BUF_LINES  40
#define DISP_BUF_SIZE  (LV_HOR_RES_MAX * DISP_BUF_LINES)
#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_IL3820)
#define DISP_BUF_SIZE (LV_VER_RES_MAX * IL3820_COLUMNS)
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_RA8875
#define DISP_BUF_SIZE  (LV_HOR_RES_MAX * 40)
#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_GC9A01)
#define DISP_BUF_SIZE  (LV_HOR_RES_MAX * 40)
#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_JD79653A)
#define DISP_BUF_SIZE ((LV_VER_RES_MAX * LV_VER_RES_MAX) / 8) // 5KB
#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_UC8151D)
#define DISP_BUF_SIZE ((LV_VER_RES_MAX * LV_VER_RES_MAX) / 8) // 2888 bytes
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9163C
#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40)
#else
#error "No display controller selected"
#endif
#endif

同样在lvgl_esp32_drivers文件夹下找到lvgl_spi_conf.h文件,修改一下SPI模式。

#if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7789)
#define SPI_TFT_SPI_MODE    (3)
#else
#define SPI_TFT_SPI_MODE    (0)
#endif

接下来配置LVGL。

在主函数中添加lv_demo_music()例程。

#include <stdio.h>#include "freertos/FreeRTOS.h"
#include "freertos/event_groups.h"
#include "freertos/semphr.h"
#include "esp_system.h"
#include "esp_freertos_hooks.h"
#include "lvgl.h"
#include "lvgl_helpers.h"#include "arc.h"
#include "bar.h"
#include "lv_examples/src/lv_demo_music/lv_demo_music.h"void lv_tick_task(void *arg);
static void guiTask(void *pvParameter);SemaphoreHandle_t xGuiSemaphore;static void guiTask(void *pvParameter)
{(void) pvParameter;xGuiSemaphore = xSemaphoreCreateMutex();lv_init();lvgl_driver_init();lv_color_t* buf1 = heap_caps_malloc(DISP_BUF_SIZE * sizeof(lv_color_t), MALLOC_CAP_DMA);assert(buf1 != NULL);lv_color_t *buf2 = heap_caps_malloc(DISP_BUF_SIZE * sizeof(lv_color_t), MALLOC_CAP_DMA);assert(buf2 != NULL);static lv_disp_draw_buf_t disp_buf;uint32_t size_in_px = DISP_BUF_SIZE;lv_disp_draw_buf_init(&disp_buf, buf1, buf2, size_in_px);static lv_disp_drv_t disp_drv;lv_disp_drv_init(&disp_drv);disp_drv.flush_cb = disp_driver_flush;disp_drv.hor_res = 320;disp_drv.ver_res = 172;disp_drv.draw_buf = &disp_buf;lv_disp_drv_register(&disp_drv);esp_register_freertos_tick_hook((void *)lv_tick_task);/* Create the demo application *///arc_demo_test();//bar_demo_test();lv_demo_music();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);free(buf2);vTaskDelete(NULL);
}void app_main(void)
{xTaskCreatePinnedToCore(guiTask, "gui", 4096 * 4, NULL, 0, NULL, 1);
}void lv_tick_task(void *arg)
{(void)arg;lv_tick_inc(portTICK_PERIOD_MS);
}

详细的移植教程请移步B站专栏!

ESP32 IDF LVGL 1.47寸圆角屏幕测试相关推荐

  1. esp32系列(11):ESP32 IDF平台 mpu6050 DMP 驱动移植及测试上位机开发

    目录 1 DMP 官方库介绍 1.1 DMP与MPL(Motion Processing Libraries)功能 1.2 运行MPL的硬件要求 1.3 Motion Driver 6.12 的架构 ...

  2. [GUI] ESP32(idf)驱动3.5寸SPI-TFT屏移植LittleVGL

    一.展示成果 博客上传图片限制在5M内,视频转 GIF 帧率压缩太严重了,还得再次压缩才小于5M,效果完全失真了 小伙伴们有什么好的工具或方法解决吗 gif 图上应该看不出什么区别.但是ESP32 用 ...

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

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

  4. ESP32 IDF LVGL8.0 flash 外部字库显示 中文显示

    我从stm32一路学到esp32,发现这款芯片挺好玩的,主要是还是stm32太贵了,stm32主要是很多坑有人遇到了,并给出了解决方法,esp32这方面就少点,有时候找不到的,只能靠自己了. 本文使用 ...

  5. 物联网开发笔记(48)- 使用Micropython开发ESP32开发板之控制OLED ssd1306屏幕

    一.目的 这一节我们学习如何使用我们的ESP32开发板来控制OLED ssd1306屏幕,此处使用的是I2C协议,大家可自行百度学习一下I2C. 二.环境 ESP32 + OLED ssd1306屏幕 ...

  6. STM32(基于HAL库)驱动0.96寸OLED屏幕(四脚且中英文皆可显示)

    STM32驱动0.96寸OLED屏幕(四脚) 1 注意事项 2 如何利用STM32单片机驱动12864液晶屏 2.1*基本配置* 2.2 *0.96寸OLED端口含义* 2.3 *0.96寸OLED液 ...

  7. 使用micropython(ESP8266、ESP32)驱动SES 2.66寸墨水屏显示中文

    由于需要做一些低功耗的东西,所以最近在尝试玩墨水屏.出于成本考虑(没钱的另一种委婉说法)从咸鱼淘到2块便宜的二手SES 2.66寸三色墨水屏,并使用micropython将其驱动起来,并用字库的方法显 ...

  8. LVGL学习之初始化和屏幕旋转

    背景 手里有一块ESP32-S2-HMI-DevKit-1开发板,是乐鑫基于ESP32-S2模组开发的HMI人机交互方案开发板: 一边学习ESP32开发的过程中,也顺带学习一下LVGL图形库: 遇到的 ...

  9. 小米电视3 android,小米3代/小米电视今日发布!-小米3代,5寸,1080p,Tegra 4,骁龙800,小米电视,47寸, ——快科技(驱动之家旗下媒体)--科技改变未来...

    传了许久的小米3代将会在今天下午两点正式跟大家见面. 从目前曝光的情况来看,小米3代的外形十分方正,并且机身有多个色彩版本,外观设计与诺基亚Lumia系列风格很相似,其会有两个版本,而它们配备的都是5 ...

最新文章

  1. 《JavaScript面向对象精要》——1.8 原始封装类型
  2. python3.6.5安装教程-Centos7 安装Python3.6.5步骤
  3. 如何恢复默认域策略和默认域控制器策略
  4. Java(静态)变量和(静态)代码块的执行顺序
  5. Java黑皮书课后题第3章:*3.13(金融应用:计算税款)程序清单3-5给出了计算单身登记人税款的源代码。将程序清单3-5补充完整,从而计算所有登记的婚姻状态的税款
  6. Java中的24种设计模式与7大原则
  7. 支付宝小程序-点击退出小程序
  8. C++ const型成员函数与 non-const型成员函数
  9. netty之管道处理流程
  10. Linux 系统使用WordPress开启“固定链接设置”之后部分页面打不开(404)的解决办法...
  11. python正则表达式 多个条件的匹配
  12. Nagios插件开发指导
  13. python提取图片中的曲线_如何从fits图像中提取点扩散函数?
  14. Guava---Splitter
  15. 程序员的三十五岁危机
  16. Local Storage、Session Storage、Cookies
  17. 我使用Feign上传文件踩的坑,MultipartFile文件死活传不过去
  18. VN-SGG JavaScript 基础(中)
  19. python文件处理,去除内含子,拼接外显子
  20. IP地址与int整数的转换

热门文章

  1. ISME Commun:RNA-seq助力发现菌群收敛新机制
  2. 模块一:Go语言基础知识 -01 | 工作区和GOPATH
  3. 关于统一模型法线的方法(如果模型法线不统一,断开的,那么顶点动画会让模型破面)
  4. 与人体共鸣的音乐才能称之为好音乐
  5. SpringMvc宠物用品交易平台
  6. 厉害了,现在用模拟器在电脑上玩刺激战场国际服可以匹配手机了?
  7. 学习Python过程中的一些记录,慢慢更新中,希望能坚持下去~
  8. hdu1709 the blance
  9. 笔记本电脑硬盘不见了_为什么电脑的机械硬盘突然不见了?
  10. 蓝牙传输 LE Audio技术