如何使用采用SPI Flash存储中文字符库的方法说明

在嵌入式系统中,有时候需要中文字符来表示我们的某些信息,但是中文字符库本身占据空间比较大,因此有时候仅仅对系统中需要的字符进行编码,其它的则省掉,但是这样对于编程调用字符时是比较麻烦的,只能一个一个进行调用然户显示。然而,有时候在比较大的系统中需要很多的中文字符,如果还是对需要的进行一个个编码将显得非常费时,此时有必要采用一个字库来完成我们的工作。
在嵌入式系统中,用得比较多的是gbk2312b编码的字库(还有一个是unicode编码),编码后得到的是一个字符数组,每一个中文字符对应多个字节(具体字节数看取模的大小),需要显示某个字符只需取得该字符的gbk内码,然后找到该字符对应数组中的地址,最后将这个字符对应的所有字节按照预定的格式写入液晶屏即可。这样操作带来的简便就是,你想显示某个字符只需以字符串的格式输入该字符然后调用显示函数就行了。这时有个问题出现了,7千多个字符编码后得占用多大空间啊?
大概有200kb,但是对于现在的mcu,本身自带的rom就很宝贵,另外mcu的rom越大其成本就越高。所以,如果将200kb的字库写入mcu将不太划算。不将字库存入mcu,就得存入另外一种介质中,这种介质可能是sd卡, spi flash。对于sd卡我没有试过,虽然容量大,但据说读取速度比较慢,另外封装较大,占板子面积,感觉适用与大的系统吧,比如mp3;而spi flash, 体积小,容量也还可以,我所了解的也有8m的,可能还有更大容量的。好了,废话了这么多,那么本文接下来就绍如何用spi flash做中文字库:
第一步,当然需要你将你所用的spiflasn的初始化以及读写函数写好(我使用的w25x16,2m,传输速率最大74mhz,很快的;板子主芯片stm32f103rbt6)。写函数:void w25x_write_bytes(uint32_t addr,u8* pbuffer, u16 nbytes) 注:w25x16写时,需要先擦除。读函数:void w25x_read_bytes(uint32_t addr, u8* pbuffer, u16 nbytes)第二步,编写串口传输函数,采用串口中断的方式,波特率设置为115200(测试没有问题),接收外部输入的一个字节后立马将其写入spi flash。与之前两个字符表示一个字节的方法速度提升一倍。代码:
u8 result;
u32 paddr=0;
void usart1_irqhandler(void)
{
if(usart_getitstatus(usart1,usart_it_rxne)!=reset)
{
result= usart_receivedata(usart1);
w25x_write_bytes(paddr++,&result,1);
usart_clearitpendingbit(usart1,usart_it_rxne);// 清除串口接受中断
}
}
第三步,设置一个按键进行擦除操作,通过串口或者lcd进行交互,以提示是否擦除完成。可以进行写flash。第四步,制作中文字库,gb3212库包含6768个简体中文,首先打开“取点阵.exe”软件,然后在软件中打开“字符库.txt”文件。
然后选择取模方式,可以设置字体样式、大小和方向设置等。注意“方向设置“选项,这里为了对应工程中的显示程序,选择——横向取模,高位在坐。其它选项只要适当修改显示程序就可以。
然后点击“输出“按钮,将在该目录下得到字模数组文件(temp.txt)。第五步,整理字库文件。上一步得到的字模数组文件还不能直接使用,需要进行整理以适合串口发送,去除各种注释符和标点字符,只保留两位字符组成的十六进制格式。接着将“temp.txt”改名为“hzlib.txt”,然后运行“整理字库.exe”,此时将得到整理好的字库“outhzlib.txt”然后就可以直接将该字库通过串口发送到mcu了。
第六步,串口发送数据。推荐用附件中的串口调试软件,因为有些软件在对于文件发送这个功能做得似乎有些问题。本人也测试了两款串口调试软件,均不能得到结果,如果有其它好的也可以,反正只要达到目的就行。设置串口参数,然后在发送区设置中勾选“按十六进制发送”,点击“启动文件数据原”选项,选择制作好的字库“outhzlib.txt”,不要点击“文件载入”。
第七步,打开串口,将板子接通电源,首先对flash进行擦除操作,提示擦除结束后,点击串口发送,然后就慢慢等着字库写入flash。测试在波特率为115200下,取模大小为16*16,耗时为70s,似乎也不太久,如果取模越大,耗时就越长。写好字模后,就可以在工程中调用字库进行中文显示了(取gbk内码操作见工程)。另外如果flash容量够大的话,还可以写入其它字体样式和大小的字库,做一个专属的字库芯片。

英特尔20A、18A工艺流片,台积电面临挑战
2021中国工业互联网大会暨粤港澳大湾区数字经济大会强势来袭
在FPGA设计中,时序就是全部
三相倒顺开关的接线图和工作原理图
电路设计对数字地和模拟地隔离技巧解析
如何使用采用SPI Flash存储中文字符库的方法说明
光纤激光切割机的伺服伺服电机该如何维护
智能建筑的未来需要依靠什么
京微雅格“农村包围城市”战术 从中低端产品做起
pipeline ADC的实现原理及基本结构(2)
什么是 SHaaS(智能家居即服务),您为什么要关心?
在Allegro环境下运行SKILL的方法
探讨一下在UVM中典型的验证平台
西门子SCL语言编程系列-计算方差
教你如何通过边打游戏边学编程
通用型工业电源可采用高电压输入并产生从8个1A到2个4A的输出
三星将加大内存芯片资本支出并建新生产线
FPGA怎么搭复位电路 fpga复位电路设计方案
LED显示屏怎样更节能环保
MT9284CS6 1.2MHz 高效提升白色 LED驱动器