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.rhkb.cn/news/365676.html

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

相关文章

示例:WPF中推荐一个Diagram开源流程图控件

一、目的&#xff1a;分享一个自研的开源流程图控件 二、使用方法 1、引用Nuget包&#xff1a; 2、添加节点列表和绘图控件 <DockPanel><ItemsControl DockPanel.Dock"Left"><h:GeometryNodeData Text"节点"/></ItemsControl><…

[vue2/vue3] 详细剖析watch、computed、watchEffect的区别,原理解读

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;我是前端菜鸟的自我修养&#xff01;今天给大家分享【深入剖析watch、computed、watchEffect的区别】&#xff0c;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;原创不易&#xff0c;如果能帮助到带大家…

Rust 跨平台-Android 和鸿蒙 OS

1. 安装 rustup rustup 是 Rust 的安装和版本管理工具 $ curl --proto https --tlsv1.2 https://sh.rustup.rs -sSf | sh 该命令会安装 rusup 和最新的稳定版本的 Rust&#xff1b;包括&#xff1a; rustc Rust 编译器&#xff0c;用于将 Rust 代码编译成可执行文件或库。 ca…

网络爬虫(一)

1. 深度优先爬虫&#xff1a;深度优先爬虫是一种以深度为优先的爬虫算法。它从一个起始点开始&#xff0c;先访问一个链接&#xff0c;然后再访问该链接下的链接&#xff0c;一直深入地访问直到无法再继续深入为止。然后回溯到上一个链接&#xff0c;再继续深入访问下一个未被访…

redis,memcached,nginx网络组件

课程目标&#xff1a; 1.网络模块要处理哪些事情 2.reactor是怎么处理这些事情的 3.reactor怎么封装 4.网络模块与业务逻辑的关系 5.怎么优化reactor? io函数 函数调用 都有两个作用&#xff1a;io检测 是否就绪 io操作 1. int clientfd accept(listenfd, &addr, &l…

猫头虎 2024年上半年个人总结:科技自媒体的进击与突破

猫头虎 &#x1f42f; 2024年上半年个人总结&#xff1a;科技自媒体的进击与突破 &#x1f680; 大家好&#xff0c;我是猫头虎&#xff0c;实名李彦斌&#xff0c;陕西商洛人&#xff0c;今年26岁&#xff0c;目前在北京工作&#xff0c;全栈软件工程师、科技自媒体博主、某科…

CSS基础学习记录(6)

目录 1、从最基本的页面开始 2、添加图像/浮层部分 3、位置调整 4、添加动效 4.1、添加浮层动效 4.2、添加背景动画 目录 1、从最基本的页面开始 2、添加图像/浮层部分 3、位置调整 4、添加动效 4.1、添加浮层动效 4.2、添加背景动画 5、总结 根据前面css的学习&a…

喜讯!安全狗荣获“2023年网络安全技术支撑优秀单位”称号

6月6日&#xff0c;由中共厦门市委网络安全和信息化委员会办公室&#xff08;以下简称“厦门市委网信办”&#xff09;主办的2023年网络安全技术支撑优秀单位颁奖仪式在厦门成功举行。 作为国内云原生安全领导厂商&#xff0c;安全狗受邀出席此次活动。 会上&#xff0c;安全狗…

Spring两大核心思想 IoC和AoP

目录 ✨ 一、什么是IoC 1、定义 &#x1f38a; 2、IoC思想 &#x1f38a; 3、优势 &#x1f38a; 4、对象的管理 &#x1f38a; 存对象&#xff1a;Component 取对象&#xff1a;AutoWired ✨二、什么是DI 1、定义 &#x1f38a; 2、IoC和DI的关系&#x1f38a; 可…

【笔记】echarts图表的缩放和鼠标滚动冲突的处理解决方案

解决方案不是很好&#xff0c;来源于github的issue&#xff0c;官方提供了&#xff0c;组合键触发缩放的功能。 https://github.com/apache/echarts/issues/5769 https://echarts.apache.org/zh/option.html#dataZoom-inside.zoomOnMouseWheel dataZoom-inside.zoomOnMouseWhe…

【正点原子K210连载】第十四章 按键输入实验 摘自【正点原子】DNK210使用指南-CanMV版指南

1&#xff09;实验平台&#xff1a;正点原子ATK-DNK210开发板 2&#xff09;平台购买地址https://detail.tmall.com/item.htm?id731866264428 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/docs/boards/xiaoxitongban 第十四章 按键输入实…

数据结构与算法笔记:实战篇 - 剖析Redis常用数据类型对应的数据结构

概述 从本章开始&#xff0c;就进入实战篇的部分。这部分主要通过一些开源醒目、经典系统&#xff0c;真枪实弹地教你&#xff0c;如何将数据结构和算法应用到项目中。所以这部分的内容&#xff0c;更多的是知识点的回顾&#xff0c;相对于基础篇和高级篇&#xff0c;其实这部…

短视频电商源码如何选择

在数字时代的浪潮下&#xff0c;短视频电商以其直观、生动、互动性强的特点&#xff0c;迅速崛起成为电商行业的一股新势力。对于有志于进军短视频电商领域的创业者来说&#xff0c;选择一款合适的短视频电商源码至关重要。本文将从多个角度探讨如何选择短视频电商源码&#xf…

【每日刷题】Day78

【每日刷题】Day78 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 1608. 特殊数组的特征值 - 力扣&#xff08;LeetCode&#xff09; 2. 1385. 两个数组间的距离值 - …

我的世界服务器-高版本服务器-MC服务器-生存服务器-RPG服务器-幻世星辰

生存为主&#xff0c;RPG乐趣为辅&#xff0c;重视每位玩家的建议&#xff0c;一起打造心目中的服务器&#xff0c;与小伙伴一起探险我的世界&#xff01; 服务器版本: 1.18.2 ~ 1.20.4 Q群&#xff1a; 338238381 服务器官网: 星辰毛毛雨-Minecraft高版本生存服务器我的世界…

JVM原理(八):JVM虚拟机工具之基础故障工具

这里主要介绍监视虚拟机运行状态和进行故障处理的工具 1. jsp:虚拟机进程状况工具 jsp命令格式&#xff1a; jsp [options] [hostid] jps远程查询虚拟机进程状态 2. jstat:虚拟机统计信息监视工具 jstat命令格式&#xff1a; jstat [option vmid [interval [s|ms] [count]…

计算机专业课面试常见问题-计算机网络篇

目录 1. 计算机网络分为哪 5 层&#xff1f; 2. TCP 协议简述&#xff1f; 3. TCP 和 UDP 的区别&#xff1f;->不同的应用场景&#xff1f; 4. 从浏览器输入网址到显示页…

Wireshark - tshark支持iptables提供数据包

tshark现在的数据包获取方式有两种&#xff0c;分别是读文件、网口监听&#xff08;af-packet原始套接字&#xff09;。两种方式在包获取上&#xff0c;都是通过读文件的形式&#xff1b;存在文件io操作&#xff0c;在专门处理大流量的情境下&#xff0c; 我们复用wireshark去做…

【mysql死锁】示例 和讨论 “SHOW ENGINE INNODB STATUS“

文章目录 mysql 死锁死锁演示表结构如下 死锁查询mysql 详情命令行 SHOW ENGINE INNODB STATUS 如果 两个事务都是按照先更新1 再更新2的顺序去做更新 会发生死锁么&#xff1f;验证一下所以 如果顺序是一致的 不会产生死锁 只会进行等待 防止mysql 死锁的方式优化sql 自行顺序…

2024超全盘点:5大文档加密系统,文档加密系统都有哪些功能

在众多文档加密系统中&#xff0c;以下是五款备受推崇的软件&#xff0c;其中包括安企神软件、加密精灵等&#xff0c;它们各自具备独特的优势和特点&#xff0c;以满足不同企业对数据安全的需求。 1. 安企神软件 特点与优势&#xff1a;安企神软件以其全面的数据保护功能见长…