Zedboard(三)嵌入式应用程序开发——实例二:从SD卡读取dat文件

在Zedboard(二)中我们完整地介绍了一个简单的应用程序(Hello World)的开发流程。
在实际应用中,我们往往需要从外部读取文件中的数据,本篇介绍:如何从SD卡读取dat数据文件(裸机状态下)

本文很多操作都是在Zedboard(二)的基础上做修改。

一、Vivado配置硬件平台参数

  要从SD卡读取数据文件,首先是给Zedboard硬件平台配置SD卡的端口。

    Zynq中PS部分已经集成了SD卡控制器,我们只需要打开SD卡控制器,并配置对应管脚。

  打开Vivado(2017.3版),建立工程,具体的步骤可以参考Zedboard(二)使用Vivado+SDK开发嵌入式应用程序——实例一:Hello World中的一、二部分。

  在添加好处理器IP时,先别进行“Validate Design”规则检查,需要对IP核进行SD卡的相关配置,通过双击图中的IP核(图案会变成橙色)更改其内部配置:  

MIO Configuration->I/O Peripherals

  Zedboard(三)嵌入式应用程序开发——实例二:从SD卡读取dat文件_第1张图片

打开后下拉到SD0,勾选,分配好管脚(这里设为MIO 40-45)。展开并修改speed和Pullup(使能) 如下图所示。
  Zedboard(三)嵌入式应用程序开发——实例二:从SD卡读取dat文件_第2张图片
  
配置完成点ok。
余下的步骤是:

1.进行规则检查
2.生成输出文件并封装成HDL形式
3.生成比特流文件导入SDK

请参照Zedboard(二)使用Vivado+SDK开发嵌入式应用程序——实例一:Hello World 完成余下步骤。

二、用SDK编写应用程序

  裸机状态下要实现SD卡文件的读取就必须借助FatFs库(SDK中叫做xilffs),FatFs是一个适用于嵌入式平台的通用文件系统,所以在SDK中添加xilffs库后就可以在程序中使用FatFs中各API来操作SD卡。
  关于FatFs的详细说明可查看http://elm-chan.org/fsw/ff/00index_e.html。

在创建BSP(板级驱动包)时导入xilffs库

右击已经创建的BSP,选择Board Supprot Package Setting
Zedboard(三)嵌入式应用程序开发——实例二:从SD卡读取dat文件_第3张图片

在右侧列表中勾选xilffs,其余默认。
Zedboard(三)嵌入式应用程序开发——实例二:从SD卡读取dat文件_第4张图片

选中左侧的xilffts,根据下图配置各项Value(黄框为重要的选项)
Zedboard(三)嵌入式应用程序开发——实例二:从SD卡读取dat文件_第5张图片

接下来编写程序代码

使用了FatFs API所以要#include "ff.h"

C代码如下:


#include "lidar_he.h"

#include "platform.h"
#include "malloc.h"
#include "xil_printf.h"

#include "ff.h"

//全局变量
static FATFS fatfs;

FullNewData newdata1[666];
POSData lidarpos1[each_cycle];

//主函数
int main()
{
    init_platform();
    //*******************************************
    //从SD卡读取dat文件代码段
    FIL fp_in;
    FRESULT fr;
    UINT br;

    f_mount(&fatfs,"",0);

    fr = f_open(&fp_in,"my_666_rgb.dat",FA_READ);//打开文件
    if(fr != FR_OK)      //测试是否打开文件
    {
        print("open fail\n\r");

    }
    printf("newdata1 = %p\n", newdata1);//输出newdata1内存地址
    fr = f_read(&fp_in,newdata1,(sizeof(FullNewData)*666),&br);//读入dart数据到newdata1

    fr = f_close(&fp_in);
    //*******************************************    
    print("Hello World\n\r");
    cleanup_platform();
    return 0;
}

*几个注意点:

1.#include "ff.h" 是必须的,后面的f_open和f_read函数都需要用到该库
2.fr = f_open(&fp_in,"my_666_rgb.dat",FA_READ)中默认了文件在SD卡的根目录下,所以只有"文件名.后缀名"
3.文件读取后别忘了fr = f_close(&fp_in);

f_open和f_read等函数的详细用法请参照http://elm-chan.org/fsw/ff/00index_e.html

三、板级测试

  在板级调试之前,先将文件copy到SD卡的根目录(这里使用的是Zedboard自带的SD卡)
  Zedboard(三)嵌入式应用程序开发——实例二:从SD卡读取dat文件_第6张图片
  
*请注意以下2点

1.如果不是使用自带的SD卡,请注意容量问题,似乎不能超过4G容量(没测试过,如果有误请纠正)
2.检查SD卡是否有读写保护,请将SD卡设置为下图模式

Zedboard(三)嵌入式应用程序开发——实例二:从SD卡读取dat文件_第7张图片
翻看Zedboard的SD卡槽可以看到,里面的引脚是在上面:
Zedboard(三)嵌入式应用程序开发——实例二:从SD卡读取dat文件_第8张图片
所以SD卡要背面朝上放入,推至最里:
Zedboard(三)嵌入式应用程序开发——实例二:从SD卡读取dat文件_第9张图片

准备就绪,接通电源,连接URAT和JTAG进入调试模式
通过设置断点和查看变量我们可以查看f_open()是否读取成功:
Zedboard(三)嵌入式应用程序开发——实例二:从SD卡读取dat文件_第10张图片

至此,我们就完成了文件的读取工作了。

*注意点:

插一个题外话,数据的读取是需要占用内存的,请注意分配的堆(Heap)内存是否足够大(根据文件大小和项目需要)

设置堆内存
在应用工程文件夹->src->lscript.ld中更改heap size即可(这里我设置为400MB,请注意不要超过内存,也不可设置和内存一样大)
Zedboard(三)嵌入式应用程序开发——实例二:从SD卡读取dat文件_第11张图片

你可能感兴趣的:(Zedboard(三)嵌入式应用程序开发——实例二:从SD卡读取dat文件)