在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
打开后下拉到SD0,勾选,分配好管脚(这里设为MIO 40-45)。展开并修改speed和Pullup(使能) 如下图所示。
配置完成点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
在右侧列表中勾选xilffs,其余默认。
选中左侧的xilffts,根据下图配置各项Value(黄框为重要的选项)
接下来编写程序代码
使用了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卡)
*请注意以下2点
1.如果不是使用自带的SD卡,请注意容量问题,似乎不能超过4G容量(没测试过,如果有误请纠正)
2.检查SD卡是否有读写保护,请将SD卡设置为下图模式
翻看Zedboard的SD卡槽可以看到,里面的引脚是在上面:
所以SD卡要背面朝上放入,推至最里:
准备就绪,接通电源,连接URAT和JTAG进入调试模式
通过设置断点和查看变量我们可以查看f_open()是否读取成功:
至此,我们就完成了文件的读取工作了。
*注意点:
插一个题外话,数据的读取是需要占用内存的,请注意分配的堆(Heap)内存是否足够大(根据文件大小和项目需要)
设置堆内存
在应用工程文件夹->src->lscript.ld中更改heap size即可(这里我设置为400MB,请注意不要超过内存,也不可设置和内存一样大)