zoukankan      html  css  js  c++  java
  • zynq之TF卡写入常见问题

    zynq之TF卡写入常见问题

    1、基本原理

    前面做过zynq的TF读写实验,使用串口返回了实验所需的现象。那个时候也没有深究头文件"ff.h"里的几个常用的函数。这次需要使用TF卡做实验时发现很多操作都不大一样,不能够简单的重复,这里把几个常见的问题列举出来,方便以后的查阅。

    2、实际问题

    先用一段完整的代码:

    #include <stdio.h>
    #include "xil_printf.h"
    #include "xdevcfg.h"
    #include "xparameters.h"
    #include "ff.h"
    int SD_Init(void);
    int Sd_Test_Write(void);
    int main()
    {
    SD_Init();
    Sd_Test_Write();
    while(1)
    {
    ;
    }
    return 0;
    }
    static FATFS fatfs;
    int SD_Init()
    {
    FRESULT rc;
    rc = f_mount(&fatfs,"",0);
    if(rc)
    {
    return XST_FAILURE;
    }
    return XST_SUCCESS;
    }
    int Sd_Test_Write()
    {
    FIL fil;
    FRESULT rc;
    UINT br;
    const char src_str1[] = "t
    ";
    rc = f_open(&fil,"tesc.txt", FA_OPEN_ALWAYS | FA_WRITE);
    if(rc)
    {
            ;
    }
    rc = f_lseek(&fil, f_size(&fil));
    rc = f_write(&fil,src_str1,sizeof(src_str1),&br);
    rc = f_lseek(&fil, f_size(&fil));
    rc = f_write(&fil,"t/n",sizeof("t/n"),&br);
    //rc = f_sync(&fil);
    rc = f_close(&fil);
    }

    代码中几个重要的部分如下:

    SD_Init函数中的f_mount是启动SD卡的分区的,一般一次就足够了,可以获得SD卡的地址方便后面函数使用。其他的判断返回语句都是用于显示地址载入是否成功。f_mount同样可以用于注销工作区,f_mount(0,NULL)就可以注销0为根目录的工作区。

    Sd_Test_Write函数中比较关键的函数有:f_open , f_lseek , f_write , f_sync,f_close , f_size;

    (1)f_open

    打开文件的,也可以用于创建文件,第一个参数是文件对象的地址,第二个是字符串名称,第三个是对应相关的模式。

    FA_OPEN_ALWAYS:总是打开模式,有则打开,无则创建,反正要执行到底。

    FA_OPEN_EXISTING:存在打开模式,有才打开,无则失败,需要确认有文件才执行。

    FA_CREATE_NEW:创建新文件模式,无才创建,有则失败,需要确认没有文件才执行。

    FA_CREATE_ALWAYS:总是创建模式,无则创建,有则覆盖创建(原文件被覆盖),反正要建新文件。

    FA_WRITE:写模式,允许写入数据

    FA_READ:读模式,允许读取数据

    显然,前面四种模式是执行模式,后面两种是权限模式,执行和权限可以同时设置。

    注意总是打开和总是创建的区别,两者最后都会生成一个文件,总是打开模式会留有已存文件,而总是创建模式只会出新文件。

    (2)f_lseek

    用于设置起始操作点,第一个参数还是文件对象的地址,第二个可以是数字表示长度,也可以是专门的文件大小的类。这里可以配合f_size(文件对象的地址)得到的文件长度来设置为文件尾为初始操作。

    (3)f_write

    用于写入数据的函数。第一个参数依旧是文件对象的地址,第二个是字符串或者数组地址(也可能有其他的,还没有遇到),第三个是字符长度,这里可以使用sizeof函数读取,第四个是无符号整型变量的地址,用于指针计数。第四个参数的作用暂时不清楚。

    这里需要注意的是,在打开文件之后,如果进行多次的f_write操作,写入的字符串不能太大,否则容易出现乱码。也可以提高写入数据的长度(具体多大根据测试可知,一般需要提高到256的整数倍才可以避免乱码)。这也是f_write不好作为SD卡写入的函数的原因,容易浪费资源。找资料时发现可以使用f_printf,有时间再测试一下。

    (4)f_sync

    这个好像是一个用于检查的函数,写入失败可能会有一些提示,由于没有测试这个函数,就不好多解释了。参数也就是文件对象的地址。

    (5)f_close

    关闭文件。这个就一个参数,文件对象的地址。

    test my_sd function!
     test my_sd function!
     test my_sd function!
     t
     t
     t
     t/n 

    这个是开头源码产生的文件的内容,可以参考一下(不完全是,还有其他操作的内容)。

    3、概括小结

    总结一下文件写操作的基本步骤:

    创建工作区 == 打开移动存储卡

    打开文件    == 打开文件(这里也可以通过转义字符实现目录的构建)

    确认写入起点 == 鼠标点击某处

    写入特定长度字符 == 键盘输入数据

    检查文件 ==确认输入正确

    关闭文件 == 关闭文件

    关闭工作台 == 拔出移动存储卡

    这就是写操作的基本流程与PC操作的基本流程的对应关系。

    至于读操作,基本原理是一样的,就是将f_write换成f_read。两者的参数都是一样的,注意f_open的工作模式即可。注意存储数据需要使用字符串数组存储。

     

  • 相关阅读:
    May 9, 17:3020:00, 1479, "Concentrationcompactness/Rigidity method" lecture 4 by Yang Lan
    May 21, 10:0011:00, 1303, "Capacity, Primeter and ADMmass " by Jie Xiao
    课程期末安排
    问题: Schrodinger方程的广义Strichartz估计
    May 21, 11:1012:10 "On small solutions for nonlinear wave equations in exterior domains " by Makoto NAKAMURA
    SQL Server2019数据库备份与还原脚本,数据库可批量备份
    记一次 IIS 站点配置文件备份和还原,物理路径文件批量备份
    从网上收集的一些图片方面的操作
    android获取本地IP
    java利用httpconnect向服务器发送信息与接收回馈信息
  • 原文地址:https://www.cnblogs.com/electricdream/p/13401238.html
Copyright © 2011-2022 走看看