OpenEdv-开源电子网

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

FATfs在MINI STM32上怎么支持中文名文件啊

[复制链接]

12

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2013-4-4
在线时间
17 小时
发表于 2013-7-26 13:33:57 | 显示全部楼层 |阅读模式
在MINI板子上移植了FATFS,基本的功能都可以了,想支持中文名,可是内存不够,有没有哪位高手有好的方法?
技术的乐趣在于分享。。。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

26

主题

194

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1175
金钱
1175
注册时间
2011-8-20
在线时间
21 小时
发表于 2013-7-26 13:42:01 | 显示全部楼层
是支持长文件名吧? 把cc936.c那里面两个很大的数组搞出来,转成bin文件存在外部spi flash,再把ff_convert修改一下
for( int i=0; i<(1.0/0); i++ ) { for( int j=0; j<365; j++) money ++; age ++; if( age > 30 ) ChangeJob( Boss ); } 脸上的痘痘提醒我?我还年轻?口袋的米米告诉我?我仍需努力
回复 支持 反对

使用道具 举报

12

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2013-4-4
在线时间
17 小时
 楼主| 发表于 2013-7-26 14:05:07 | 显示全部楼层
回复【2楼】subo19920716:
--------------------------------
请问一下ff_convert是什么,在哪里啊?
技术的乐趣在于分享。。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

12

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2013-4-4
在线时间
17 小时
 楼主| 发表于 2013-7-26 19:54:06 | 显示全部楼层
回复【2楼】subo19920716:
---------------------------------
请问一下,怎么转换成bin文件呢?网上没搜到。。。
技术的乐趣在于分享。。。。
回复 支持 反对

使用道具 举报

26

主题

194

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1175
金钱
1175
注册时间
2011-8-20
在线时间
21 小时
发表于 2013-7-26 20:17:55 | 显示全部楼层
回复【5楼】zf:
---------------------------------
网上有这样的软件,原子哥也写了个啊
http://www.openedv.com/posts/list/2689.htm
for( int i=0; i<(1.0/0); i++ ) { for( int j=0; j<365; j++) money ++; age ++; if( age > 30 ) ChangeJob( Boss ); } 脸上的痘痘提醒我?我还年轻?口袋的米米告诉我?我仍需努力
回复 支持 反对

使用道具 举报

12

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2013-4-4
在线时间
17 小时
 楼主| 发表于 2013-7-26 20:26:07 | 显示全部楼层
回复【6楼】subo19920716:
---------------------------------
哦哦,非常感谢了啊!!!
技术的乐趣在于分享。。。。
回复 支持 反对

使用道具 举报

12

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2013-4-4
在线时间
17 小时
 楼主| 发表于 2013-7-27 10:26:20 | 显示全部楼层
回复【6楼】subo19920716:
---------------------------------
请问一下,我想把bin文件传给SPI flash,可不可以用USART加DMA直接传输给外部flash?
技术的乐趣在于分享。。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165538
金钱
165538
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-27 10:31:19 | 显示全部楼层
回复【8楼】zf:
---------------------------------
uart+dma???
spi flash是SPI接口,合适扯到uart上去了?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2013-4-4
在线时间
17 小时
 楼主| 发表于 2013-7-27 10:33:42 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
可是,文件怎么传输给FLASH呢?太大了。。
技术的乐趣在于分享。。。。
回复 支持 反对

使用道具 举报

12

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2013-4-4
在线时间
17 小时
 楼主| 发表于 2013-7-27 11:45:38 | 显示全部楼层
回复【10楼】zf:
---------------------------------
知道怎么弄了,USART中断,传一个发一个。。。
技术的乐趣在于分享。。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165538
金钱
165538
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-27 12:08:39 | 显示全部楼层
回复【10楼】zf:
---------------------------------
我比较喜欢用SD卡,当然你用uart也可以啊,做协议了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2013-4-4
在线时间
17 小时
 楼主| 发表于 2013-7-27 21:39:20 | 显示全部楼层
回复【12楼】正点原子:
---------------------------------
void Read_Dir_All( char *dir_path)
{
   FATFS fs;
   DIR   dir;
   FILINFO fno;
   FRESULT res;
   char *fn;


#if _USE_LFN
    fn = *fno.lfname ? fno.lfname: fno.fname;
#else
    fn = fno.lfname;
#endif
    
   res = f_mount( 0, &fs);
   if( res == FR_OK )
  {    
       //LCD_ShowString( 30, 1 + i*20, (u8 *)dir_path);
   printf( "%s\n", dir_path );
   if( f_opendir(&dir,(char *)dir_path) == FR_OK){
  //i++;
      while( f_readdir( &dir, &fno) == FR_OK){

     if(!fn[0])break;
 if(fn[0] == '.') continue;
 //LCD_ShowString( 40, 1 + i*20, (u8 *)fno.fname);
 printf( "%s", fn );
 //i++;
  }
   }
  }
}
把这段程序中#if _USE_LFN
    fn = *fno.lfname ? fno.lfname: fno.fname;
#else
    fn = fno.lfname;
#endif
改为
    fn = fno.fname中文文件夹串口就能显示出来 
   你说能把中文名的文件夹显示出来是不是就是支持中文了啊

如果不改,串口接受到的是好多?,且一直在接受问号
技术的乐趣在于分享。。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165538
金钱
165538
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-27 21:55:12 | 显示全部楼层
回复【13楼】zf:
---------------------------------
要看长文件名,是否支持.
如果不改串口接收的是好多???
这个啥意思?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

26

主题

194

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1175
金钱
1175
注册时间
2011-8-20
在线时间
21 小时
发表于 2013-7-28 03:42:57 | 显示全部楼层
没那么复杂吧。我是这么做的,可以用:把 cc936.c 的两个数组搞出来,转成了两个文件,把这两个文件通过sd卡存入spi flash,记录好这两个文件在spi flash中的首地址。
然后修改 cc936.c 里面的一个函数

灰色的是注释掉的源码,黄色的是添加进去的,修改的代码我也不管他的原理是神马,照着葫芦画瓢就是。

WCHAR ff_convert ( /* Converted code, 0 means conversion error */
WCHAR src, /* Character code to be converted */
UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */
)
{
// const WCHAR *p;
WCHAR c;
int i, n, li, hi;
uint8_t t[4];
WCHAR p[2];
uint32_t addr;

if (src < 0x80) 
{ /* ASCII */
c = src;
else
{
if (dir) 
{ /* OEMCP to unicode */
// p = oem2uni;
// hi = sizeof(oem2uni) / 4 - 1;
addr = SYSTEM_OEM2UNI_ADDRESS;  源码中p指针记录的是oem2uni数组首地址,这里用个变量记录spi flash存放数组的首地址,“模拟”原作者的意思吧
hi = 87172/4 - 1; 这个87172把数组转成二进制文件后在电脑里查看属性可以知道是87172字节,如果不是这个值,那么你就转错了
else 
{ /* Unicode to OEMCP */
// p = uni2oem;
// hi = sizeof(uni2oem) / 4 - 1;
addr = SYSTEM_UNI2OEM_ADDRESS;
hi = 87172/4 - 1;
}
li = 0;
for (n = 16; n; n--)
{
i = li + (hi - li) / 2;

w25x_read_buffer(t, addr + i*2*2, 4); /*  i*2*2: original 'uni2oem[]' arrary is unsigned short type, 
        *  but w25x per unit is unsigned char. 
        */ 读取数据,spi flash读出的单位是unsigned char,uni2oem数组的元素是unsigned short的,所以每次得读 i * 2个拼凑成一个unsigned short,下面的代码有个p[i * 2 + 1],所以每次就得读 i *2*2了,也就是4字节。
p[0] = (t[1] << 8) | t[0];  把读出的四个字节拼凑成unsigned short,至于这里为什么是 (t[1] << 8) | t[0],因为原子哥那软件对于unsigned short会把高字节放在后面,低字节放在前面。这里要注意下,搞反了直接挂,我第一次搞就挂在这里了。。。
p[1] = (t[3] << 8) | t[2];拼凑好后直接传给后面的代码了,不用管了
// if (src == p[i * 2]) break;
// if (src > p[i * 2])
// li = i;
// else
// hi = i;
if(src == p[0])break;
if(src > p[0])
li = i;
else
hi = i;
}
// c = n ? p[i * 2 + 1] : 0;
c = n ? p[1] : 0;
}

return c;
}

我这么搞了可以用,你觉得有用就试试吧。


for( int i=0; i<(1.0/0); i++ ) { for( int j=0; j<365; j++) money ++; age ++; if( age > 30 ) ChangeJob( Boss ); } 脸上的痘痘提醒我?我还年轻?口袋的米米告诉我?我仍需努力
回复 支持 反对

使用道具 举报

7

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2013-8-11
在线时间
0 小时
发表于 2013-12-14 19:37:31 | 显示全部楼层
回复【13楼】zf:
---------------------------------
楼主,实现了显示中文的文件了吗?能发个例程上来吗?谢谢
没有学不会的事情
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-15 16:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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