OpenEdv-开源电子网

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

f_open()函数无法建立文件

[复制链接]

4

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2014-4-3
在线时间
2 小时
发表于 2014-12-22 16:57:32 | 显示全部楼层 |阅读模式
5金钱
原子老师:
      您好!我在运用f_open()函数建立文件时,总是无法建立,调试运行时发现,程序总是停在如下标注处,这是为什么呢?
FRESULT f_open (
FIL *fp, /* Pointer to the blank file object */
const TCHAR *path, /* Pointer to the file name */
BYTE mode /* Access mode and file open mode flags */
)
{
FRESULT res;
DIR dj;
BYTE *dir;
DEF_NAMEBUF;


fp->fs = 0; /* Clear file object */

#if !_FS_READONLY
mode &= FA_READ | FA_WRITE | FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW;
res = chk_mounted(&path, &dj.fs, (BYTE)(mode & ~FA_READ));


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2014-4-3
在线时间
2 小时
 楼主| 发表于 2014-12-22 16:58:40 | 显示全部楼层
//数据存储
  //以当前时间(精确到分)为名字,建立一个文件
   sprintf(currenttime,"%d%d%d%d%d%d%d%d%d%d.doc",Systime_year/10,Systime_year%10,Systime_month/10,Systime_month%10,Systime_day/10,Systime_day%10,Systime_hour/10,Systime_hour%10,Systime_minute/10,Systime_minute%10);
//   sprintf(currenttime,"%d%d%d%d%d%d.doc",Systime_year/10,Systime_year%10,Systime_month/10,Systime_month%10,Systime_day/10,Systime_day%10);

 f_open(&fdst,currenttime,FA_OPEN_ALWAYS|FA_WRITE); //打开或创建以当前时间为名字的文件夹
这是我的程序。。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165585
金钱
165585
注册时间
2010-12-1
在线时间
2119 小时
发表于 2014-12-22 19:37:07 | 显示全部楼层
这地方是不可能停止才对啊,这就是个简单的语句,不会导致死机啊。再查查其它地方。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2014-4-3
在线时间
2 小时
 楼主| 发表于 2014-12-23 15:23:37 | 显示全部楼层
老师,这个问题今天莫名其妙的自己就好了。。。现在又出现了其他问题,详见如下代码:
[mw_shl_code=c,true]//显示“数据存储中。。。”界面 //数据存储中... LCD_Fill(15,205,300,238,BLUE); //画一个方块 Backcolor_flag = 1; //绘点背景色为蓝色 POINT_COLOR = RED; //设置画笔颜色为红色 LCD_ShowChinese(30,207,41,30,0); //数 LCD_ShowChinese(55,207,66,30,0); //据 LCD_ShowChinese(80,207,67,30,0); //存 LCD_ShowChinese(105,207,68,30,0);//储 LCD_ShowChinese(130,207,69,30,0);//中 LCD_ShowChinese(155,202,0,18,0); //. LCD_ShowChinese(170,202,1,18,0); //. LCD_ShowChinese(185,202,2,18,0); //. POINT_COLOR = WHITE; //设置画笔颜色为白色 //获取当前时间 currenttime[0] = Systime_year/10; currenttime[1] = Systime_year%10; currenttime[2] = Systime_month/10; currenttime[3] = Systime_month%10; currenttime[4] = Systime_day/10; currenttime[5] = Systime_day%10; currenttime[6] = Systime_hour/10; currenttime[7] = Systime_hour%10; currenttime[8] = Systime_minute/10; currenttime[9] = Systime_minute%10; currenttime_ptr = InttoStr(currenttime); //将当前时间以字符串的形式存储起来 for(i = 0;i<15;i++) currenttime_str = *(currenttime_ptr+i); //以当前时间为名字建立一个文件 f_open(&fdst,currenttime_str,FA_OPEN_ALWAYS|FA_WRITE); // //将数据存储到该文件中 // f_write(&fdst,Head_text,sizeof(Head_text),&bw);//存储“4微米 6微米 14微米 21微米 污染度等级” // f_lseek(&fdst,sizeof(Head_text)-1); // for(line2 = 0;line2 < 2; line2++) // { // for(NumofData = 0;NumofData < 65;NumofData++) // { // Content_text[NumofData] = TestingData[line2][NumofData]; // } // f_write(&fdst,Content_text,sizeof(Content_text),&bw); // f_lseek(&fdst,sizeof(Head_text)-1+(sizeof(Content_text)-1)*(line2+1)); // } f_close(&fdst); //数据存储完成后,显示“数据存储完成!” LCD_Fill(15,200,300,238,BLUE); //覆盖“数据存储中。。。” Backcolor_flag = 1; //绘点背景色为蓝色 POINT_COLOR = RED; //设置画笔颜色为红色 LCD_ShowChinese(30,207,41,30,0); //数 LCD_ShowChinese(55,207,66,30,0); //据 LCD_ShowChinese(80,207,67,30,0); //存 LCD_ShowChinese(105,207,68,30,0);//储 LCD_ShowChinese(130,207,70,30,0);//完 LCD_ShowChinese(155,207,71,30,0);//成 LCD_ShowChinese(180,207,65,30,0); //! LCD_ShowChinese(195,207,65,30,0); //! LCD_ShowChinese(210,207,65,30,0); //! POINT_COLOR = WHITE; //设置画笔颜色为白色 GPIO_ResetBits(GPIOE,GPIO_Pin_1); //PE.1 输出高[/mw_shl_code]

回复

使用道具 举报

4

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2014-4-3
在线时间
2 小时
 楼主| 发表于 2014-12-23 15:29:15 | 显示全部楼层
这段代码正常运行结果应该是:首先显示“数据存储中...”,然后建立一个文件,而后显示“数据存储完成!!!”现在的问题是:加上f_open、f_close函数之后,“数据存储完成!!!”就不显示了,而后再对液晶屏有任何操作都不起作用了,可是让PE1输出高去关闭一个LED灯却可以正常实现,这是为什么呢?液晶屏我是参照您战舰版用FSMC控制的。。。
回复

使用道具 举报

4

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2014-4-3
在线时间
2 小时
 楼主| 发表于 2014-12-24 08:17:08 | 显示全部楼层
回复【3楼】正点原回复【3楼】正点原子:
---------------------------------
原子老师,求助啊。。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165585
金钱
165585
注册时间
2010-12-1
在线时间
2119 小时
发表于 2014-12-24 19:26:59 | 显示全部楼层
回复【6楼】JXCine:
---------------------------------
我也没办法。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2014-4-3
在线时间
2 小时
 楼主| 发表于 2014-12-26 09:51:42 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
您觉得大概是哪的原因呢,TLT液晶屏我参照您的电路用FSMC控制的,SD卡用的是SDIO模式。。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165585
金钱
165585
注册时间
2010-12-1
在线时间
2119 小时
发表于 2014-12-26 22:38:52 | 显示全部楼层
回复【8楼】JXCine:
---------------------------------
不好说,用jtag单步跟踪了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

48

主题

167

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
380
金钱
380
注册时间
2013-6-27
在线时间
17 小时
发表于 2015-1-18 17:06:40 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
我在NAND上移植FatFS时在这
res = chk_mounted(&path, &dj.fs, (BYTE)(mode & ~FA_READ));
死进HardFault()了,搞不明白,
跟进chk_mounted去看,闪一下就到HardFault();

关于在裸机上实现FatFS时,不管是在NAND 还是内部Flash,SD卡什么的,区别其实不大,只需要修改一下diskio.c里面的几个函数中调用的底层接口就行了吧?没什么大的区别,先不考虑损耗均衡算法这些问题,把diskio.c ff.c和相关头文件移植好了就好了是这样的吧?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165585
金钱
165585
注册时间
2010-12-1
在线时间
2119 小时
发表于 2015-1-18 23:22:15 | 显示全部楼层
回复【10楼】can123dao:
---------------------------------
NAND有坏块啊
你用FATFS去管理NAND,不靠谱哦.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

48

主题

167

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
380
金钱
380
注册时间
2013-6-27
在线时间
17 小时
发表于 2015-1-19 09:13:41 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
嗯,只是之前没有弄过文件系统的东西,拉个简单地来移植试一下,结果还没成功,,,,,
那用哪一个好一点呢?
用YAFFS/Direct好像可以直接移植到无系统的设备上来。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165585
金钱
165585
注册时间
2010-12-1
在线时间
2119 小时
发表于 2015-1-19 23:36:59 | 显示全部楼层
回复【12楼】can123dao:
---------------------------------
这我就没用过了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

48

主题

167

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
380
金钱
380
注册时间
2013-6-27
在线时间
17 小时
发表于 2015-1-20 11:23:47 | 显示全部楼层
回复【13楼】正点原子:
---------------------------------
问一个程序调试的问题
..\OUTPUT\TEST.axf: Error: L6406E: No space in execution regions with .ANY selector matching diskio.o(.bss).
..\OUTPUT\TEST.axf: Error: L6407E: Sections of aggregate size 0x20000 bytes could not fit into .ANY selector(s).
说我的空间不足
但按理来说不应该啊这点代码量很小的啊F103ZET6,64K RAM ,512KFlash,运行这还是绰绰有余的吧?
是因为我定义了大数组么
static u8 BackUpData[64][2048];
如果是这样的话应该怎么修正?
可不可以把这个数组定义到Flash里去?
这个有没类似code这样的关键字声明? 
startup_stm32f10x_hd.s里的Heap_Size,keil里OPTION->Utilities->Settings里的RAM for Algorithm里的Size,这两个Size准确意思是什么?可不可以自行修改?

问得有点乱,不好意思。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165585
金钱
165585
注册时间
2010-12-1
在线时间
2119 小时
发表于 2015-1-20 23:49:30 | 显示全部楼层
回复【14楼】can123dao:
---------------------------------
static u8 BackUpData[64][2048]; 
把这个数组改小.
定义到flash就是:
const static u8 BackUpData[64][2048];
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-10-15 10:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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