LVGL实现字库的下载和使用

1 字库

字库的概念:相应文字或字符的合集。

点阵字库:按字库顺序排列的字符/汉字字模的合集。

LVGL中字库使用Unicode编码,Unicode 是全球文字统一编码。它把世界上的各种文字的每一个字符指定唯一编码,实现跨语种、跨平台的应用。中文用户最常接触的是汉字 Unicode 编码。中文字符数量巨大,日常使用的汉字数量有数千个,再加上生僻字,数量达到数万个。

注意:一个汉字是需要两个字节

分别为:区码 + 位码

2  LVGL实现字库的两种方式

        第一种方式:内部大数组

        之前显示汉字采用的就是这种形式,如果只是显示少量汉字,用这种方式显示就很便捷,字体加载速度也会比较快。但是如果想要显示任意的汉字时,就需要把常用的字模全部取出,对应的保存字模数据的数组就会占用大量的空间。

        第二种方式:外置字库 

       一般我们会通过软件将常用的汉字全部取模,保存到外部存储介质中,例如SD卡或者Flash。对于LVGL来说,网上有第三方提供的字库制作工具。

我们采用的是W25Q64外部Flash模块来用于储存字库。

2.1 字库制作准备工作

字体下载链接:等宽字体 — 百问网LVGL中文教程文档 文档 (100ask.net)

字体转换工具下载链接:

LvglFontTool字体工具更新V0.4版本 - LittlevGL - 里飞网 - Powered by Discuz! (lfly.xyz)

2.2 字库制作流程

在制作LVGL字库之前需要准备好上述文件,字库制作流程如下:

  1. 字库制作工具下载好之后解压,然后找到对应软件图标双击打开
  2. 选择想要的字体文件,然后点击确定,注意子模高度和实际生成的有偏差
  3. 添加常用汉字,并修改LVGL版本和字库类型,字体名称根据自己需求命名
  4. 点击开始转换,选择自己的想要保存字库的文件夹,等待转换完成即可
  5. 转换完成后生成的内容如下:myFont.bin是生成的字库文件,需要下载到外部Flash里,myFont.c是对应的字模获取源码,需要移植到自己的工程里。

至此字库文件就已经制作完成。

myFont.c :功能函数,要跟myFont.bin,调用功能函数获取字模信息

myFont.bin:放的是所有的字模信息

myFont.bin  --  相当于之前的大数组,我们为了节省单片机的空间,同时尽可能支持全部字体,所有需要把bin文件放到SD卡或者flash中,我们就是放到flash中  

下面会介绍如何放入  

2.3 将字库下载到外部FLASH中

流程示意图:

存在的风险:

简单来说就是,可能会出现两个传输的速率不相同导致一个传输的快,一个接收的慢,到时数据在传输的过程中出现问题。

在STM32中和W25Q64模块进行传输数据中,采用的是SPI协议,搭载在APB1总线,并经过分频,且分频后的频率为:18MHZ --也就是SPI的速率

串口发送1个字节包含起始位和停止位和8位数据,发送1个字节需要10位,串口1s发送11520字节/s==0.01M字节/s<18M.

2.4 字库下载代码实现流程

如果是第一次下载字库,需要先擦除整个芯片,或者按照所使用的扇区大小擦除。

1、确定下载位置,先擦除指定位置的扇区。

2、如使用16号字体,从0地址开始下载,24号字体字号开始的地址要避免覆盖16号字体。

3、在串口接收中断内,每接收一个字节数据,就保存一个字节数据。

4、每接收一个字节,保存地址偏移一下。

5、每用一个1ms自加一次,而每接收一个字节,再清一下变量,用于判断是否接受完毕,如果变量累加100ms,一直位接收到数据,就认为数据已经接收完毕。

2.5 代码流程

2.5.1 定义擦除函数


uint32_t Receive_Cont=0;   //收到的字节数
uint8_t  Receive_time=0;   //用来表示超时时间   超过100ms未收到数据认为接收完成
uint8_t  Receive_flag=0;   //表示接收完成的标志位  0表示未接收完成  1表示接收完成
uint8_t  Receive_ing=0;    //表示是否正在接收  0表示未开始接收  1表示正在接收//定义函数连续擦除多个扇区
//参数1   扇区的起始地址
//参数2   扇区的数量
void sFLASH_EraseSector_Cont(uint32_t SectorAddr,uint16_t Sector_Cont)
{for(uint16_t i=0;i<Sector_Cont;i++){sFLASH_EraseSector(SectorAddr+i*sFLASH_SPI_SECTORSIZE);}
}

调用扇区擦除函数擦除对应区域

	printf("开始擦除16号字库区域\r\n");sFLASH_EraseSector_cont(Font16_ADDR,Font16_sector_Cont);printf("擦除16号字库区域完成\r\n");

计算存储空间

用这个大小除上4096就得到占用的空间大小了。

W25Q64的位置分配W25Q64的最小擦除函数扇区    1扇区=4096字节扇区0    0x0扇区1    0x1000扇区2    0x2000....扇区238  0x1000*238扇区239  0x1000*23916号字体   877339字节    需要占用的扇区  877339/4096=214.19   需要扩大 所以分配 215个扇区16号字体  扇区0(0x0)--扇区238(0x1000*238)	

2.5.2 串口接收数据

void USART1_IRQHandler(void)
{uint8_t Receive_Data=0;if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET){Receive_Data=USART_ReceiveData(USART1);//参数2一定要在字库起始地址的基础上个偏移已经接收的数量sFLASH_WriteBuffer(&Receive_Data,Font16_ADDR+Font16_count,1);Font16_count++;//接收到的数量Font16_time=0;//接收完成的超时时间清0Font16_lvgl=1;//表示正在接收数据USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清除 USARTx 的中断待处理位}
}

在主函数中加入是否传输完毕检测函数,然后吧程序下载到开发板上,运行即可。

		if(Font16_time>=100&&Font16_flag==0){//超时溢出表示接收完成Font16_flag=1;//表示接收完成Font16_lvgl=0;printf("接收的数量:%d\r\n",Font16_count);}

导入字库

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

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

相关文章

大数据开发助手:Coze平台上一款致力于高效解决大数据开发问题的智能Bot!

大数据开发助手&#xff1a;Coze平台上一款致力于高效解决大数据开发问题的智能Bot 核心技术揭秘1. **自然语言处理&#xff08;NLP&#xff09;**2. **知识图谱构建**3. **个性化推荐算法** 功能特色概览1. **即时问题解答**2. **最佳实践分享**3. **个性化学习路径**4. **社区…

哪个牌子的超声波清洗器好?精选四大超强超声波清洗机力荐

生活中戴眼镜的人群不在少数&#xff0c;然而要维持眼镜的干净却不得不每次都需要清洗&#xff0c;只是通过手洗的方式实在太慢并且容易操作不当让镜片磨损更加严重&#xff01;所以超声波清洗机就诞生了&#xff01;超声波清洗机能够轻松清洗机眼镜上面的油脂污渍&#xff0c;…

synchronized 锁优化原理

目录 一、轻量级锁 二、锁膨胀 三、自旋优化 四、偏向锁 五、锁消除 一、轻量级锁 1. 会创建一个锁记录 Lock Record&#xff08;保存在线程栈中&#xff09;&#xff0c;尝试 CAS 修改 Mark Word 中的对象头&#xff0c;是一种乐观锁的思想&#xff0c;而不是将 Java 对…

机器学习——强化学习状态值函数V和动作值函数Q的个人思考

最近在回顾《西瓜书》的理论知识&#xff0c;回顾到最后一章——“强化学习”时对于值函数部分有些懵了&#xff0c;所以重新在网上查了一下&#xff0c;发现之前理解的&#xff0c;包括网上的大多数对于值函数的描述都过于学术化、公式化&#xff0c;不太能直观的理解值函数以…

macos Automator自动操作 app, 创建自定义 应用程序 app 的方法

mac内置的这个 自动操作 automator 应用程序&#xff0c;可以帮助我们做很多的重复的工作&#xff0c;可以创建工作流&#xff0c; 可以录制并回放操作&#xff0c; 还可以帮助我们创建自定的应用程序&#xff0c;下面我们就以创建一个自定义启动参数的chrome.app为例&#xff…

cube-studio 开源一站式云原生机器学习/深度学习/大模型训练推理平台介绍

全栈工程师开发手册 &#xff08;作者&#xff1a;栾鹏&#xff09; 一站式云原生机器学习平台 前言 开源地址&#xff1a;https://github.com/tencentmusic/cube-studio cube studio 腾讯开源的国内最热门的一站式机器学习mlops/大模型训练平台&#xff0c;支持多租户&…

绘图黑系配色

随便看了几篇小论文&#xff0c;里面的黑配色挺喜欢的&#xff0c;虽然平时SCI系配色用的多&#xff0c;但看到纯黑配色与黑加蓝配色&#xff0c;那就是我最心上的最优style。

一文了解IP地址冲突的起因与解决方案

IP 地址冲突是困扰网络管理员影响网络的正常运行的常见因素。深入理解并有效解决 IP 地址冲突故障对于维护网络的高效稳定运行具有重要意义。 一、IP 地址冲突的原因 &#xff08;一&#xff09;人为配置错误 网络用户在手动配置 IP 地址时&#xff0c;对网络配置了解不多用户…

OpenGL3.3_C++_Windows(23)

伽ga马校正 物理亮度 光子数量 线性空间&#xff1a;光子数(亮度&#xff09;和颜色值的线性关系人眼感知的亮度&#xff1a;对比较暗的颜色变化更敏感&#xff0c;感知亮度基于人的感觉非线性空间&#xff1a;光子数(亮度&#xff09;和 颜色值^2.2&#xff0c;恰好符合屏幕…

为什么我学个 JAVA 就已经耗尽所有而有些人还能同时学习多门语言

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「JAVA的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;我的入门语言是C&#xff0c…

互联网场景下人脸服务基线方案总结

1.简介 1.1目的 在过去的一段时间里&#xff0c;因为听见业务对人脸服务方案的需求&#xff0c;针对网络视频中关键人物定位的检索任务&#xff0c;完成了基于互联网场景的人脸基线服务的构建。本文档是对当前基线服务以后之后解决方案的优化进行总结。 1.2范围 本文档描述的人…

c++读取文件时出现中文乱码

原因&#xff1a;UTF-8格式不支持汉字编码 解决&#xff1a;改成ANSI&#xff0c;因为ANSI编码支持汉字编码

Python学习路线图(2024最新版)

这是我最开始学Python时的一套学习路线&#xff0c;从入门到上手。&#xff08;不敢说精通&#xff0c;哈哈~&#xff09; 一、Python基础知识、变量、数据类型 二、Python条件结构、循环结构 三、Python函数 四、字符串 五、列表与元组 六、字典与集合 最后再送给大家一套免费…

KVB App:中国制造业数据支撑澳元,分析师预计挑战0.6750阻力

摘要&#xff1a; 中国6月财新制造业PMI上升至51.8&#xff0c;反映出制造业生产经营活动的持续扩张。这一数据不仅高于预期&#xff0c;还为澳元提供了强有力的支撑。技术分析显示&#xff0c;澳元/美元可能会在短期内挑战0.6750阻力水平。 中国制造业数据解析 6月&#xff0…

python异常、模块与包

目录 了解异常异常的捕获方法python模块python包安装第三方包 了解异常 什么是异常 当检测到一个错误时&#xff0c;python解释器就无法继续执行了&#xff0c;反而出现了一些错误的提示&#xff0c;这就是所谓的“异常”&#xff0c;也就是我们常说的BUG bug单词的诞生 早期…

Python tkinter: 开发一个目标检测GUI小程序

程序提供了一个用户友好的界面&#xff0c;允许用户选择图片或文件夹&#xff0c;使用行人检测模型进行处理&#xff0c;并在GUI中显示检测结果。用户可以通过点击画布上的检测结果来获取更多信息&#xff0c;并使用键盘快捷键来浏览不同的图片。 一. 基本功能介绍 界面布局&am…

智芯开发板----时钟的使用

一、开发板时钟概述 介绍 Z20K11xM 的时钟结构&#xff0c;分布以及各个外设时钟源的选择。SCC 模块用于选择系统时钟&#xff0c;产生 core clock、bus clock 和 flash clock&#xff0c;分 别用于驱动 core 及高速外设、普通外设和 flash。PARCC 模块用于单独设置 每个外设的…

中霖教育怎么样?税务师通过率高吗?

中霖教育怎么样?税务师通过率高吗? 我们在税务师考试培训方面有着不错的成绩&#xff0c;这都是老师与学员共同努力的结果。 采用小班教学模式&#xff0c;确保每位学员都能得到足够的关注和指导&#xff0c;在学习过程中针对学员的薄弱环节进行专项突破。 因为大部分学员…

【C语言】常见的字符串函数

©作者:末央&#xff06; ©系列:C语言初阶(适合小白入门) ©说明:以凡人之笔墨&#xff0c;书写未来之大梦 目录 strlen函数模拟实现 strstr子串查找函数模拟实现 strtok字符串分割 strlen函数 strlen函数是一个用于求字符串长度的库函数。它的参数是被求长度的字…

【爱上C++】详解string类2:模拟实现、深浅拷贝

在上一篇文章中我们介绍了string类的基本使用&#xff0c;本篇文章我们将讲解string类一些常用的模拟实现&#xff0c;其中有很多细小的知识点值得我们深入学习。Let’s go&#xff01; 文章目录 类声明默认成员函数构造函数析构函数拷贝构造函数深浅拷贝问题传统写法现代写法…