LVGL字库SPIflash移植笔记.pdf

### LVGL字库SPIflash移植知识点详解 #### 一、LVGL字库基本概念与结构 LVGL(LittlevGL)是一款轻量级图形库,适用于嵌入式系统中的GUI开发。在LVGL中,字体处理是其核心功能之一,支持多种格式的字体,包括内置字体和外部字体。本文档重点介绍LVGL外置SPI Flash字库的移植方法。 LVGL中的字体由`lv_font_t`结构体表示,该结构体中包含了字体描述符、获取字模的方法等关键信息。例如,对于一款名为“微软雅黑 Regular 24”的字体: ```c lv_font_t HeaFont = { .dsc = &font_dsc, // 字体描述 .get_glyph_bitmap = __user_font_get_bitmap, // 获取字模数据 .get_glyph_dsc = __user_font_get_glyph_dsc, // 获取字体描述 .line_height = 41, .base_line = 0, }; ``` 其中`.dsc`指针指向了字体描述符,而`.get_glyph_bitmap`和`.get_glyph_dsc`则是用户自定义的函数指针,分别用于获取指定字符的位图数据和描述信息。 #### 二、字体描述符解析 字体描述符是一个关键的概念,它存储了字体的各种属性信息。以`__user_font_get_glyph_dsc`为例,该函数负责根据输入的Unicode字符找到对应的字体描述信息: ```c static bool __user_font_get_glyph_dsc(const lv_font_t *font, lv_font_glyph_dsc_t *dsc_out, uint32_t unicode_letter, uint32_t unicode_letter_next) { lv_font_fmt_txt_dsc_t *fdsc = (lv_font_fmt_txt_dsc_t*)font->dsc; if (unicode_letter < fdsc->cmaps[0].range_start) return false; // 编码小于开始地址报错 int i = binsearch(fdsc->cmaps[0].unicode_list, fdsc->cmaps[0].list_length, unicode_letter); // 查询UNICODE字符列表,返回所在顺序位置 if (i != -1) { const lv_font_fmt_txt_glyph_dsc_t *gdsc = &fdsc->glyph_dsc[i]; dsc_out->adv_w = gdsc->adv_w; // 取出每个字体参数描述 dsc_out->box_h = gdsc->box_h; dsc_out->box_w = gdsc->box_w; dsc_out->ofs_x = gdsc->ofs_x; dsc_out->ofs_y = gdsc->ofs_y; dsc_out->bpp = fdsc->bpp; return true; } return false; } ``` 此函数通过二分查找算法在字体描述符中的字符映射表中找到目标Unicode字符,并返回相应的字体描述信息。 #### 三、SPI Flash字库移植 LVGL支持将字体存储在SPI Flash中,这对于内存资源有限的嵌入式系统非常有用。下面介绍移植过程的关键步骤: 1. **字体文件生成**:首先使用LvglFontTool工具生成字体文件,通常包含一个`.c`文件和一个`.bin`文件。`.c`文件中包含了访问字体所需的函数定义和数据结构。 2. **初始化及范围对比**:移植时需要先读取字体文件头部的8个字节来确定字体的范围。例如,在文档示例中,“中”字的Unicode编码为0x4E2D,而字体文件覆盖的Unicode范围是从0x20到0x9FA5。 3. **计算字模地址**:接下来根据字符的Unicode编码计算出其在SPI Flash中的字模地址。公式为: \[ \text{字模地址} = (UC - \text{最小Unicode值}) \times 4 + \text{头部字节数} \] 其中,UC为字符的Unicode编码,4表示每个字模地址占用的字节数,头部字节数为8。例如,“中”字的字模地址计算过程为: \[ \text{字模地址} = (0x4E2D - 0x0020) \times 4 + 8 = 0x1383C \] 4. **读取字模信息**:在得到字模地址后,就可以通过SPI Flash读取操作来获取具体的字模数据了。这一步骤的具体实现依赖于具体的硬件平台和SPI Flash驱动。 #### 四、总结 LVGL的SPI Flash字库移植主要包括生成字体文件、解析字体描述符、计算字模地址以及实际读取字模数据四个步骤。这一过程涉及到的数据结构、算法和硬件交互等方面的知识对于嵌入式GUI开发者来说非常重要。通过理解这些细节,开发者可以更好地利用LVGL提供的强大功能,为嵌入式设备设计出美观且高效的用户界面。


















- zhaozhenzhen1232021-10-20原理讲解的很详细,但实测LVGL调用外部字库,都是先将字库整体搬移到RAM中,才能正常显示的。靠LvglFontTool_V0_2字库生成工具生成的字库C文件在调用时无法将字体数据额外传给LVGL,只能在初始化时将字库整体搬到SDRAM中,该C文件提供的地址才能发挥作用,否则LVGL将无法获取字体显示数据
- 时西风止2023-03-17??? #毫无价值
- Littlejohnnyh2023-06-02#注释完整
- chenwaterpower2021-01-31想请教一下__g_font_buf的缓存的数据长度设置成多少,这个缓存的意义是不是读出来进行查表?

- 粉丝: 84
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 基于Python PIL的图像去重
- Python Django 餐厅点评系统源码
- 三电平VSG并网系统:基于虚拟同步发电机与双闭环控制的电压电流质量保障及工况应对
- 模拟IC设计基础:运算放大器与集成电路详解及实践指南
- 崔帕斯TP980电脑调音软件下载
- 基于Simulink仿真的FOC电流环PI参数自整定模型:电机控制系统优化与智能化升级
- 崔帕斯TP980A电脑调音软件下载
- 基于非正弦反电动势的PMSMBLDC无感控制算法优化转矩脉动
- 基于C++的点云测体积Demo,用Kinect和PCL点云库测量方体体积
- 基于C#VS2019雷赛运动控制卡实现的三轴平台写字源码毕业设计课程设计项目开发
- 电动汽车动力系统及动力经济性计算模型 - 电动汽车 说明
- 基于MATLAB图像去雾使用暗通道先验算法和Retinex图像增强算法制作的图形化界面程序源码毕业设计课程设计项目开发
- 分布式驱动车辆控制优化:'电机能量损耗与车辆稳定性之间的协调优化控制'的Simulink仿真搭建
- 文件名变绿的可尝试解决方法
- 单相并网逆变器Matlab仿真:离网仿真与PLL锁相环技术下电感电流谐波优化
- 自抗扰控制(ADRC)技术在车辆轨迹跟踪中的应用及其实现


