Zedboard(四)嵌入式应用程序开发——实例三:写入数据到SD卡

时间:2021-01-05 18:47:17

Zedboard(四)嵌入式应用程序开发——实例三:写入数据到SD卡(txt)文件中

本篇介绍如何用Xilinx SDK创建的裸机应用程序在Zedboard上运行并将数据写入到SD卡的文件中(以txt文档为例)。

目录


前言

本文执行的操作,是建立在已经创建好硬件工程(主要是SD卡端口的设置)和创建好板级驱动工程(BSP)的基础上。此部分操作在文章Zedboard(二)使用Vivado+SDK开发嵌入式应用程序——实例一:Hello WorldZedboard(三)嵌入式应用程序开发——实例二:从SD卡读取dat文件中已经有所介绍,这里不再赘述。

写函数的介绍

要实现Zedboard对SD卡的读写,必须导入FatFs库(SDK中叫做xilffs)。
实现数据写入有两个常用的函数:
1.f_write()
2.f_printf()

1、 f_write() 函数是从指定的内存地址开始,写入指定字节数的数据到指定文件中。例:

fr = f_open(&fp_out,"output.txt",FA_WRITE);//打开名为output.txt文件
fr = f_write(&fp_out,newdata,(sizeof(int)*666),&br);//从newdata内存地址开始写666个int数据到output.txt中

*这里笔者是先在SD卡根目录下创建好输出文件,如果是在没有创建文件的情况下用f_open()需要将FA_WRITE改为FA_OPEN_ALWAYS

2、f_printf() 函数是输出指定字符串数据到指定文件中(和C语言中的fprintf()相似),本文主要介绍这个函数的用法。例:

int a=8;
double b=7.00;
fr = f_open(&fp_out,"output.txt",FA_WRITE);//打开名为output.txt文件
f_printf(&fp_out,"%d %d %d %d %s\n",(int)10.00,9,a,(int)b,"String");

上述代码输出结果为:

10 9 8 7 String

*f_printf()似乎不支持浮点数输出,只能输出字符串和整型数据。

修改SDK中BSP的xilffs库参数

在创建好应用工程和板级驱动工程(BSP)后,选择BSP右键Board Supprot Package Setting

Zedboard(四)嵌入式应用程序开发——实例三:写入数据到SD卡

如果之前已经进行了SD卡的读入数据工程,则右侧列表xilffs应该是已经勾选的(没有的话请勾选)

Zedboard(四)嵌入式应用程序开发——实例三:写入数据到SD卡

选中左侧的xilffts,根据下图配置各项Value

Zedboard(四)嵌入式应用程序开发——实例三:写入数据到SD卡

特别注意红框这一项,如果值为0那么f_printf()编译会出错。查看ff.h文件的代码就会发现:

Zedboard(四)嵌入式应用程序开发——实例三:写入数据到SD卡

f_printf()只有在USE_STRFUNC不为0的情况下才能正常使用。(这些东西可以参考的资料真的好少,只能自己摸索,不过总算是成功用上了~)

应用工程添加数据输出代码段

准备工作已经完成,接下来添加对应代码块就OK了。

#include "platform.h"
#include "xil_printf.h"
#include "ff.h"
//全局变量
static FATFS fatfs;
int main()
{
    init_platform();   
    int j,k;
    FRESULT fr;
    FIL fp_out;
    f_mount(&fatfs,"",0);
    f_mount(&fatfs,"",1);
    fr = f_open(&fp_out,"result.txt",FA_WRITE);//打开文件
    if(fr != FR_OK)      //测试是否打开文件
    {
        print("open fail\n\r");
    }   
    for(j=0;j<3325;j++)
    {
        for(k=0;k<2000;k++)
        {               
            f_printf(&fp_out,"%d %d %d %d %d %d\n",4000,4000,1600,55,66,77)
        }
    }
    fr = f_close(&fp_out);

    print("Hello World\n\r");
    cleanup_platform();
    return 0;
}

笔者在具体应用中写了一个大约169MB的txt文档,猜猜花了多少时间,16分钟(=口=)这可不行啊,当然目前也没有找其他的代替方法……