打印

采用SPI Flash存储中文字符库(转)

[复制链接]
5300|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fuqing5542|  楼主 | 2012-7-17 09:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
为感谢各位网友支持,现整理调试记录,以便让有兴趣的坛友们自己也做个。
                                                             采用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容量够大的话,还可以写入其它字体样式和大小的字库,做一个专属的字库芯片。
附件:取点阵.exe 整理字库.exe UartAssist.exe 中文字库.txt OutHzLib.txt 以及STM32工程文件
205853s7n6vgd2vz7yuxy5.zip (1.14 MB)    205834r9x7vf7wgpvw6jpw.zip (1.13 MB)
专营STM8/32
QQ 940436962
http://y-ec.taobao.com/
评分
参与人数 1威望 +1 收起 理由
xiaocanyang + 1 赞一个!
沙发
wgsxsm| | 2012-7-17 12:28 | 只看该作者
MARK
Thanks for share!

使用特权

评论回复
板凳
figo20042005| | 2012-7-17 13:07 | 只看该作者
看了,是比较实际的经验,谢谢分享

使用特权

评论回复
地板
fuqing5542|  楼主 | 2012-8-29 16:45 | 只看该作者
求大家支持啊

使用特权

评论回复
5
无冕之王| | 2012-8-30 00:06 | 只看该作者
很不错,必须支持

使用特权

评论回复
6
xsgy123| | 2012-8-30 00:12 | 只看该作者
相当不错的**

使用特权

评论回复
7
fuqing5542|  楼主 | 2012-8-30 09:10 | 只看该作者
:lol

使用特权

评论回复
8
zlutian| | 2012-8-30 10:34 | 只看该作者
不错,这个支持下。

使用特权

评论回复
9
fuqing5542|  楼主 | 2012-8-31 09:17 | 只看该作者
嗯哼 不错啊我

使用特权

评论回复
10
fuqing5542|  楼主 | 2012-9-13 09:51 | 只看该作者
矮油 不错哦

使用特权

评论回复
11
lvjing880907| | 2012-9-13 14:27 | 只看该作者
:shutup:

使用特权

评论回复
12
ckr| | 2012-11-10 09:30 | 只看该作者
下了,谢谢

使用特权

评论回复
13
baidudz| | 2012-11-10 10:30 | 只看该作者
这个资料很不错

使用特权

评论回复
14
hsbjb| | 2012-11-10 10:39 | 只看该作者
很好的方法

使用特权

评论回复
15
ljxh401| | 2012-11-10 15:12 | 只看该作者
SD卡 在我应用的项目中 存着字库 还是没有问题的
只操作小屏幕 128*64

使用特权

评论回复
16
fuqing5542|  楼主 | 2012-11-12 09:43 | 只看该作者
:hug:

使用特权

评论回复
17
拿起书本| | 2012-11-15 15:13 | 只看该作者
例程里的程序是硬件的SPI么  ? 还是 软件模拟的SPI?

使用特权

评论回复
18
fuqing5542|  楼主 | 2012-11-19 09:46 | 只看该作者
你猜

使用特权

评论回复
19
fuqing5542|  楼主 | 2012-11-20 09:59 | 只看该作者
我也猜啊啊啊

使用特权

评论回复
20
lwg998| | 2012-11-20 22:40 | 只看该作者
好帖子

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

362

帖子

1

粉丝