zynq之TF卡写入常见问题

1、基本原理

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

2、实际问题

先用一段完整的代码:

#include #include"xil_printf.h"#include"xdevcfg.h"#include"xparameters.h"#include"ff.h"

int SD_Init(void);int Sd_Test_Write(void);intmain()

{

SD_Init();

Sd_Test_Write();while(1)

{

;

}return 0;

}staticFATFS fatfs;intSD_Init()

{

FRESULT rc;

rc= f_mount(&fatfs,"",0);if(rc)

{returnXST_FAILURE;

}returnXST_SUCCESS;

}intSd_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的工作模式即可。注意存储数据需要使用字符串数组存储。

zynq之TF卡写入常见问题

zynq linux tf卡系统升级,zynq之TF卡写入常见问题相关推荐

  1. zynq linux内核出错,Xilinx Zynq Linux内核源码编译过程

    1.交叉编译环境的安装配置 1) +Xilinx+Tools 2.uboot的编译 1)下载uboot源代码 下载uboot源代码,务必要下载tar.gz格式的文件,地址: https://githu ...

  2. ZYNQ Linux 移植:包含petalinux移植和手动移植debian9

    问题: 1.ZYNQ Linux启动流程: BOOTROM→FSBL→Uboot→Kernel→RootFS 环境: 虚拟机ubuntu16.04 petalinux2018.3 vivado2018 ...

  3. ZYNQ裸机实现 USB MASS STORAGE (usb+sd卡 实现U盘功能)

    ZYNQ裸机实现 USB MASS STORAGE (usb+sd卡 实现U盘功能) 之所以写裸机,也就是没有操作系统的实现方法是因为linux系统下的实现方法网上已经有很多了,之前使用的STM32实 ...

  4. linux ps-pl中断,zynq linux驱动之PL-PS中断

    PC:Windows 10 虚拟机:ubuntu 16.04 vivado:2017.04 PetaLinux:2017.04 开发板:黑金AX7010 根文件系统:debian8 --------- ...

  5. zynq linux开发与普通ARM平台的不同点

    zynq系列 linux开发特点 前言 平台简介 开发方式 使用petalinux直接配置 使用源码工程传统开发 启动linux文件的区别 1.patelinux配置开发 2.使用源码工程开发 pin ...

  6. zynq Linux软件中断,zynq linux驱动之PL-PS中断【转】

    PC:Windows 10 虚拟机:ubuntu 16.04 vivado:2017.04 的的PetaLinux:2017.04 开发板:黑金AX7010 根文件系统:debian8 ------- ...

  7. ebaz s9 zynq linux中关于网络的一些小问题

    ebaz s9 zynq linux中关于网络的一些小问题 在使用petaalinux 编译ebaz的linux时,如果只按照某金与某原子的linux教程制作linux系统会卡死在内核启动的过程中.其 ...

  8. ZYNQ + Linux

    ZYNQ Linux操作系统移植说明文档 http://xilinx.eetrend.com/content/2019/100018437.html 1,组成 ZYNQ上面移植Linux操作系统包括四 ...

  9. ZYNQ Linux 添加I2C-RTC驱动

    原文链接:ZYNQ:Linux添加I2C-RTC驱动 硬件情况 使用的是DS1338这款RTC时钟芯片,I2C总线对应到PS端的I2C1. 配置 内核 添加有关的驱动: 因为DS1338用的驱动与DS ...

最新文章

  1. 关于项目数据库设计--投票系统
  2. [论文笔记] A model for correlated failures in N-version programming(IIE Trans, 2004)
  3. [OSDI 16] Wukong : 基于RDMA的高并发、快速的分布式RDF Graph Query系统
  4. Android小项目源码汇总
  5. 机器学习快速截图工具matlab版本——文件夹批量处理(原创)
  6. JVM插桩之一:JVM字节码增强技术介绍及入门示例
  7. 笔记整理——linux程序设计
  8. C语言里的几个拷贝函数memcpy、memset、strcpy、strncpy
  9. leetcode-40-组合总和 II
  10. Spring源码学习笔记:经典设计模式之策略模式
  11. ubuntu opencv4 需要的依赖
  12. 转DateTimePicker 控件的使用
  13. libjpeg、libpng使用方法
  14. 局域网SDN技术硬核内幕 一 分布式任意播网关
  15. linux下批量修改文件名称
  16. Oracle number类型详解
  17. Docker真实应用场景案例解析——ASSA ABLOY
  18. Beijing's Antitrust Blunder
  19. VirusTotal 为 Chrome 和 Firefox 发布 VT4Browsers 扩展
  20. 解决Vue history模式下使用嵌套路由打包部署后刷新页面为空白页

热门文章

  1. 软件设计七大原则实战(二)-开闭原则
  2. 纯JavaScript二维码在线生成网页源码
  3. python08课后练习歌手成绩
  4. Windows编程笔记小结
  5. 人到中年这种茶要多喝,越喝血管越干净!坚持一个月,头晕眼花不再来!
  6. 永安行专利侵权胜诉,IPO并未搁置
  7. 433模块 防冲撞 解决多发一收 mesh自组网 方案实现
  8. 判断一点是否在多边形内(附Java实现代码)
  9. python股票网格交易_不知道哪位交易员可以解释下网格交易法?
  10. 作为一名大数据工程师你需要掌握Spark深度学习