ESP32-LVGL驱动框架

news/2025/1/18 5:07:44/文章来源:https://www.cnblogs.com/tangwc/p/18516530

问题背景

最近在调试一个新屏幕的过程中,使用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 busESP_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 backlightESP_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);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/824334.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

goland 把多个项目窗口合并到一个窗口

有时我们可能想把goland 每个项目窗口合并到一个窗口,每个项目以一个tab的形式展示,下面是合并的方法 点击「Window->Merge All Project Windows」即可

Word_共享编辑

打开链接 ? 点击右上角的"登录"点"编辑"→点"在桌面版中打开"共享编辑 ok

手把手教你如何下载中国大学mooc慕课上已关闭的视频课程和课件资料

随着线上教育的普及,越来越多的大学开始提供线上教育,以方便学生的在线学习。然而,有些课程在结束后就会被关闭,导致学生无法再次观看。如果你想下载这些已经关闭的视频课程,该怎么办呢?其实我们可以通过一些工具来下载这些已关闭的课程。这里以中国大学Mooc网站为例,教…

汉文博士新增《通用规范汉字表》等多个字表

汉文博士的字表可以用于在部首、构型、粤拼和拼音检索中突出显示或筛选汉字。 今天将之前上传的字表全部重新生成了一遍,在词典管理界面双击字表可查看字表内含的汉字数量。 另外,还新增了如下字表:现代汉语通用字表 现代汉语常用字表 通用规范汉字表 台湾“常用国字”标准字…

Normalized Mutual Information(NMI, 归一化互信息)

Normalized Mutual Information(NMI, 归一化互信息)值域是 $[0,1]$,值越高表示两个聚类结果越相似。归一化是指将两个聚类结果的相似性值定量到 $0\sim 1$ 之间。$$ \text{NMI}=\frac{2\sum_i\sum_jn_{ij}ln\frac{n_{ij}N}{n_in_j}}{-\sum_in_iln\frac{n_i}{N}-\sum_jn_jln\fr…

模拟赛总结(四)(终章?)

2024.10.30 T1 追逐游戏 (chase) 被自己的分讨绕死了,以后要学会简化code T2 统计code T3 软件工程 选前\(k - 1\)长的 + 剩下求交集可得\(96\) ~~为什么我贪的不对qwq ~~ 把这个贪心改成大炮就是整洁的一部分 定义\(dp_{i,j}\)表示前\(i\)条线段放到\(j\)个集合里,那么上述方…

【红队】利用 PsycheShell 进行 Paste Jacking 以获取隐秘的反向 Shell

原创 Ots安全介绍 在网络安全领域,粘贴劫持 (Paste Jacking)等技术代表着社会工程攻击日益复杂的趋势。当用户从网页上复制看似无害的内容,但粘贴的内容却遭到恶意篡改时,就会发生粘贴劫持。攻击者可以使用此技术在目标机器上执行命令,尤其是当用户粘贴到终端等敏感环境中时…

数据采集与融合技术实践课第三次作业

数据采集与融合技术实践课第三次作业这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/2024DataCollectionandFusiontechnology码云作业gitee仓库 https://gitee.com/huang-yuejia/DataMining_project/tree/master/work3学号 102202149姓名 黄悦佳目录数据采集与融合技…

猿人学web端爬虫攻防大赛赛题第17题——天杀的http2.0

题目网址: https://match.yuanrenxue.cn/match/17 解题步骤:老方法,看触发的数据包。只有一个数据包,再看cookie中有没有特殊的字段。没有遇到第13题的特殊字段,直接访问。import requestsurl = "https://match.yuanrenxue.cn/api/match/17?page=1" headers = …

你知道多少种API架构风格

以下是最常用的几种风格:👇🌟 『SOAP』:成熟、全面的XML基础风格,最适合企业应用。🌐 『RESTful』:流行、易于实现的HTTP方法风格,理想用于Web服务。📚 『GraphQL』:查询语言风格,请求特定数据,减少网络开销,响应更快。🚀 『gRPC』:现代、高性能的Protocol…

【java应用】 Jmeter玩法:调用jar包实现AES加密

原创 方知本知 从零做软件测试一、将开发提供的AES java类打成jar包 1.1 打开开发提供的java类 用Eclipse开发工具打开,观察包名。新建项目,在生成的src目录下新建包,名字为java类对应的包名,将java类拖到该包下面。1.2 将该java类导出成jar包格式二、Jmeter调用jar包实现A…

chrony服务

APPSRV、ROUTERSRV、STORAGESRV、ISPSRV 完成服务chrony 配置为全网提供时间同步服务器。 为除本机外的所有主机提供时间同步服务。 每隔5分钟同步一次时间。配置Chrony服务APPSRV作为chrony服务的服务段 其他主机作为客户端 APPSRV 配置服务 vim /etc/chrony.confserver 127.0…