OpenEdv-开源电子网

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

关于汉字显示实验的更新字库部分的疑问

[复制链接]

13

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2013-8-3
在线时间
1 小时
发表于 2013-8-23 15:15:32 | 显示全部楼层 |阅读模式
在stm32库函数版本的pdf第618页,课本第456页,有关于汉字的GBK12,GBK16和UNIGBK部分的刷写进flash的操作
现摘取部分内容如下:
while(res==FR_OK)//死循环执行
{
  res=f_read(fftemp,tempbuf,4096,(UINT *)&bread);//读取数据     
  if(res!=FR_OK)break;            //执行错误
  SPI_Flash_Write(tempbuf,offx+flashaddr,4096);  //从 0 开始写入4096个数据  
  offx+=bread;      
  fupd_prog(x,y,size,fftemp->fsize,offx);        //进度显示
  if(bread!=4096)break;            //读完了.
}
红颜色显示的部分感觉有误:我的理解是这样的,按照原子哥的程序,三个字库是顺序刷入flash的,当第一个字库
完全刷入后,最后那部分的数据量即bread的数值应该会小于4096,可是,红颜色的部分显示部分表明,最后那部分
数据也是刷入了4K字节,那么就会使最后一个字节的地址后(4096-bread)个地址被刷入数据,这样,第二个字库
是从最后一字节的地址开始写入,而外部flash写入前会进行校验,由于开始地址之后的部分地址有数据,那么就会校验
失败,会将这个4K的flash扇区进行擦除,那么就实际上第一个字库的最后部分的内容会被刷成0xFF;

我认为,那个4096如果改成bread,则可以避免这个现象。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2013-8-3
在线时间
1 小时
 楼主| 发表于 2013-8-25 16:51:35 | 显示全部楼层
原子哥,帮忙看一下啊。。。。。。。怎么没有人搭理我啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-25 22:00:26 | 显示全部楼层
确实会有这个问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

13

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2013-8-3
在线时间
1 小时
 楼主| 发表于 2013-8-26 08:54:34 | 显示全部楼层


回复【3楼】 正点原子 :
------------------------------
回复【3楼】 正点原子 :
---------------------------------
原子哥,是不是那个4096如果改成bread,则可以避免这个现象?

还有一个问题就是,在同样一页的另一个函数u8 update_font(u16 x,u16 y,u8 size,u8 src),在我的理解看来,也是有问题的,
现复制原函数如下:
u8 update_font(u16 x,u16 y,u8 size,u8 src)
{    
    u8 *gbk16_path;
    u8 *gbk12_path;
    u8 *unigbk_path;
    u8 res;          
    if(src)//从25qxx更新
    {
        unigbk_path=(u8*)UNIGBK_25QPATH;
        gbk12_path=(u8*)GBK12_25QPATH;
        gbk16_path=(u8*)GBK16_25QPATH;
    }else//从sd卡更新
    {
        unigbk_path=(u8*)UNIGBK_SDPATH;
        gbk12_path=(u8*)GBK12_SDPATH;
        gbk16_path=(u8*)GBK16_SDPATH;
    }   
     res=0XFF;        
    ftinfo.fontok=0XFF;
     SPI_Flash_Write((u8*)&ftinfo,FONTINFOADDR,sizeof(ftinfo));    //清除之前字库成功的标志.防止更新到一半重启,导致的字库部分数据丢失.
     SPI_Flash_Read((u8*)&ftinfo,FONTINFOADDR,sizeof(ftinfo));    //重新读出ftinfo结构体数据
     LCD_ShowString(x,y,240,320,size,"Updating UNIGBK.BIN");        
    res=updata_fontx(x+20*size/2,y,size,unigbk_path,0);            //更新UNIGBK.BIN
    if(res)return 1;
     LCD_ShowString(x,y,240,320,size,"Updating GBK12.BIN  ");
    res=updata_fontx(x+20*size/2,y,size,gbk12_path,1);            //更新GBK12.FON
    if(res)return 2;
    LCD_ShowString(x,y,240,320,size,"Updating GBK16.BIN  ");
    res=updata_fontx(x+20*size/2,y,size,gbk16_path,2);            //更新GBK16.FON
    if(res)return 3;       
    //全部更新好了
    ftinfo.fontok=0XAA;
      SPI_Flash_Write((u8*)&ftinfo,FONTINFOADDR,sizeof(ftinfo));    //保存字库信息
    return 0;//无错误.        


红色的代码表明是从flash开始更新,我有点不理解,意思是从外部flash中读取数据,然后再刷入外部flash里面,对吗?
如果是这样的,好像这样做,没什么意义。。。。。。只要保留从SD卡刷flash,这一步,不就行了吗??
是不是我哪里对这段程序理解不对啊,望原子哥给点提示。。。。。。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-26 10:37:20 | 显示全部楼层
回复【4楼】冰封小凯:
---------------------------------
1,是的。
2,因为我们的外部FLASH,分成3部分了:字库部分,文件系统管理部分(模拟成U盘),用户使用部分。
所以字库从外部flash更新就是:从模拟U盘读取字库,刷入字库部分flash区域。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

13

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2013-8-3
在线时间
1 小时
 楼主| 发表于 2013-8-26 16:17:02 | 显示全部楼层
回复【5楼】正点原子:
----------------------------
原子哥,你这样说我就有点明白了,可是,咱们都知道,没法像SD卡那样,通过PC机,直接下载字库文件到W25Q64 flash
芯片的文件管理部分,然后通过这个函数转移到字库部分。
按照你的说法,是不是这个意思;我们可以通过文件系统将SD卡的内容转移到W25Q64 flash芯片的文件管理部分,然后通过
这个函数设置从flash更新字库,达到更新字库的目的,是这样吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-26 18:54:29 | 显示全部楼层
回复【6楼】冰封小凯:
---------------------------------
是可以这么做。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

13

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2013-8-3
在线时间
1 小时
 楼主| 发表于 2013-8-29 21:55:48 | 显示全部楼层
原子哥,今天晚上,我对这个问题进行的一下验证,结果很令我吃惊,竟然,没有出现我在这个贴子里所猜测的那个问题。
我验证的方法是在汉字显示实验主函数的最下面的那个while(1)循环里添加了一个读flash第二个和第三个字库的倒数15个
字符,通过JTAG,输出观察,验证这个字符是不是很来的字库的内容相。结果跟原来的一样。。。。。。。


原子哥帮忙试一下这个程序,使用前得把这个压缩包的system文件拷到SD卡根目录,因为我把第二第三个字库的倒数15个字符
改了一下,方便测试,下载到战舰开发板上,刷新一下,flash字库,就可以通过调试观察,我定义的buffer内容,进行验证了。。。


汉字显示实验原例程修改.zip

7.88 MB, 下载次数: 468

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-29 23:52:11 | 显示全部楼层
回复【8楼】冰封小凯:
---------------------------------
最后一次是写入多少个字节?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

13

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2013-8-3
在线时间
1 小时
 楼主| 发表于 2013-8-30 17:10:00 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
不是第三个字库GBK16总大小的字节数吗?我觉得主要是看写入的第二个GBK12字库末尾的字节,看看有没有发生改变就,这个是重点。。。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-30 23:20:29 | 显示全部楼层
回复【10楼】冰封小凯:
---------------------------------
没有问题的了。
你写4096,无非就是把后面的数据多写了一点点罢了,后续你还是会重新写一次。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

13

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2013-8-3
在线时间
1 小时
 楼主| 发表于 2013-8-31 10:38:20 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
对啊,它是先读出整个扇区到数组里,忘了这一步了,我一直还怀疑,为什么每次写入那个SPI_FLASH_BUF[]数组,只写后面那部分,而没有管前面的数据。原来,前面的数据存放的是擦除前的数据。

谢谢原子哥的辛勤帮助。。。。。。。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-13 22:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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