OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 13368|回复: 26

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

[复制链接]

63

主题

223

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2012-6-28
在线时间
0 小时
发表于 2012-7-17 09:45:15 | 显示全部楼层 |阅读模式

首先问下 转帖不让转的是哇? 是的话这是最后一次转了
为感谢各位网友支持,现整理调试记录,以便让有兴趣的坛友们自己也做个。
                                                             采用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了

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



专营STM8/32
QQ 940436962
http://y-ec.taobao.com/


20521660lbhw4ddcjc4vl3.jpg.thumb.jpg
2.jpg.thumb.jpg
4.jpg.thumb.jpg
3.jpg.thumb.jpg

205834r9x7vf7wgpvw6jpw.zip

1.13 MB, 下载次数: 9915

205853s7n6vgd2vz7yuxy5.zip

1.14 MB, 下载次数: 8197

http://www.y-ec.com/
http://y-ec.taobao.com/
QQ?940436962
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2012-7-17 10:36:31 | 显示全部楼层
支持转帖的.
更支持原创.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2012-6-21
在线时间
12 小时
发表于 2012-7-17 15:51:17 | 显示全部楼层
这个帖好,如果不是楼主转帖,我肯定看不到。多谢fuqing5542! 
回复 支持 反对

使用道具 举报

63

主题

223

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2012-6-28
在线时间
0 小时
 楼主| 发表于 2012-8-29 14:53:47 | 显示全部楼层
嗯哼 哈哈哈
http://www.y-ec.com/
http://y-ec.taobao.com/
QQ?940436962
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2012-7-24
在线时间
0 小时
发表于 2012-8-30 17:58:37 | 显示全部楼层
不错,顶楼主
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2012-8-11
在线时间
0 小时
发表于 2012-8-30 18:19:45 | 显示全部楼层
这个必须收藏
回复 支持 反对

使用道具 举报

27

主题

274

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
472
金钱
472
注册时间
2011-11-2
在线时间
11 小时
发表于 2012-8-30 21:22:12 | 显示全部楼层
必须顶,好料。希望再来个多国语言之类的。
回复 支持 反对

使用道具 举报

6

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2012-8-16
在线时间
3 小时
发表于 2012-8-30 22:07:54 | 显示全部楼层
弱弱的问下 在例程里的这些命令写到flash里有什么用 啊
#define W25X_WriteEnable 0x06 
#define W25X_WriteDisable 0x04 
#define W25X_ReadStatusReg 0x05 
#define W25X_WriteStatusReg 0x01 
#define W25X_ReadData 0x03 
#define W25X_FastReadData 0x0B 
#define W25X_FastReadDual 0x3B 
#define W25X_PageProgram 0x02 
#define W25X_BlockErase 0xD8 
#define W25X_SectorErase 0x20 
#define W25X_ChipErase 0xC7 
#define W25X_PowerDown 0xB9 
#define W25X_ReleasePowerDown 0xAB 
#define W25X_DeviceID 0xAB 
#define W25X_ManufactDeviceID 0x90 
#define W25X_JedecDeviceID 0x9F 
回复 支持 反对

使用道具 举报

63

主题

223

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2012-6-28
在线时间
0 小时
 楼主| 发表于 2012-8-31 09:33:56 | 显示全部楼层
嗯哼 谢谢大家的支持  顶我自己
http://www.y-ec.com/
http://y-ec.taobao.com/
QQ?940436962
回复 支持 反对

使用道具 举报

6

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2012-8-16
在线时间
3 小时
发表于 2012-8-31 09:47:48 | 显示全部楼层
请问原子哥下  例程里的程序是硬件的SPI么   还是 软件模拟的SPI
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2012-8-31 14:37:04 | 显示全部楼层
回复【10楼】枫过云叶:
---------------------------------
硬件SPI
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

63

主题

223

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2012-6-28
在线时间
0 小时
 楼主| 发表于 2012-9-3 11:23:23 | 显示全部楼层
顶原子!!!!!!!!!!!!
http://www.y-ec.com/
http://y-ec.taobao.com/
QQ?940436962
回复 支持 反对

使用道具 举报

63

主题

223

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2012-6-28
在线时间
0 小时
 楼主| 发表于 2012-9-26 10:12:14 | 显示全部楼层
原子威武
回复 支持 反对

使用道具 举报

44

主题

186

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1260
金钱
1260
注册时间
2012-9-1
在线时间
67 小时
发表于 2012-10-17 19:57:50 | 显示全部楼层
留名标记
回复 支持 反对

使用道具 举报

63

主题

223

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2012-6-28
在线时间
0 小时
 楼主| 发表于 2012-10-19 09:24:23 | 显示全部楼层
哈哈
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2013-3-13
在线时间
0 小时
发表于 2013-4-18 23:25:13 | 显示全部楼层
回复【楼主位】fuqing5542:
---------------------------------
很好的资料。多谢!
回复 支持 反对

使用道具 举报

7

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2013-5-12
在线时间
0 小时
发表于 2013-8-5 21:32:15 | 显示全部楼层
W25X_Read_Bytes(((High8bit-0xb0)*94+Low8bit-0xa1)*32,pBuffer,32);这里面的(High8bit-0xb0)*94+Low8bit-0xa1是根据什么得到的啊?
回复 支持 反对

使用道具 举报

7

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2013-5-12
在线时间
0 小时
发表于 2013-8-5 21:33:43 | 显示全部楼层
回复【15楼】fuqing5542:
---------------------------------
W25X_Read_Bytes(((High8bit-0xb0)*94+Low8bit-0xa1)*32,pBuffer,32);这里面的(High8bit-0xb0)*94+Low8bit-0xa1是根据什么得到的啊
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-11-7
在线时间
0 小时
发表于 2013-11-13 15:43:31 | 显示全部楼层
xie le
回复 支持 反对

使用道具 举报

15

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2014-10-31
在线时间
4 小时
发表于 2014-11-22 15:37:06 | 显示全部楼层
谢谢分享,顶顶顶
总有一天,要为自由而活
回复 支持 反对

使用道具 举报

15

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2014-10-31
在线时间
4 小时
发表于 2014-11-22 18:35:48 | 显示全部楼层
程序怎么烧不进去啊,我的芯片是stm32f107vc
总有一天,要为自由而活
回复 支持 反对

使用道具 举报

15

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2014-10-31
在线时间
4 小时
发表于 2014-11-22 18:43:47 | 显示全部楼层
请问为什么我的板子(stm32f107vc)烧不进去啊  

总有一天,要为自由而活
回复 支持 反对

使用道具 举报

15

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2014-10-31
在线时间
4 小时
发表于 2014-11-22 18:53:06 | 显示全部楼层
回复【18楼】小馒头LZ:
---------------------------------
请问程序怎么烧不进去啊,我的芯片是stm32f107vc
总有一天,要为自由而活
回复 支持 反对

使用道具 举报

28

主题

89

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2014-9-30
在线时间
0 小时
发表于 2014-12-10 17:14:00 | 显示全部楼层
spi flash信息存储,不错
回复 支持 反对

使用道具 举报

9

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
426
金钱
426
注册时间
2011-7-11
在线时间
49 小时
发表于 2015-3-28 10:52:22 | 显示全部楼层
mark下,做字库的时候来看看
回复 支持 反对

使用道具 举报

5

主题

62

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
426
金钱
426
注册时间
2016-3-9
在线时间
75 小时
发表于 2016-9-20 23:58:09 | 显示全部楼层
MARK!!!
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2018-6-25
在线时间
1 小时
发表于 2018-6-25 16:37:38 | 显示全部楼层
你好,为什么用串口发送字库文件的时候,只有前面4096字节正确,后面全错了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-26 10:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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