首页 > 其他分享 >esp32_lvgl_driver小缺陷

esp32_lvgl_driver小缺陷

时间:2024-10-14 21:33:26浏览次数:6  
标签:handle esp esp32 ESP driver 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,driver,lcd,io,lvgl,panel
From: https://www.cnblogs.com/tangwc/p/18466199

相关文章

  • 基于乐鑫 ESP32-C3 的 Matter Light 实践
    背景介绍最近公司在研究Matter协议在智能家居领域的市场机会,考虑到易用性和文档支撑等方面,相比较Telink,产品部门对乐鑫的Matter-SDK更感兴趣,因而开展了一些测试工作,毕竟实践出真知嘛。......
  • 【ESP32】ESP32系列选型
    1.ESP32-P1.1ESP32-P4(32bitRISC-VMCU)ESP32-P4搭载双核RISC-V处理器,拥有AI指令扩展、先进的内存子系统,并集成高速外设。ESP32-P4专为高性能和高安全的应用设计,充分满足下一代嵌入式应用对人机界面支持、边缘计算能力和IO连接特性等方面提出的更高需求。性能ESP32......
  • the installation and usage of the dev environment of esp32
    theinstallationofthedevenvironmentofesp32someconditionusevscodesimplestepschoosethepulginsofidfthendownloadthepulginsandenterthemainpagechoosethefistchoicethenyouchoosethebersionofidfandthepathofitwaitpat......
  • STM32与ESP32串口数据发送以及网页端数据实时显示和远程遥控
    目标:实现网页端速度实时显示以及可以通过点击页面按键达到对小车的位移方位控制。一、ESP32代码首先,需要让ESP32连接到WiFi,这样才能为后续的操作做准备。ssid="xxxxxx"password="xxxxxx"#WIFI连接defwifi_connect():wlan=network.WLAN(network.STA_IF)#STA模式......
  • idea数据库图形化窗口连接数据库报错:Driver class ‘com.mysql.cj.jdbc.Driver‘ not
    报错信息在idea中数据库图形化窗口中,创建下图数据库连接点击测试连接后,发生报错:Driverclass'com.mysql.cj.jdbc.Driver'notfoundNodriverfilesprovided.报错界面:原因出现此错误的原因通常是数据库驱动程序尚未下载或未正确配置到IDEA中。解决方案......
  • ESP32移植Openharmony设备开发---(1)环境搭建
    第一章环境搭建1.下载ubuntu创建虚拟机内存分配建议8G硬盘大于200G                                                                下载ubuntu20.04复制特征码打开迅雷即可下载5F5E8848426......
  • ESP32移植Openharmony设备开发---(3)任务调度
    任务调度官方文档:OpenAtomOpenHarmony基本概念从系统角度看,任务是竞争系统资源的最小运行单元。任务可以使用或等待CPU、使用内存空间等系统资源,各任务的运行相互独立。OpenHarmonyLiteOS-M的任务模块可以给用户提供多个任务,实现任务间的切换,帮助用户管理业务程序流程。......
  • 【学习记录丨UVM】1.2驱动器driver(1)——最简单的driver及其实例化
    《UVM白皮书》关于driver的介绍一、只有driver——最简单的验证平台UVM是一个库,其中的driver等组件都是派生(extends)自UVM库中的类(class)。类中通过function和task实现组件功能。UVM常用类及树形结构_uvm树-CSDN博客 下边这张图展示了UVM常用的类之间的派生关系。可......
  • #HACKTHEBOX——Driver
    靶机详情靶机地址:10.10.11.106kali地址:10.10.16.4初始侦察与渗透确认kali与靶机之间可以ping通使用nmap进行侦查扫描nmap-sT--min-rate1000-p-10.10.11.106 #以TCP协议,基于当前网络情况,以最低1000的速率进行该IP的全部端口nmap-sT-sC-sV-p80,135,445,598......
  • 【花雕学编程】Arduino动手做(232)---ESP32-S3 CAM使用joystick双轴摇杆模块控制LED灯
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来——小小的......