首页 > 其他分享 >ESP32-LVGL驱动框架

ESP32-LVGL驱动框架

时间:2024-10-30 20:09:08浏览次数:1  
标签:handle 框架 esp ESP32 ESP lcd io LVGL panel

问题背景

最近在调试一个新屏幕的过程中,使用LVGL官方的lvgl_esp32_driver驱动,在我这个分辨率比较大(454 x 454)的屏幕下会出现,在分配完成buff后,若buff过大会出现,在刷屏的时候会这种警告。

txdata transfer > hardware max supported len

研究了底层代码后发现在spi_master.c文件中,在发送大量数据queue中,会检测一下相关参数。
image.png

查看一下这个宏SPI_LL_DMA_MAX_BIT_LEN
image.png

[!注意]
这里注意下,这个宏在不同芯片中,体现的是不同的,在esp32s3中是1<<18 ,在esp32中却是1<<24。

这时看下官方的这里的驱动接口:
image.png

只调用了一次,所以会将buff中的数据一次性全部发送出去, 官方推荐buff为:分辨率宽 x 高 x 1/10 。
约为 454 x 45 x 8 x 2 = 326880。(16bit 像素色彩)
1 << 18 = 262144
远大于判断,所以无法正常刷屏。

如何解决这个问题呢,解决方法很简单那就是分包。把一打包数据分几次发送就可以了。其实esp32官方是对这个问题有一套很好的解决方法。并归入了官方SDK的esp_lcd中,我们只需要根据官方架构编写一套即可。

ESP32_LCD使用

首先官方例程下相关示例,可以在examples/peripherals/lcd/找到。
更多的驱动程序可以通过乐鑫组件注册表 获取。
这里我复制一套驱动(GC9A01)并且修改一下初始化代码既可以改写完成。下面介绍一下如何正确的调用。
image.png

  • 头文件
#include "esp_lcd_rm69330.h" // 自定义的驱动文件

#include "esp_lcd_panel_io.h"

#include "esp_lcd_panel_vendor.h"

#include "esp_lcd_panel_ops.h"
  • 设备初始化
ESP_LOGI(TAG, "Initialize SPI bus");

spi_bus_config_t buscfg = {

	.sclk_io_num = LV_PIN_NUM_LCD_CLK,

	.mosi_io_num = LV_PIN_NUM_LCD_MOSI,

	.miso_io_num = LV_PIN_NUM_LCD_MISO,

	.quadwp_io_num = -1,

	.quadhd_io_num = -1,

	.max_transfer_sz = SPI_BUS_MAX_TRANSFER_SZ,

};

ESP_ERROR_CHECK(spi_bus_initialize(SPI_LCD_HOST, &buscfg, SPI_DMA_CH_AUTO));



ESP_LOGI(TAG, "Install panel IO");

esp_lcd_panel_io_handle_t io_handle = NULL;

esp_lcd_panel_io_spi_config_t io_config = {

	.dc_gpio_num = LV_PIN_NUM_LCD_DC,

	.cs_gpio_num = LV_PIN_NUM_LCD_CS,

	.pclk_hz = SPI_TFT_CLOCK_SPEED_HZ,

	.lcd_cmd_bits = 8,

	.lcd_param_bits = 8,

	.spi_mode = 0,

	.trans_queue_depth = SPI_TRANSACTION_POOL_SIZE,

	.on_color_trans_done = notify_refresh_ready,

	.user_ctx = &disp_drv,

};



// Attach the LCD to the SPI bus

ESP_ERROR_CHECK(esp_lcd_new_panel_io_spi((esp_lcd_spi_bus_handle_t)SPI_LCD_HOST, &io_config, &io_handle));



esp_lcd_panel_dev_config_t panel_config = {

	.reset_gpio_num = LV_PIN_NUM_LCD_RST,

	.color_space = ESP_LCD_COLOR_SPACE_BGR,

	.bits_per_pixel = 16,

};



ESP_LOGI(TAG, "Install RM69330 panel driver");

ESP_ERROR_CHECK(esp_lcd_new_panel_rm69330(io_handle, &panel_config, &panel_handle));



ESP_ERROR_CHECK(esp_lcd_panel_reset(panel_handle));

ESP_ERROR_CHECK(esp_lcd_panel_init(panel_handle));



ESP_ERROR_CHECK(esp_lcd_panel_invert_color(panel_handle, false));

ESP_ERROR_CHECK(esp_lcd_panel_mirror(panel_handle, true, true));

ESP_ERROR_CHECK(esp_lcd_panel_set_gap(panel_handle, 14, 0));

// user can flush pre-defined pattern to the screen before we turn on the screen or backlight

ESP_ERROR_CHECK(esp_lcd_panel_disp_on_off(panel_handle, true));

其中:

  • SPI_BUS_MAX_TRANSFER_SZ : 我直接设置为最大 (1<<18)
  • SPI_TRANSACTION_POOL_SIZE : 50
IRAM_ATTR static bool notify_refresh_ready(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_io_event_data_t *edata, void *user_ctx)

{

    lv_disp_drv_t *disp_driver = (lv_disp_drv_t *)user_ctx;

    lv_disp_flush_ready(disp_driver);

    return false;

}
  • LVGL初始化步骤省略
    flush_cb:
static void lvgl_flush_cb(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map)

{

    esp_lcd_panel_handle_t panel_handle = (esp_lcd_panel_handle_t) drv->user_data;

    int offsetx1 = area->x1;

    int offsetx2 = area->x2;

    int offsety1 = area->y1;

    int offsety2 = area->y2;

    // copy a buffer's content to a specific area of the display

    esp_lcd_panel_draw_bitmap(panel_handle, offsetx1, offsety1, offsetx2 + 1, offsety2 + 1, color_map);

}

标签:handle,框架,esp,ESP32,ESP,lcd,io,LVGL,panel
From: https://www.cnblogs.com/tangwc/p/18516530

相关文章

  • Java 集合框架是什么?集合框架的优点有哪些?
    目录1.Java集合框架的概念2.集合类3. Java在后续的版本中做了进一步的增强4.集合框架的优点1.Java集合框架的概念        Java集合框架(JavaCollectionsFramework,JCF)是Java中一个用于存储和处理对象集合的统一架构。它提供了一系列的接口和类,这些接口和......
  • Java集合框架中的泛型有什么优点?
    目录1.泛型的基本概念1.1什么是泛型1.2泛型与非泛型代码的比较2.使用泛型的优点2.1类型安全2.2 消除类型转换2.3使代码更整洁1.泛型的基本概念1.1什么是泛型        泛型是Java语言中一种支持类型参数化的技术,它允许在编译时提供类型信息,从而使得......
  • Java 集合框架的基础接口有哪些?
    目录1.Collection:集合的基础应用场景2.List:有序集合应用场景3.Set:不重复集合应用场景4.Map:键值对集合应用场景5.拓展知识:性能考量6.结语        Java集合框架(JavaCollectionsFramework,JCF)是Java编程语言的核心部分,提供了一套用于存储和处理对象......
  • Java使用apache.commons.io框架下的FileUtils类实现文件的写入、读取、复制、删除
    ApacheCommonsIO是Apache开源基金组织提供的一组有关IO(Input/Output)操作的小框架,它是ApacheCommons项目的一部分,专注于提供简单易用的API,用于处理输入和输出操作。ApacheCommonsIO是一个功能强大的JavaIO工具库,提供了丰富的API来简化文件和流的操作。通过使用......
  • 又一本让人醍醐灌顶的好书《架构探险:从零开始写Java Web框架》
    我最初是在《码农翻身2》上了解到《架构探险:从零开始写JavaWeb框架》这本书的,刘伟老师在书中提到,这本书在他早期学习时对他帮助很大。因此,我也购买了这本书来学习。 这本书主要介绍了如何自己编写一个Web框架,使其达到类似于简化版Spring的效果。作者尽量使用基础工具包,并以通......
  • 后台管理系统的通用权限解决方案(八)认证机制介绍、JWT介绍与jjwt框架的使用
    文章目录1认证机制介绍1.1HTTPBasicAuth1.2Cookie-SessionAuth1.3OAuth1.4TokenAuth2JWT2.1JWT介绍2.2JWT的数据结构2.2.1JWT头2.2.2JWT有效载荷2.2.3JWT签名3jjwt3.1jjwt介绍3.2jjwt案例1认证机制介绍1.1HTTPBasicAuthHTTPBasicAuth......
  • SpringBoot框架:毕业生招聘市场的革新
    摘要随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。毕业生信息招聘平台,主要的模块包括查看管理员;首页、个人中心、企业管理、空中宣讲会管理、招聘岗位管理、毕业生管理、个人简历管理、求职信息管理、信息......
  • SpringBoot框架:闲一品交易平台的创新驱动
    第4章系统设计4.1系统体系结构闲一品交易平台的结构图4-1所示:图4-1系统结构登录系统结构图,如图4-2所示:图4-2登录结构图闲一品交易平台结构图,如图4-3所示。图4-3闲一品交易平台结构图4.2开发流程设计系统流程的分析是通过调查系统所涉及问题的识别、可行性......
  • 闲一品交易:SpringBoot框架的高效解决方案
    第4章系统设计4.1系统体系结构闲一品交易平台的结构图4-1所示:图4-1系统结构登录系统结构图,如图4-2所示:图4-2登录结构图闲一品交易平台结构图,如图4-3所示。图4-3闲一品交易平台结构图4.2开发流程设计系统流程的分析是通过调查系统所涉及问题的识别、可行性......
  • 前端又出新框架了,你还学得动吗?
    最近前端又出来一个新框架/库,名为nue.js。一周前的9.13号提交了第一个commit,到今天已超过2000个star。翻译一下:Nue是一个强大的React、Vue、Next.js、Vite和Astro替代品。它可能会改变您的web开发方式。WhatisNueJS?NueJS是一个非常小的(压缩后2.3kb)JavaScri......