搜索
bottom↓
回复: 351

采用SPI Flash存储中文字符库(莫大哥可删之前酷贴)

  [复制链接]

出0入0汤圆

发表于 2012-3-31 21:01:24 | 显示全部楼层 |阅读模式
看到帖子第一次至酷,简直太酷了,为感谢各位网友支持,现整理调试记录,以便让有兴趣的坛友们自己也做个。
                                                             采用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”文件。

然后选择取模方式,可以设置字体样式、大小和方向设置等。注意“方向设置“选项,这里为了对应工程中的显示程序,选择——横向取模,高位在坐。其它选项只要适当修改显示程序就可以。

然后点击“输出“按钮,将在该目录下得到字模数组文件(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工程文件。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

发表于 2012-3-31 21:21:18 | 显示全部楼层
楼主为何要开两个帖子?

出0入0汤圆

 楼主| 发表于 2012-3-31 21:25:46 | 显示全部楼层
本帖最后由 fk2011 于 2012-3-31 21:28 编辑
lkl10800139 发表于 2012-3-31 21:21
楼主为何要开两个帖子?


之前那个帖子比较乱,只是说明了一般原理,这个帖子详细说明怎样去做字库芯片,本来想在上面编辑的,但是好像不可以。莫大删除即可!

出0入0汤圆

发表于 2012-3-31 21:27:51 | 显示全部楼层
不管怎么样
这个资料先保存下来再说

出0入0汤圆

发表于 2012-3-31 21:29:24 | 显示全部楼层
要是有高手能改成usb就好了。
我现在有种思路:
让单片机模拟成usb大容量存储,电脑上给传输的话,单片机将接受到数据存到SPI flash 如何?

出0入0汤圆

 楼主| 发表于 2012-3-31 21:34:11 | 显示全部楼层
本帖最后由 fk2011 于 2012-3-31 21:50 编辑
newhz 发表于 2012-3-31 21:29
要是有高手能改成usb就好了。
我现在有种思路:
让单片机模拟成usb大容量存储,电脑上给传输的话,单片机将 ...


感觉似乎可以,之前也成功给SPIFlash移植了fatfs,如果采用fatfs文件读写的方式读取字库应该没问题,改天试试。
spi flash 移植 FATFS 0.09

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-3-31 21:39:10 | 显示全部楼层
fk2011 发表于 2012-3-31 21:34
感觉似乎可以,之前也成功给SPIFlash移植了fatfs,如果采用fatfs文件读写的方式读取字库应该没问题,改天 ...

我感觉fatfs都不需要,单片机模拟文件系统给电脑,然后读取到的字库直接保存到flash的头地址

出0入0汤圆

 楼主| 发表于 2012-3-31 21:55:07 | 显示全部楼层
newhz 发表于 2012-3-31 21:39
我感觉fatfs都不需要,单片机模拟文件系统给电脑,然后读取到的字库直接保存到flash的头地址 ...

单片机模拟文件系统?不懂。能否给个具体的思路,让大家都参考参考。

出0入12汤圆

发表于 2012-3-31 21:55:39 | 显示全部楼层
图片都是红叉叉,唉
附件下载失败,唉

出0入0汤圆

 楼主| 发表于 2012-3-31 21:59:37 | 显示全部楼层
skynet 发表于 2012-3-31 21:55
图片都是红叉叉,唉
附件下载失败,唉

不会吧,我都能看到图片啊。只是附件好像确实不能下载诶。。。。

出0入0汤圆

发表于 2012-3-31 22:01:41 | 显示全部楼层
好资料,再次支持下,就是下载,比较蛋疼~~

出0入0汤圆

发表于 2012-3-31 22:01:56 | 显示全部楼层
fk2011 发表于 2012-3-31 21:55
单片机模拟文件系统?不懂。能否给个具体的思路,让大家都参考参考。  ...

我看圈圈的书里提到过,就模拟了一个文件系统,你可以找找看

出0入12汤圆

发表于 2012-3-31 22:03:03 | 显示全部楼层
图片要刷新多次,偶尔人品大爆发就看到了.泪奔...
附件下载失败,或者告诉你成功了,1点开1看,才10多KB,都是打开压缩文件失败.泪奔中.....

出0入0汤圆

 楼主| 发表于 2012-3-31 22:04:57 | 显示全部楼层
skynet 发表于 2012-3-31 22:03
图片要刷新多次,偶尔人品大爆发就看到了.泪奔...
附件下载失败,或者告诉你成功了,1点开1看,才10多KB,都是打 ...

我好像给你用邮箱传了的。你看邮箱吧,可能网速问题,我这边不用刷也可以很容易看到图片,只是附件老是连接不上。

出0入0汤圆

发表于 2012-3-31 22:06:00 | 显示全部楼层

技术积累贴

出0入0汤圆

发表于 2012-3-31 22:09:16 | 显示全部楼层
好资料,再次支持下

出0入0汤圆

发表于 2012-3-31 22:11:26 | 显示全部楼层
我现在项目都是用的SPI FLASH字库
效果很好

出0入0汤圆

发表于 2012-3-31 22:17:06 | 显示全部楼层
下载失败!
头像被屏蔽

出0入0汤圆

发表于 2012-4-1 08:16:42 | 显示全部楼层
COOL !

出0入0汤圆

发表于 2012-4-1 08:20:26 | 显示全部楼层
MARK学习一下

出0入0汤圆

发表于 2012-4-1 08:47:55 | 显示全部楼层
FLASH足够大的话,可以直接就放在FLASH里,比如用J_LINK直接下载进去。

出0入0汤圆

发表于 2012-4-1 09:03:55 | 显示全部楼层
这个好啊,mark之

出0入0汤圆

发表于 2012-4-1 09:06:33 | 显示全部楼层
SPI的FLASH价格怎样?8M的片子啥价格?

出0入0汤圆

发表于 2012-4-1 09:08:51 | 显示全部楼层
收下资料,谢谢

出50入0汤圆

发表于 2012-4-1 09:30:22 | 显示全部楼层
支持下,就是下载不了

出0入0汤圆

发表于 2012-4-1 09:39:23 | 显示全部楼层
资料很有用!收下~~

出0入0汤圆

发表于 2012-4-1 09:39:49 | 显示全部楼层
mark!!!!!!!!

出0入0汤圆

发表于 2012-4-1 13:46:40 | 显示全部楼层
还是无法下载!

出0入0汤圆

发表于 2012-4-1 15:46:36 | 显示全部楼层
收藏了,多谢楼主

出0入0汤圆

发表于 2012-4-1 17:16:38 | 显示全部楼层
先MARK下,有空再来学习

出0入0汤圆

发表于 2012-4-1 17:21:37 | 显示全部楼层
用的是 w25Fxxx的spi芯片?

出0入0汤圆

发表于 2012-4-1 17:35:35 | 显示全部楼层
下载不了呢lz       !!!

出0入0汤圆

发表于 2012-4-1 17:47:57 | 显示全部楼层
弄个SPI FLASH字库把  很便宜 3,4块钱

出0入0汤圆

发表于 2012-4-1 19:55:02 | 显示全部楼层
用512K的STM32 用256K装字库

出75入88汤圆

发表于 2012-4-1 21:00:40 | 显示全部楼层
本帖最后由 bzbs 于 2012-4-1 21:02 编辑

弄个SPI FLASH字库把  很便宜 3,4块钱
---------------------------------------------------------------------------------------------
楼上说的就是高通字库,
如果排除盗版这个因素,批量生产时,外挂flash还是比楼上说的字库芯片性价比高,
毕竟外挂的flash,除了可以放字库之外还可以放其他的东西

出0入0汤圆

发表于 2012-4-1 21:51:07 | 显示全部楼层
效果不错,学习一下

出0入0汤圆

发表于 2012-4-3 11:56:26 | 显示全部楼层
很好的资料,先收藏了,慢慢的学习,谢谢楼主。

出0入0汤圆

发表于 2012-4-3 14:16:24 | 显示全部楼层
字库制备!mark!楼主辛苦了!!

出0入0汤圆

发表于 2012-4-3 14:26:57 | 显示全部楼层
如果有GB18030字库转C的工具就好了,GB2312字数太少,用起来有局限。

出0入0汤圆

发表于 2012-4-3 16:00:27 | 显示全部楼层
标注备用

出0入0汤圆

发表于 2012-4-3 17:37:50 | 显示全部楼层
很巧妙的方法。
只要简单实现目的都可以。
有机会试试

出0入0汤圆

发表于 2012-4-9 14:47:13 | 显示全部楼层
为什么下载不了?

出0入0汤圆

发表于 2012-4-10 08:47:43 | 显示全部楼层
很想看看,但是下载不了啊!谁给我发份啊 abeitt@163.com  不胜感激

出0入0汤圆

发表于 2012-4-10 09:49:53 来自手机 | 显示全部楼层
正点原子的例程不就是用这个的吗?

出0入0汤圆

发表于 2012-4-10 10:08:39 | 显示全部楼层
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.


出0入0汤圆

发表于 2012-4-10 12:55:55 | 显示全部楼层
这资料太好了

出0入0汤圆

发表于 2012-4-10 13:04:05 | 显示全部楼层
可能会用得上,顶一下

出0入0汤圆

发表于 2012-4-10 13:50:07 | 显示全部楼层
收藏了~~~~~~~~~~~~~~~~~~~~

出0入0汤圆

发表于 2012-4-10 13:57:53 | 显示全部楼层
好资料,可惜我下载不了!

出0入0汤圆

发表于 2012-4-17 13:33:05 | 显示全部楼层
刚试玩  很不错

出0入0汤圆

发表于 2012-4-17 16:36:21 | 显示全部楼层
资料先保存下来再说

出0入0汤圆

发表于 2012-4-18 22:17:36 | 显示全部楼层
正需要,多谢!!!

出0入0汤圆

发表于 2012-4-18 23:59:03 | 显示全部楼层
不愧为精华帖

出0入0汤圆

发表于 2012-4-19 07:46:30 | 显示全部楼层
sd卡写入怎么样?

出0入0汤圆

发表于 2012-4-19 09:04:04 | 显示全部楼层
我使用了新塘MO+这款FLASH.硬件系统上跟楼主差不多,使用串口发送数据到M0再从MO通过SPI烧录到FLASH,有几点跟楼主不大一样。
1.烧录文件使用纯数据的bin文件,字模生成后,使用网上找到的Txt2Bin软件将得到bin文件。自动去除多余符号,无任何冗余数据烧到FLASH中。
2.串口助手AccessPort136,使用文件发送发送bin文件。大多数普通串口助手软件开缓存不够无法发送M级的大数据文件。
3.MO串口printf到PC端的串口助手AccessPort136,可显示FLASH操作工程。

出0入0汤圆

发表于 2012-4-19 12:11:18 | 显示全部楼层
标记备忘。

出0入0汤圆

发表于 2012-4-19 19:41:34 | 显示全部楼层
先收下,这么好的资料。

出0入112汤圆

发表于 2012-4-22 23:40:06 | 显示全部楼层
强!谢谢

出0入0汤圆

发表于 2012-4-23 08:05:13 | 显示全部楼层
谢谢分享,学习一下

出0入0汤圆

发表于 2012-4-23 11:50:12 | 显示全部楼层
好,谢谢.........

出0入0汤圆

发表于 2012-4-23 13:51:05 | 显示全部楼层
好吧,谢谢

出0入0汤圆

发表于 2012-4-23 14:06:07 | 显示全部楼层
及时,正要做一个字库方面的东西,完全没做过,借鉴一下,太感谢了

出0入0汤圆

发表于 2012-4-23 16:44:48 | 显示全部楼层
标记下,方便查找

出0入0汤圆

发表于 2012-4-23 16:50:11 | 显示全部楼层
谢谢,公司主板就是这样用的,工作不满一年的“打杂工”,嘿嘿

出0入0汤圆

发表于 2012-4-23 16:58:08 | 显示全部楼层
mark  备用

出0入0汤圆

发表于 2012-4-23 17:56:47 | 显示全部楼层
mark!

出0入0汤圆

发表于 2012-4-24 08:46:11 | 显示全部楼层
第五步:接着将“temp.txt”改名为“HzLib.txt”,然后运行“整理字库.exe”,此时将得到整理好的字库“OutHzLib.txt”
怎么运行“整理字库.exe”???

出0入0汤圆

发表于 2012-4-24 09:11:14 | 显示全部楼层
mark。。

出0入0汤圆

发表于 2012-4-24 10:42:47 | 显示全部楼层
总结……一种方法

出0入0汤圆

发表于 2012-4-24 11:17:35 | 显示全部楼层
xieguangye2001 发表于 2012-4-19 09:04
我使用了新塘MO+这款FLASH.硬件系统上跟楼主差不多,使用串口发送数据到M0再从MO通过SPI烧录到FLASH,有几点 ...

这位仁兄
串口助手AccessPort136
这个软件能给一份吗?
网上找了很久都找不到
512289939@qq.com

出0入0汤圆

发表于 2012-4-24 11:23:58 | 显示全部楼层
这个要标记!

出0入0汤圆

发表于 2012-4-24 14:27:09 | 显示全部楼层
貌似很有用

出0入0汤圆

发表于 2012-4-24 15:52:35 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2012-4-25 20:09:34 | 显示全部楼层
UartAssist.exe 挂木马了。

出0入0汤圆

发表于 2012-5-3 15:23:07 | 显示全部楼层
第七步,打开串口,将板子接通电源,首先对Flash进行擦除操作,提示擦除结束后,点击串口发送,然后就慢慢等着字库写入FLASH。测试在波特率为115200下,取模大小为16*16,耗时为70s,似乎也不太久,如果取模越大,耗时就越长。写好字模后,就可以在工程中调用字库进行中文显示了(取GBK内码操作见工程)。另外如果flash容量够大的话,还可以写入其它字体样式和大小的字库,做一个专属的字库芯片。
   

做得很不错。。。。。。。。。。。谢谢分享!!
这一步所说的擦除是怎样擦除FLASH的 ,能说具体点吗?

出0入0汤圆

发表于 2012-5-3 15:32:23 | 显示全部楼层
留名备用

出0入0汤圆

发表于 2012-5-11 10:28:20 | 显示全部楼层
先收藏了

出0入0汤圆

发表于 2012-5-18 11:41:09 | 显示全部楼层
附件:取点阵.exe 整理字库.exe UartAssist.exe 中文字库.txt OutHzLib.txt 以及STM32工程文件。没有取点阵.exe 整理字库.exe UartAssist.exe 这两个文件

出0入0汤圆

发表于 2012-5-18 13:36:14 | 显示全部楼层
airfex 发表于 2012-3-31 22:09
好资料,再次支持下

兄弟,我还以为是自己已经回帖了

出0入0汤圆

发表于 2012-5-18 14:33:54 | 显示全部楼层
好办法以后有空实施

出0入0汤圆

发表于 2012-5-18 15:26:33 | 显示全部楼层
资料不错,附件下载失败

出0入0汤圆

发表于 2012-5-21 21:20:05 | 显示全部楼层
不错,正努力学习中。。。。

出0入0汤圆

发表于 2012-5-21 21:30:58 | 显示全部楼层
不错尽管用不到也收了,我用的还是bozai的方案,用着很舒服受用

出0入0汤圆

发表于 2012-5-23 13:14:50 | 显示全部楼层
正在学习呢!mark

出0入0汤圆

发表于 2012-5-27 17:15:26 | 显示全部楼层
mark,好贴,正用

出0入0汤圆

发表于 2012-5-28 15:32:59 | 显示全部楼层
标记一家,以备不时之需

出0入0汤圆

发表于 2012-5-28 16:17:12 | 显示全部楼层
niba 发表于 2012-4-1 09:06
SPI的FLASH价格怎样?8M的片子啥价格?

看你的量,看你用的是华邦品牌,还国产的GD,内存的价格不稳定的,所以你大概算的话就按2元应该可以

出0入0汤圆

发表于 2012-6-5 19:26:51 | 显示全部楼层
不错,学习中,顶

出0入0汤圆

发表于 2012-6-5 22:24:45 | 显示全部楼层
必须顶楼主,强烈顶!!

出0入0汤圆

发表于 2012-6-5 23:05:16 来自手机 | 显示全部楼层
挺好的,学习了

出0入0汤圆

发表于 2012-6-7 20:04:14 | 显示全部楼层
谢谢楼主的分享,已经做好了。。但是有个问题,如果要输入标点符号和英文夹杂在汉字中,怎么解决
头像被屏蔽

出0入0汤圆

发表于 2012-6-16 20:09:48 | 显示全部楼层
这个得做个记号

出0入0汤圆

发表于 2012-6-16 20:22:09 | 显示全部楼层
学习了,谢谢共享

出0入0汤圆

发表于 2012-6-17 11:35:33 | 显示全部楼层
太牛逼了  解决了 我一打难题  这个要顶 真的是技术贴

出0入0汤圆

发表于 2012-6-17 19:03:59 | 显示全部楼层
学习,谢谢楼主

出0入0汤圆

发表于 2012-6-17 21:39:58 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-6-17 22:04:19 | 显示全部楼层
mark标记

出0入0汤圆

发表于 2012-6-21 16:45:37 | 显示全部楼层
谢谢楼主啦。可否告诉我。你的flash存储器知识在哪里学的啊。现在搞不懂flash存储器。扇区。分页。。。等等。。。不懂啊

出0入0汤圆

发表于 2012-7-3 12:09:12 | 显示全部楼层
把SPI芯片放烧写器里烧写,完成后再焊接到电路板,这样不是更舒服?

出0入0汤圆

发表于 2012-7-3 12:26:18 | 显示全部楼层
嗯嗯,值得学习!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 18:58

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表