amobbs.com 阿莫电子技术论坛

标题: 采用SPI Flash存储中文字符库(莫大哥可删之前酷贴) [打印本页]

作者: fk2011    时间: 2012-3-31 21:01
标题: 采用SPI Flash存储中文字符库(莫大哥可删之前酷贴)
看到帖子第一次至酷,简直太酷了,为感谢各位网友支持,现整理调试记录,以便让有兴趣的坛友们自己也做个。
                                                             采用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。与之前两个字符表示一个字节的方法速度提升一倍。代码:

  1. u8 result;
  2. u32 pAddr=0;
  3. void USART1_IRQHandler(void)
  4. {
  5.         if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)        
  6.         {
  7.                 result = USART_ReceiveData(USART1);        
  8.                 W25X_Write_Bytes(pAddr++,&result,1);
  9.                 USART_ClearITPendingBit(USART1, USART_IT_RXNE);   // 清除串口接受中断
  10.         }
  11. }
复制代码


第三步,设置一个按键进行擦除操作,通过串口或者LCD进行交互,以提示是否擦除完成。可以进行写FLASH。
第四步,制作中文字库,GB3212库包含6768个简体中文,首先打开“取点阵.exe”软件,然后在软件中打开“字符库.txt”文件。
[attach]3933[/attach]
然后选择取模方式,可以设置字体样式、大小和方向设置等。注意“方向设置“选项,这里为了对应工程中的显示程序,选择——横向取模,高位在坐。其它选项只要适当修改显示程序就可以。
[attach]3934[/attach]
然后点击“输出“按钮,将在该目录下得到字模数组文件(temp.txt)。
第五步,整理字库文件。上一步得到的字模数组文件还不能直接使用,需要进行整理以适合串口发送,去除各种注释符和标点字符,只保留两位字符组成的十六进制格式。接着将“temp.txt”改名为“HzLib.txt”,然后运行“整理字库.exe”,此时将得到整理好的字库“OutHzLib.txt”然后就可以直接将该字库通过串口发送到MCU了。
[attach]3935[/attach]
第六步,串口发送数据。推荐用附件中的串口调试软件,因为有些软件在对于文件发送这个功能做得似乎有些问题。本人也测试了两款串口调试软件,均不能得到结果,如果有其它好的也可以,反正只要达到目的就行。设置串口参数,然后在发送区设置中勾选“按十六进制发送”,点击“启动文件数据原”选项,选择制作好的字库“OutHzLib.txt”,不要点击“文件载入”。
[attach]3936[/attach]
第七步,打开串口,将板子接通电源,首先对Flash进行擦除操作,提示擦除结束后,点击串口发送,然后就慢慢等着字库写入FLASH。测试在波特率为115200下,取模大小为16*16,耗时为70s,似乎也不太久,如果取模越大,耗时就越长。写好字模后,就可以在工程中调用字库进行中文显示了(取GBK内码操作见工程)。另外如果flash容量够大的话,还可以写入其它字体样式和大小的字库,做一个专属的字库芯片。
附件:取点阵.exe 整理字库.exe UartAssist.exe 中文字库.txt OutHzLib.txt 以及STM32工程文件。
[attach]3943[/attach][attach]3941[/attach]


作者: lkl10800139    时间: 2012-3-31 21:21
楼主为何要开两个帖子?
作者: fk2011    时间: 2012-3-31 21:25
本帖最后由 fk2011 于 2012-3-31 21:28 编辑
lkl10800139 发表于 2012-3-31 21:21
楼主为何要开两个帖子?


之前那个帖子比较乱,只是说明了一般原理,这个帖子详细说明怎样去做字库芯片,本来想在上面编辑的,但是好像不可以。莫大删除即可!
作者: wangguanfu    时间: 2012-3-31 21:27
不管怎么样
这个资料先保存下来再说
作者: newhz    时间: 2012-3-31 21:29
要是有高手能改成usb就好了。
我现在有种思路:
让单片机模拟成usb大容量存储,电脑上给传输的话,单片机将接受到数据存到SPI flash 如何?
作者: fk2011    时间: 2012-3-31 21:34
本帖最后由 fk2011 于 2012-3-31 21:50 编辑
newhz 发表于 2012-3-31 21:29
要是有高手能改成usb就好了。
我现在有种思路:
让单片机模拟成usb大容量存储,电脑上给传输的话,单片机将 ...


感觉似乎可以,之前也成功给SPIFlash移植了fatfs,如果采用fatfs文件读写的方式读取字库应该没问题,改天试试。
spi flash 移植 FATFS 0.09 [attach]3996[/attach]
作者: newhz    时间: 2012-3-31 21:39
fk2011 发表于 2012-3-31 21:34
感觉似乎可以,之前也成功给SPIFlash移植了fatfs,如果采用fatfs文件读写的方式读取字库应该没问题,改天 ...

我感觉fatfs都不需要,单片机模拟文件系统给电脑,然后读取到的字库直接保存到flash的头地址
作者: fk2011    时间: 2012-3-31 21:55
newhz 发表于 2012-3-31 21:39
我感觉fatfs都不需要,单片机模拟文件系统给电脑,然后读取到的字库直接保存到flash的头地址 ...

单片机模拟文件系统?不懂。能否给个具体的思路,让大家都参考参考。
作者: skynet    时间: 2012-3-31 21:55
图片都是红叉叉,唉
附件下载失败,唉
作者: fk2011    时间: 2012-3-31 21:59
skynet 发表于 2012-3-31 21:55
图片都是红叉叉,唉
附件下载失败,唉

不会吧,我都能看到图片啊。只是附件好像确实不能下载诶。。。。
作者: wuguoyan    时间: 2012-3-31 22:01
好资料,再次支持下,就是下载,比较蛋疼~~
作者: newhz    时间: 2012-3-31 22:01
fk2011 发表于 2012-3-31 21:55
单片机模拟文件系统?不懂。能否给个具体的思路,让大家都参考参考。  ...

我看圈圈的书里提到过,就模拟了一个文件系统,你可以找找看
作者: skynet    时间: 2012-3-31 22:03
图片要刷新多次,偶尔人品大爆发就看到了.泪奔...
附件下载失败,或者告诉你成功了,1点开1看,才10多KB,都是打开压缩文件失败.泪奔中.....
作者: fk2011    时间: 2012-3-31 22:04
skynet 发表于 2012-3-31 22:03
图片要刷新多次,偶尔人品大爆发就看到了.泪奔...
附件下载失败,或者告诉你成功了,1点开1看,才10多KB,都是打 ...

我好像给你用邮箱传了的。你看邮箱吧,可能网速问题,我这边不用刷也可以很容易看到图片,只是附件老是连接不上。
作者: lcptw    时间: 2012-3-31 22:06

技术积累贴

作者: airfex    时间: 2012-3-31 22:09
好资料,再次支持下
作者: sz_vipsms    时间: 2012-3-31 22:11
我现在项目都是用的SPI FLASH字库
效果很好
作者: abuffalo    时间: 2012-3-31 22:17
下载失败!
作者: armok    时间: 2012-4-1 08:16
提示: 作者被禁止或删除 内容自动屏蔽
作者: BloathX    时间: 2012-4-1 08:20
MARK学习一下
作者: size327948964    时间: 2012-4-1 08:47
FLASH足够大的话,可以直接就放在FLASH里,比如用J_LINK直接下载进去。
作者: jackwang123    时间: 2012-4-1 09:03
这个好啊,mark之
作者: niba    时间: 2012-4-1 09:06
SPI的FLASH价格怎样?8M的片子啥价格?
作者: cyq001    时间: 2012-4-1 09:08
收下资料,谢谢
作者: peiyan    时间: 2012-4-1 09:30
支持下,就是下载不了
作者: garyluris    时间: 2012-4-1 09:39
资料很有用!收下~~
作者: aitchow    时间: 2012-4-1 09:39
mark!!!!!!!!
作者: abuffalo    时间: 2012-4-1 13:46
还是无法下载!
作者: bi7kqm    时间: 2012-4-1 15:46
收藏了,多谢楼主
作者: qq635274216    时间: 2012-4-1 17:16
先MARK下,有空再来学习
作者: jetli    时间: 2012-4-1 17:21
用的是 w25Fxxx的spi芯片?
作者: won    时间: 2012-4-1 17:35
下载不了呢lz       !!!
作者: yu4514    时间: 2012-4-1 17:47
弄个SPI FLASH字库把  很便宜 3,4块钱
作者: vigour    时间: 2012-4-1 19:55
用512K的STM32 用256K装字库
作者: bzbs    时间: 2012-4-1 21:00
本帖最后由 bzbs 于 2012-4-1 21:02 编辑

弄个SPI FLASH字库把  很便宜 3,4块钱
---------------------------------------------------------------------------------------------
楼上说的就是高通字库,
如果排除盗版这个因素,批量生产时,外挂flash还是比楼上说的字库芯片性价比高,
毕竟外挂的flash,除了可以放字库之外还可以放其他的东西
作者: yueqia1988    时间: 2012-4-1 21:51
效果不错,学习一下
作者: zyyn123    时间: 2012-4-3 11:56
很好的资料,先收藏了,慢慢的学习,谢谢楼主。
作者: hopefly2    时间: 2012-4-3 14:16
字库制备!mark!楼主辛苦了!!
作者: pldjn    时间: 2012-4-3 14:26
如果有GB18030字库转C的工具就好了,GB2312字数太少,用起来有局限。
作者: ccao    时间: 2012-4-3 16:00
标注备用
作者: grant-liao    时间: 2012-4-3 17:37
很巧妙的方法。
只要简单实现目的都可以。
有机会试试
作者: hxh824    时间: 2012-4-9 14:47
为什么下载不了?
作者: horbour    时间: 2012-4-10 08:47
很想看看,但是下载不了啊!谁给我发份啊 abeitt@163.com  不胜感激
作者: a312835782    时间: 2012-4-10 09:49
正点原子的例程不就是用这个的吗?
作者: dragon_hn    时间: 2012-4-10 10:08
newhz 发表于 2012-3-31 21:29
要是有高手能改成usb就好了。
我现在有种思路:
让单片机模拟成usb大容量存储,电脑上给传输的话,单片机将 ...

其实不难.AVR32 SDK中有相应方案.
1.SPI FLASH按512字节读写(扇区).
2.FATFS按扇区操作FLASH(没疑问吧?).
3.USB MS按扇区操作FLASH(没疑问吧?).
4.当MCU读写SPI FLASH时,通过FATFS进行.
这样做的好处:可以PC通过USB更新字库或者GUI.
这样做的要求:MCU有USB DEVICE.



作者: buxinshan    时间: 2012-4-10 12:55
这资料太好了
作者: Asch    时间: 2012-4-10 13:04
可能会用得上,顶一下
作者: liycobl    时间: 2012-4-10 13:50
收藏了~~~~~~~~~~~~~~~~~~~~
作者: EasyEagle    时间: 2012-4-10 13:57
好资料,可惜我下载不了!
作者: dragon19809200    时间: 2012-4-17 13:33
刚试玩  很不错
作者: zhenglu891028    时间: 2012-4-17 16:36
资料先保存下来再说
作者: a305566    时间: 2012-4-18 22:17
正需要,多谢!!!
作者: nicotinecys    时间: 2012-4-18 23:59
不愧为精华帖
作者: Halley    时间: 2012-4-19 07:46
sd卡写入怎么样?
作者: xieguangye2001    时间: 2012-4-19 09:04
我使用了新塘MO+这款FLASH.硬件系统上跟楼主差不多,使用串口发送数据到M0再从MO通过SPI烧录到FLASH,有几点跟楼主不大一样。
1.烧录文件使用纯数据的bin文件,字模生成后,使用网上找到的Txt2Bin软件将得到bin文件。自动去除多余符号,无任何冗余数据烧到FLASH中。
2.串口助手AccessPort136,使用文件发送发送bin文件。大多数普通串口助手软件开缓存不够无法发送M级的大数据文件。
3.MO串口printf到PC端的串口助手AccessPort136,可显示FLASH操作工程。
作者: lisly    时间: 2012-4-19 12:11
标记备忘。
作者: w3154    时间: 2012-4-19 19:41
先收下,这么好的资料。
作者: xunke    时间: 2012-4-22 23:40
强!谢谢
作者: xiahang    时间: 2012-4-23 08:05
谢谢分享,学习一下
作者: xxtt1    时间: 2012-4-23 11:50
好,谢谢.........
作者: James_King    时间: 2012-4-23 13:51
好吧,谢谢
作者: mcujack    时间: 2012-4-23 14:06
及时,正要做一个字库方面的东西,完全没做过,借鉴一下,太感谢了
作者: frc272727    时间: 2012-4-23 16:44
标记下,方便查找
作者: liuchengone11    时间: 2012-4-23 16:50
谢谢,公司主板就是这样用的,工作不满一年的“打杂工”,嘿嘿
作者: shh_hqss    时间: 2012-4-23 16:58
mark  备用
作者: xingzhong    时间: 2012-4-23 17:56
mark!
作者: frc272727    时间: 2012-4-24 08:46
第五步:接着将“temp.txt”改名为“HzLib.txt”,然后运行“整理字库.exe”,此时将得到整理好的字库“OutHzLib.txt”
怎么运行“整理字库.exe”???

作者: CaineStrong    时间: 2012-4-24 09:11
mark。。
作者: 544410163    时间: 2012-4-24 10:42
总结……一种方法
作者: frc272727    时间: 2012-4-24 11:17
xieguangye2001 发表于 2012-4-19 09:04
我使用了新塘MO+这款FLASH.硬件系统上跟楼主差不多,使用串口发送数据到M0再从MO通过SPI烧录到FLASH,有几点 ...

这位仁兄
串口助手AccessPort136
这个软件能给一份吗?
网上找了很久都找不到
512289939@qq.com
作者: dengyue008    时间: 2012-4-24 11:23
这个要标记!
作者: wyz.0413    时间: 2012-4-24 14:27
貌似很有用
作者: 2006lc    时间: 2012-4-24 15:52
谢谢分享
作者: hefanghua    时间: 2012-4-25 20:09
UartAssist.exe 挂木马了。
作者: honda    时间: 2012-5-3 15:23
第七步,打开串口,将板子接通电源,首先对Flash进行擦除操作,提示擦除结束后,点击串口发送,然后就慢慢等着字库写入FLASH。测试在波特率为115200下,取模大小为16*16,耗时为70s,似乎也不太久,如果取模越大,耗时就越长。写好字模后,就可以在工程中调用字库进行中文显示了(取GBK内码操作见工程)。另外如果flash容量够大的话,还可以写入其它字体样式和大小的字库,做一个专属的字库芯片。
   

做得很不错。。。。。。。。。。。谢谢分享!!
这一步所说的擦除是怎样擦除FLASH的 ,能说具体点吗?
作者: zhengdahe    时间: 2012-5-3 15:32
留名备用
作者: newboymail00    时间: 2012-5-11 10:28
先收藏了
作者: chuntianhuihui    时间: 2012-5-18 11:41
附件:取点阵.exe 整理字库.exe UartAssist.exe 中文字库.txt OutHzLib.txt 以及STM32工程文件。没有取点阵.exe 整理字库.exe UartAssist.exe 这两个文件
作者: gdmgb520    时间: 2012-5-18 13:36
airfex 发表于 2012-3-31 22:09
好资料,再次支持下

兄弟,我还以为是自己已经回帖了
作者: dongfo    时间: 2012-5-18 14:33
好办法以后有空实施
作者: buttonsjj    时间: 2012-5-18 15:26
资料不错,附件下载失败
作者: huitong    时间: 2012-5-21 21:20
不错,正努力学习中。。。。
作者: loongsuns    时间: 2012-5-21 21:30
不错尽管用不到也收了,我用的还是bozai的方案,用着很舒服受用
作者: hhl1023    时间: 2012-5-23 13:14
正在学习呢!mark
作者: zzb1987    时间: 2012-5-27 17:15
mark,好贴,正用
作者: skyfight    时间: 2012-5-28 15:32
标记一家,以备不时之需
作者: iushiyuan    时间: 2012-5-28 16:17
niba 发表于 2012-4-1 09:06
SPI的FLASH价格怎样?8M的片子啥价格?

看你的量,看你用的是华邦品牌,还国产的GD,内存的价格不稳定的,所以你大概算的话就按2元应该可以
作者: zhurenjie35    时间: 2012-6-5 19:26
不错,学习中,顶
作者: gunslinger    时间: 2012-6-5 22:24
必须顶楼主,强烈顶!!
作者: buxinshan    时间: 2012-6-5 23:05
挺好的,学习了
作者: zhurenjie35    时间: 2012-6-7 20:04
谢谢楼主的分享,已经做好了。。但是有个问题,如果要输入标点符号和英文夹杂在汉字中,怎么解决
作者: wanwan-mcu    时间: 2012-6-16 20:09
这个得做个记号

作者: zhzj2007    时间: 2012-6-16 20:22
学习了,谢谢共享
作者: 湛无双    时间: 2012-6-17 11:35
太牛逼了  解决了 我一打难题  这个要顶 真的是技术贴
作者: myredit    时间: 2012-6-17 19:03
学习,谢谢楼主
作者: cqv    时间: 2012-6-17 21:39
mark
作者: dingshidong214    时间: 2012-6-17 22:04
mark标记
作者: delphiliu    时间: 2012-6-21 16:45
谢谢楼主啦。可否告诉我。你的flash存储器知识在哪里学的啊。现在搞不懂flash存储器。扇区。分页。。。等等。。。不懂啊
作者: apple_03    时间: 2012-7-3 12:09
把SPI芯片放烧写器里烧写,完成后再焊接到电路板,这样不是更舒服?
作者: chenfzg    时间: 2012-7-3 12:26
嗯嗯,值得学习!




欢迎光临 amobbs.com 阿莫电子技术论坛 (https://www.amobbs.com/) Powered by Discuz! X3.4