0、写在前面
这个是用STM32操作SD卡时遇到的一些问题,写在这里备忘用。本人机械专业,涉及电子的可能不够专业,如有纰漏错误,欢迎指正。
1、创建一个文件夹和文件实例代码1:
FILINFO
其中FILINFO 是文件信息结构体,可以转到其定义处查看各个成员的含义,这里并没有用到,因为没有添加文件创立的时间和作者。
DIR是目录结构体,可以转到其定义处查看各个成员含义。FRESULT是文件操作相关函数的统一返回信息结构体。FIL就是一个文件。下面讲一下我遇到的问题。
2、问题一:相对路径问题
在FTAFS里面有相对路径和绝对路径,在ffconf.h里面有一个宏定义_FS _RPATH,这个宏定义为0时不开启相对路径,为1时开启相对路径。
相对路径和绝对路径差别如下:
这时问题就来了。当我打开一个目录后,用"file.txt"建立一个文件,却发现建立到了SD卡根目录下,这就很奇怪,代码如下:
if(f_opendir(&File1Dir, "0:20200810") == FR_OK )//打开目录
{
if(f_open(&file1,"20200810.txt",FA_CREATE_ALWAYS | FA_READ | FA_WRITE) == FR_OK)
{
f_puts("WangChenchen 20200810 create succeed.汪晨晨汉字",&file1);
f_putc('Q',&file1);
f_write(&file1,"FWRITEWCCWCC000123汪晨晨汉字",18,&tempbw);
f_close(&file1);
}
}
后来经过自己琢磨之后,发现是f_opendir函数只能打开一个目录,并不能改变当前驱动器的当前目录。想改变当前目录需要用f_mkdir函数。这个函数如下:
如果把代码改成下面这样,就可以用相对路径在20200810下建立文件了。
if(f_opendir(&File1Dir, "0:20200810") == FR_OK )//打开目录
{
f_chdir("0:/20200810");//改变当前工作目录
if(f_open(&file1,"20200810.txt",FA_CREATE_ALWAYS | FA_READ | FA_WRITE) == FR_OK)
{
f_puts("WangChenchen 20200810 create succeed.汪晨晨汉字",&file1);
f_putc('Q',&file1);
f_write(&file1,"FWRITEWCCWCC000123汪晨晨汉字",18,&tempbw);
f_close(&file1);
}
}
这样就会发现20200810.txt文件位于20200810文件夹下,而不是根目录下了。
3、问题二:f_open()函数溢出进入死循环问题
比如以下代码就是有问题的,会进入硬件错误的死循环里面。
FIL* file1;
if(f_open(file1,"0:/20200810/20200810.txt",FA_CREATE_ALWAYS | FA_READ | FA_WRITE) == FR_OK)
{
f_puts("WangChenchen 20200810 create succeed.汪晨晨汉字",file1);
f_putc('Q',file1);
f_write(file1,"FWRITEWCCWCC000123汪晨晨汉字",18,&tempbw);
f_close(file1);
}
这是因为file1是一个FIL*指针变量,在执行f_open()函数时,这个指针并未指向一个地址,所以执行会出错,会进入硬件死循环函数里。如果要用FIL*指针操作,改成下面的代码即可:
FIL* file1;
file1 = (FIL*)mymalloc(SRAMIN,sizeof(FIL*) );
if(file1 == NULL)
{//内存申请失败
LCD_DisplayString(10,160,16,"Apply SRAMIN ERR n");
while(1)
;
}
if(f_open(file1,"0:/20200810/20200810.txt",FA_CREATE_ALWAYS | FA_READ | FA_WRITE) == FR_OK)
{
f_puts("WangChenchen 20200810 create succeed.汪晨晨汉字",file1);
f_putc('Q',file1);
f_write(file1,"FWRITEWCCWCC000123汪晨晨汉字",18,&tempbw);
f_close(file1);
}
myfree(file1);
4、问题三:发现建立的文件写不进去数据
一开始我建立文件是用的下面的语句:
f_open(file1,"0:/20200810/20200810.txt",FA_CREATE_ALWAYS );
这就是建立一个新文件了,但发现无论用什么函数都写不进去数据,后来发现建立文件时,默认是只读属性,如果要进行读写,需要再加上两个宏才行,即改成下面的语句:
f_open(&file1,"0:/20200810/20200810.txt",FA_CREATE_ALWAYS | FA_READ | FA_WRITE)
各个宏的含义如下:
5、最后一次更新时的日期
2020年8月11日。