ESP32+LVGL笔记(6)-把712k的一二级汉字字库放在SPIRAM

文章目录

  • 1.字库制作
  • 2.字库烧录到ESP32-S3的flash
    • 2.1 配置好分区文件
    • 2.2 汉字库文件烧录到ESP32的flash
  • 3.将字库从 flash 拷贝到 SPIRAM
    • 3.1 工程配置中有关 SPIRAM 部分
    • 3.2 将汉字库从flash拷贝到SPIRAM的代码
    • 3.3 在进入lvgl之前调用函数 copyHZK_from_flash_to_SPIRAM

在前面的文章《lvgl 笔记(3)-中文字库的制作和使用(windows模拟和esp32)》提到,esp32使用大字库会引起刷新速度变慢(文件浏览界面上下滑动时)的问题。今天尝试把712k大小的字库先读取到SPIRAM,使用时,直接读取SPIRAM,果然速度大为提升,效果还可以接受。
我用的模块是ESP32-S3-WROOM-1(N8R8),内部有8M byte SPIRAM。
本文对应的工程源码:《LVGL_HX8369_HZK》。

1.字库制作

参考《lvgl 笔记(3)-中文字库的制作和使用(windows模拟和esp32)》。

2.字库烧录到ESP32-S3的flash

2.1 配置好分区文件

我测试的开发板模块是esp32-S3-WROOM-1(N8R8),模块内部集成了8MB的spi flash。
首先要知道自己开发板的flash大概空间,字库放置的地址和用户程序不要冲突。以我的工程为例,flash空间的规划《partitions_singleapp_large.csv》是:

# Name,   Type, SubType, Offset,  Size, Flags
# Note: if you have increased the bootloader size, make sure to update the offsets to avoid overlap
nvs,      data, nvs,     ,        0x6000,
phy_init, data, phy,     ,        0x1000,
factory,  app,  factory, ,        2000K,
storage,0x01,0x40,0x300000,800k

这里给用户程序安排了2M的空间,我的程序实际不超过 600k bytes;所以我就把字库放在3M开始的地方,也就是偏移量为0x30 0000.
具体操作很简单,把汉字库文件《 myFont_16_2.bin 》往0x300000地址烧录就行了。字库的大小是712k bytes,这里分配800k。
工程配置选择《partitions_singleapp_large.csv》文件:
在这里插入图片描述

2.2 汉字库文件烧录到ESP32的flash

在这里插入图片描述

3.将字库从 flash 拷贝到 SPIRAM

3.1 工程配置中有关 SPIRAM 部分

在我的工程中,我也是拿别人的工程,基本没有改动SPIRAM的配置:
在这里插入图片描述

3.2 将汉字库从flash拷贝到SPIRAM的代码

一开始,我想用一个全局数组:

EXT_RAM_ATTR	unsigned char __g_hzk_buf[712*1024];

编译失败,提升下面的 error:

esp32 section `.dram0.bss' will not fit in region `dram0_0_seg'

于是改用动态分配就可以正常运行。先定义一个全局指针,再给这个指针动态分配空间:

uint8_t * __g_p_hz_data;
__g_p_hz_data=(uint8_t *) heap_caps_malloc(712*1024,  MALLOC_CAP_SPIRAM);

下面是《myFont_16_2.c》的关键代码:

//  配置是否copy to SPIRAM    
#define     CONFIG_HZK_IN_SPIRAM        1

//     1. 将字库从  flash copy to SPIRAM 
#if     CONFIG_HZK_IN_SPIRAM
#define     HZK_LEN     (712*1024)

 uint8_t * __g_p_hz_data;
//  上电时,在进入lvgl初始化之前,调用本函数
//  函数名: copyHZK_from_flash_to_SPIRAM()
//	功  能:把字库全部读取到外部SPI RAM
void    copyHZK_from_flash_to_SPIRAM(void)
{
    __g_p_hz_data=(uint8_t *) heap_caps_malloc(HZK_LEN,  MALLOC_CAP_SPIRAM);
    spi_flash_read(0x300000,__g_p_hz_data,HZK_LEN);
}
static uint8_t *__user_font_getdata(int offset, int size){
    return __g_p_hz_data + offset;
}

#else       
//  2.直接在flash 读取
static uint8_t __g_font_buf[256];//如bin文件存在SPI FLASH可使用此buff
static uint8_t *__user_font_getdata(int offset, int size){
    //如字模保存在SPI FLASH, SPIFLASH_Read(__g_font_buf,offset,size);    
    spi_flash_read(0x300000+offset,__g_font_buf,size);
    return __g_font_buf;
}
#endif

测试时,可以通过配置 宏 CONFIG_HZK_IN_SPIRAM 为0(没有把字库放在SPIRAM)或为1(把字库放在SPIRAM),对比两者的速度。

3.3 在进入lvgl之前调用函数 copyHZK_from_flash_to_SPIRAM

源码参考《lvgl_gui.c》。

void    copyHZK_from_flash_to_SPIRAM(void);
void guiTask(void *pvParameter)
{
    //  先copy 汉字库到 spiram
    copyHZK_from_flash_to_SPIRAM();
    xGuiSemaphore = xSemaphoreCreateMutex();
    static lv_disp_draw_buf_t disp_buf; // contains internal graphic buffer(s) called draw buffer(s)
    ......
}

函数 guiTask是lvgl的主函数,在对lvgl初始化之前调用 copyHZK_from_flash_to_SPIRAM

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

node-red:使用node-red-contrib-amqp节点,实现与RabbitMQ服务器(AMQP)的消息传递

node-red-contrib-amqp节点使用 一、简介1.1 什么是AMQP协议?1.2 什么是RabbitMQ? -> 开源的AMQP协议实现1.3 RabbitMQ的WEB管理界面介绍1.3 如何实现RabbitMQ的数据采集? -> node-red 二、node-red-contrib-amqp节点安装与使用教程2.1 节点安装2.2 节点使用2.2.1 amq…

vue3引入高德地图流程(key和秘钥),仅需三步

步骤一&#xff1a; 申请key和秘钥 步骤二&#xff1a; 安装amap/amap-jsapi-loader依赖 cnpm i amap/amap-jsapi-loader // 或者 yarn add amap/amap-jsapi-loader步骤三&#xff1a; <template><div id"gdMapCon"></div> </template>…

在Go语言中实现HTTP中间件

在Web开发中&#xff0c;中间件是一种非常流行的设计模式&#xff0c;它可以用于处理请求、拦截请求并对其进行处理或转换。而在Go语言中&#xff0c;实现HTTP中间件就像给自己的HTTP服务器穿上了一层“魔法外衣”&#xff0c;让它变得更加灵活、可配置和可扩展。下面&#xff…

LLaMA开源大模型源码分析!

Datawhale干货 作者&#xff1a;宋志学&#xff0c;Datawhale成员 花了一晚上照着transformers仓库的LLaMA源码&#xff0c;把张量并行和梯度保存的代码删掉&#xff0c;只留下模型基础结构&#xff0c;梳理了一遍LLaMA的模型结构。 今年四月份的时候&#xff0c;我第一次接触…

3.苍穹外卖-day03

苍穹外卖-day03 课程内容 公共字段自动填充 新增菜品 菜品分页查询 删除菜品 修改菜品 功能实现&#xff1a;菜品管理 菜品管理效果图&#xff1a; 1. 公共字段自动填充 1.1 问题分析 在上一章节我们已经完成了后台系统的员工管理功能和菜品分类功能的开发&#xff0c;在新…

AI工程化—— 如何让AI在企业多快好省的落地?

1. 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站 作为计算机科学的一个重要领域&#xff0c;机器学习也是目前人工智能领域非常活跃的分支之一。机器学习通过分析海量数据、总结规…

sql_lab之sqli中的堆叠型注入(less-38)

堆叠注入&#xff08;less-38&#xff09; 1.判断注入类型 http://127.0.0.3/less-38/?id1 and 12 -- s 没有回显 http://127.0.0.3/less-38/?id1 and 11 -- s 有回显 则说明是单字节’注入 2.查询字段数 http://127.0.0.3/less-38/?id1 order by 4 -- s 报错 http:/…

c# OpenCvSharp 检测(斑点检测、边缘检测、轮廓检测)(五)

在C#中使用OpenCV进行图像处理时&#xff0c;可以使用不同的算法和函数来实现斑点检测、边缘检测和轮廓检测。 斑点检测边缘检测轮廓检测 一、斑点检测&#xff08;Blob&#xff09; 斑点检测是指在图像中找到明亮或暗的小区域&#xff08;通常表示为斑点&#xff09;&#…

数据结构和算法-二叉排序树(定义 查找 插入 删除 时间复杂度)

文章目录 二叉排序树总览二叉排序树的定义二叉排序树的查找二叉排序树的插入二叉排序树的构造二叉排序树的删除删除的是叶子节点删除的是只有左子树或者只有右子树的节点删除的是有左子树和右子树的节点 查找效率分析查找成功查找失败 小结 二叉排序树 总览 二叉排序树的定义 …

JavaScript系列-函数(function)

文章目录 函数定义函数的特征 创建函数方式函数声明实现函数内部操作对外部可见 函数表达式匿名表达式带名称表达式 函数调用方式函数提升函数作用域作用域和函数栈递归 嵌套函数和闭包闭包特性-保存变量 使用 arguments 对象箭头函数定义 更多内容 函数定义 提示&#xff1a;函…

【MYSQL】MYSQL 的学习教程(六)之 SQL 语句执行流程

1. 一条 SQL 查询语句是如何被执行的 MySQL 的基本架构示意图如下所示&#xff1a; MYSQL 线程处理请求流程&#xff1a; SQL 接口&#xff1a;MySQL 中处理请求的线程在获取到请求以后获取 SQL 语句去交给 SQL 接口去处理查询解析器&#xff1a;解析器会将 SQL 接口传递过来…

VSCode Emoji 在 Windows10 下的显示问题

VSCode Emoji 在 Windows10 下的显示问题 问题描述 使用系统快捷键 Win ;(分号) 或 Win .(句号) 可以打开系统的 Emoji 面板&#xff0c;用于输入表情符号。 但是在 Windows 10 的 VSCode 中&#xff0c;一部分 Emoji 的显示会出现问题&#xff0c;比如以下这些&#xff1…

跟着LearnOpenGL学习9--光照

文章目录 一、颜色二、创建光照场景 一、颜色 显示世界中有无数种颜色&#xff0c;每一个物体都有它们自己的颜色。我们需要使用&#xff08;有限的&#xff09;数值来模拟现实世界中&#xff08;无限的&#xff09;的颜色&#xff0c;所以并不是所有现实世界中的颜色都可以用…

网络游戏管理新规:重氪滚服成历史,SLG、MMO与小游戏逻辑亟待换新

12月22日&#xff0c;国家新闻出版署网站发布《网络游戏管理办法&#xff08;草案征求意见稿&#xff09;》&#xff08;以下简称《办法》&#xff09;&#xff0c;向社会公开征求意见。 午间《办法》一经发出后&#xff0c;在行业内立刻引发震动&#xff0c;诸多从业者表示&a…

将mapper.xml保存为idea的文件模板

将mapper.xml保存为idea的文件模板 在idea的File and Code Templates中将需要使用模板的内容添加为模板文件。 那么接下来请看图&#xff0c;跟着步骤操作吧。 mapper.xml文件内容 <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE mapper P…

基于SpringBoot的校园疫情防控管理系统 JAVA简易版

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生2.2 老师2.3 学校管理部门 三、系统展示四、核心代码4.1 新增健康情况上报4.2 查询健康咨询4.3 新增离返校申请4.4 查询防疫物资4.5 查询防控宣传数据 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBoot…

数字音频编辑软件audition 2021 mac功能介绍

Audition 2021 mac是一款专业数字音频编辑软件&#xff0c;提供先进的音频混音、编辑和效果处理功能&#xff0c;专为音频和视频专业人员设计。无论是要录制音乐、无线电广播&#xff0c;还是为录像配音&#xff0c;Audition都能帮到您。它可提供先进的音频混合、编辑、控制和效…

大创项目推荐 深度学习 植物识别算法系统

文章目录 0 前言2 相关技术2.1 VGG-Net模型2.2 VGG-Net在植物识别的优势(1) 卷积核&#xff0c;池化核大小固定(2) 特征提取更全面(3) 网络训练误差收敛速度较快 3 VGG-Net的搭建3.1 Tornado简介(1) 优势(2) 关键代码 4 Inception V3 神经网络4.1 网络结构 5 开始训练5.1 数据集…

AutoEncoder个人记录

原理 最常见的降维算法有主成分分析法PCA&#xff0c;通过对协方差矩阵进行特征分解而得到数据的主要成分&#xff0c;但是 PCA 本质上是一种线性变换&#xff0c;提取特征的能力极为有限。 AutoEncoder把长度为d_in输入特征向量变换到长度为d_out的输出向量&#xff0c;借助于…

地震勘探原理---数字滤波处理

一. 地震数字滤波的目标 核心任务&#xff1a;去噪&#xff0c;提高地震资料信噪比 噪声压制: 野外采集中可以通过检波器组合, 震源组合, 地震多次覆盖技术来压制干扰波, 但是由于多种原因, 野外采集的资料仍然残留一定干扰波, 必须采用室内数字处理的方式来进行压制. 根据有效…