ESP32 IDF LVGL 1.47寸圆角屏幕测试
前言
基于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寸圆角屏幕测试相关推荐
- esp32系列(11):ESP32 IDF平台 mpu6050 DMP 驱动移植及测试上位机开发
目录 1 DMP 官方库介绍 1.1 DMP与MPL(Motion Processing Libraries)功能 1.2 运行MPL的硬件要求 1.3 Motion Driver 6.12 的架构 ...
- [GUI] ESP32(idf)驱动3.5寸SPI-TFT屏移植LittleVGL
一.展示成果 博客上传图片限制在5M内,视频转 GIF 帧率压缩太严重了,还得再次压缩才小于5M,效果完全失真了 小伙伴们有什么好的工具或方法解决吗 gif 图上应该看不出什么区别.但是ESP32 用 ...
- arduino tft 方向_ESP32在Arduino环境下玩转 LVGL,ESP32移植LVGL详细教程
微信关注 "DLGG创客DIY"设为"星标",重磅干货,第一时间送达. ❝ 转载自慕容流年 https://me.csdn.net/qq_41868901 ❞ ...
- ESP32 IDF LVGL8.0 flash 外部字库显示 中文显示
我从stm32一路学到esp32,发现这款芯片挺好玩的,主要是还是stm32太贵了,stm32主要是很多坑有人遇到了,并给出了解决方法,esp32这方面就少点,有时候找不到的,只能靠自己了. 本文使用 ...
- 物联网开发笔记(48)- 使用Micropython开发ESP32开发板之控制OLED ssd1306屏幕
一.目的 这一节我们学习如何使用我们的ESP32开发板来控制OLED ssd1306屏幕,此处使用的是I2C协议,大家可自行百度学习一下I2C. 二.环境 ESP32 + OLED ssd1306屏幕 ...
- 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液 ...
- 使用micropython(ESP8266、ESP32)驱动SES 2.66寸墨水屏显示中文
由于需要做一些低功耗的东西,所以最近在尝试玩墨水屏.出于成本考虑(没钱的另一种委婉说法)从咸鱼淘到2块便宜的二手SES 2.66寸三色墨水屏,并使用micropython将其驱动起来,并用字库的方法显 ...
- LVGL学习之初始化和屏幕旋转
背景 手里有一块ESP32-S2-HMI-DevKit-1开发板,是乐鑫基于ESP32-S2模组开发的HMI人机交互方案开发板: 一边学习ESP32开发的过程中,也顺带学习一下LVGL图形库: 遇到的 ...
- 小米电视3 android,小米3代/小米电视今日发布!-小米3代,5寸,1080p,Tegra 4,骁龙800,小米电视,47寸, ——快科技(驱动之家旗下媒体)--科技改变未来...
传了许久的小米3代将会在今天下午两点正式跟大家见面. 从目前曝光的情况来看,小米3代的外形十分方正,并且机身有多个色彩版本,外观设计与诺基亚Lumia系列风格很相似,其会有两个版本,而它们配备的都是5 ...
最新文章
- LTE PUCCH Format1
- PrestaShop 网站后台配置(三)
- 论文|记忆网络之Memory Networks
- 微服务架构(一):什么是微服务
- Maven-学习笔记04【基础-Maven生命周期和概念模型图】
- MySQL分区:range(范围)list(in)columns(多字段)hash(散列)key(非数值型的hash)复合(hash key)
- c++中union的使用,看高手们如何解释的
- Bellman-Ford算法和SPFA算法
- Java 总结equals()方法
- 【点阵液晶编程连载五】液晶驱动代码的移植
- C++11 多线程线程共享数据
- 【树形dp 题解】 洛谷P3174 毛毛虫
- 【学习】FaceForensics++: Learning to Detect Manipulated Facial Images
- Full CAN与Basic CAN主要区别
- php踩过的那些坑(2) strpos引发的血案
- python中,获取设备网卡接口(ethx, mgmt)
- 《Microduino实战》——1.1 什么是开源
- Centos安装python3并设为默认
- ViSual Studio美化插件设置背景图片
- 尼康单反AF自动对焦模式与AF区域对焦模式详解