STM32外部Flash-----unicode字库制作基于LvglFontTool(AuroraFOC)

一. 简介

哈喽,大家好。在使用LCD屏幕显示的时候,绝大部分情况下都是需要使用文字进行显示(中文或英文 ),所以就会面临一个问题: 如何制作字库。在字符种类比较少的情况下且单片机资源足够的情况下,一般使用软件直接生成对应字符的点阵就可以了(一般存储为C数组的方式),通过数组下标,或者索引进行获取,这样做的优点是比较简单,缺点就是对于想显示的字符,不够直观,容易混乱不清,不适合大程序使用;但其它情况下,则需要使用特定编码格式的字库文件进行存储。

今天将会给大家分享一下如何使用LvglFontTool软件制作unicode编码的字库,并且下载到STM32外部Flash进行使用。

本设计将基于AuroraFOC开发板 进行开发和演示,需要开发板的可以找我购买,289元包邮到家(将会为购买者提供技术交流群服务,大家一起学习一起成长 )。wx: WU1356742146

二. LvglFontTool生成字库

相信学过LVGL的朋友应该对这款软件并不陌生了,它是用来专门生成LVGL使用的字库的,不需要修改什么,可以直接使用。但是现在,它将为我所用。

软件的操作非常简单,就不作过多的介绍了,大家可以参考如下的配置,其中有一个地方需要注意的是: 抗锯齿这里要选择1,因为我选择4的时候,没有解析成功,但没有找到问题(能力有限哈)。

点击开始转换后,会生成两个文件,一个是.bin的字库文件,这个字库文件需要下载到单片机的外部Flash中;另外一个是.c文件,提供的函数接口,用来读取字符信息和字符的点阵数据。至此这个软件的使命就完成了。

三. QT 验证

这部分工作,主要是为了代替在单片机上的调试工作,电脑上开发调试肯定会比单片机方便得多(还是推荐一下大家学习一下相关的开发,在必要的时候,可以提升开发效率)。

1. 移植LvglFontTool软件生成的.c文件

将结构体定义copy到自己的文件中,不需要做任何修改

将这两个函数copy到自己文件中来,并且在__user_font_getdata函数中,添加文件读取的函数

另外还需要记住一下这个参数,后面在显示字符串的时候,会使用到

2.编写显示函数

这部分就比较简单了,只需要调用getFont16Data这个函数,然后将中文的unicdoe编码值传进去就可以了,就可以得到字库的显示数据了,

到这里,就成功的从字库文件读取数据,并且显示了,后面直接函数替换就可以直接在单片机上进行显示了。

四. 上板验证

这个部分主要是在qt的基础上进行一个函数的替换,以及一些相关事项需要注意。

将字库文件下载存储到外部Flash大家可以使用自己熟悉的方式,比如说串口,单片机接收到串口数据后,再将接收到的数据存储到外部Flash中去即可。

1. 读取字库函数替换

将qt中读取文件相关的函数,使用读取flash的函数替换

2. 获取字库数据添加

为了能够显示字符串(字符与字符之间的间隔以及字符的高度保持一致),需要将如下信息获取到

3. 字符串显示函数

这部分比较关键,需要对编码有一些相关的了解,不然就有一些坑需要你去踩。

我们知道ASCII码是对应的一个字节,而我们中文编码至少是两个字节,那么我们就需要对输入进来的数组进行判断,判断方式就需要去学习一下相关的编码方式了。

首先,我这里使用的UTF-8编码的文件,而UTF-8编码可以有1-4字节编码,那么首先需要确定我们使用的中文是使用的几个字节,这个简单,直接使用printf函数打印一下所占用的字节数就可以了(我这边中文是占用了三个字节)。

我们的字库文件是unicode编码的,我们还需要将UTF-8编码转换为unicode编码,可以根据下面这幅图进行转换。当UTF-8使用1字节编码的时候,最高位为0,而使用多字节编码的时候,最高字节的高位1的个数和编码字节个数相等。单字节的UTF-8编码和Unicode是一致的,不用转换。

假如现在是三字节的UTF-8编码,那么对应下表,需要将第一个字节的高四个bit去掉,然后将第二个字节的高两个bit去掉,最后将第三个字节的高两个bit去掉,也就是只保留表中的x,组成一个16bit的数据,这个数据即为UTF-8转换为unicode后的编码。

了解到这,就可以开始编码代码啦,编写的代码如下图所示,非常简介明了。中间使用的一些参数是用来控制每个字符的偏移值,用来确保字符与字符之间的间隔保持一定,字符高度保持一致。

最后显示效果如下

五. 小结

本次给大家分享了一下,如何使用LvglFontTool软件制作unicode编码的字库,并且下载到STM32外部Flash进行使用,相信大家也知道如何操作了,如果大家有更好更优雅的操作方式的话,非常希望能一起探讨。另外如果中间还有疑问的话,也可以与我交流。

相关推荐
智者知已应修善业1 小时前
【51单片机用数码管显示流水灯的种类是按钮控制数码管加一和流水灯】2022-6-14
c语言·经验分享·笔记·单片机·嵌入式硬件·51单片机
智商偏低7 小时前
单片机之helloworld
单片机·嵌入式硬件
青牛科技-Allen8 小时前
GC3910S:一款高性能双通道直流电机驱动芯片
stm32·单片机·嵌入式硬件·机器人·医疗器械·水泵、
森焱森10 小时前
无人机三轴稳定控制(2)____根据目标俯仰角,实现俯仰稳定化控制,计算出升降舵输出
c语言·单片机·算法·架构·无人机
白鱼不小白10 小时前
stm32 USART串口协议与外设(程序)——江协教程踩坑经验分享
stm32·单片机·嵌入式硬件
S,D11 小时前
MCU引脚的漏电流、灌电流、拉电流区别是什么
驱动开发·stm32·单片机·嵌入式硬件·mcu·物联网·硬件工程
芯岭技术14 小时前
PY32F002A单片机 低成本控制器解决方案,提供多种封装
单片机·嵌入式硬件
youmdt14 小时前
Arduino IDE ESP8266连接0.96寸SSD1306 IIC单色屏显示北京时间
单片机·嵌入式硬件
嘿·嘘15 小时前
第七章 STM32内部FLASH读写
stm32·单片机·嵌入式硬件
Meraki.Zhang15 小时前
【STM32实践篇】:I2C驱动编写
stm32·单片机·iic·驱动·i2c