zynq利用bram向sd卡写文件

本文详细描述了在Zynq-7020上使用Vivado2022.1和Vitis进行BRAM驱动SD卡进行文件读写的过程,包括BRAM初始化、数据存储、SD卡挂载与操作,以及Xilffs配置要点,旨在解决可能遇到的配置问题。
摘要由CSDN通过智能技术生成

最近做了zynq7020的bram进行sd卡读写文件的实验,vivado版本为2022.1,由于xilffs的配置问题检查错误了很久,在此进行一个简单的记录,希望对大家有一定的帮助。

1. 在vivado中按照教程配置好ip核以及参数输出含bitstraem的文件,用vitis创建空c工程

2. 初始化bram驱动

void bram_start(void)	//初始化BRAM驱动
{
	//bram初始化
	XBram bram_inst; //BRAM驱动实例
	XBram_Config *bram_cfg_ptr; //BRAM配置信息
	bram_cfg_ptr = XBram_LookupConfig(XPAR_BRAM_0_DEVICE_ID);  //查找BRAM信息
	XBram_CfgInitialize(&bram_inst,bram_cfg_ptr,bram_cfg_ptr->CtrlBaseAddress);  //初始化
	XBram_SelfTest(&bram_inst, 0);  //自检
}

3. 新建一个数组,用来存需要写进sd卡的数据

//read data
u32 read_data_arr[65536];
int read_data;
for(i = 0; i < 65536; i ++)
{
	read_data = XBram_ReadReg(BaseAddress, bram_data_offset);
	bram_data_offset = bram_data_offset + 4;
	read_data_arr[i] = read_data;
}

4. 挂载sd卡,将数组数据写进sd卡指定路径,并读出数据进行验证

rc = f_mount(&fatfs, "0:/", 0);  //将文件系统挂载到驱动器"1:"上
	if (rc != FR_OK)
	  {
		xil_printf("mount failed!\r\n");
		return XST_FAILURE ;
	}

	file_write(&fil, FILE_PATHA, read_data_arr, 4096*4, FA_OPEN_APPEND|FA_WRITE);
	// 调用设置时间戳的函数,传递文件路径
	set_timestamp("0:/test_filename_a.dat"); // 由于使用zynq7020无timeset函数自定义时间戳函数

	file_read(&fil, FILE_PATHA, read_datatest_arr, FA_OPEN_ALWAYS|FA_READ);

	f_unmount("0:/");
	if (rc != FR_OK)
	{
		xil_printf("unmount failed!\r\n");
		return XST_FAILURE ;
	}

5. sd卡内部文件的读写操作代码实现

#define USER_FILE_READ_SIZE_MAX 65536
#define USER_FILE_WRITE_SIZE 65536

int file_read(FIL *fil, TCHAR* path, u32 *buf, u8 mode)
{
	FRESULT res ;
	unsigned int br;
	res = f_open(fil, path,  mode);
	if(res != FR_OK)
	{
		xil_printf("Open file failed!\r\n");
		return XST_FAILURE ;
	}

	res = f_read(fil, buf, USER_FILE_READ_SIZE_MAX, &br);
	if(res != FR_OK)
	{
		xil_printf("read file failed!\r\n");
		return XST_FAILURE;
	}

	f_close(fil);
	return XST_SUCCESS;
}

int file_write(FIL *fil, TCHAR* path, u32 *buf, u32 len, u8 mode)
{
	FRESULT res ;
	unsigned int br;
	res = f_open(fil, path, mode);
	if(res != FR_OK)
	{
		xil_printf("Create file failed!\r\n");
		return XST_FAILURE ;
	}
	res = f_write(fil, buf, len, &br) ;
	if(res != FR_OK)
	{
		xil_printf("Write file failed!\r\n");
		return XST_FAILURE ;
	}

	f_close(fil);
	return XST_SUCCESS;
}

6. 自定义时间戳函数

time_config current_time =  {  //可自定义
    		2024,
			1,
			18,
			12,
			23,
			45,
			3

    };

int file_write(FIL *fil, TCHAR* path, u32 *buf, u32 len, u8 mode);

void set_timestamp(char* path)
{
    FILINFO fno;
    // 获取当前时间
    fno.fdate = (WORD)(((current_time.Year - 1980) * 512U) | current_time.Month * 32U | current_time.Day);
    fno.ftime = (WORD)(current_time.Hour * 2048U | current_time.Min * 32 | current_time.Sec / 2U);

    f_utime(path, &fno);
}

7. 注意:该zynq7020芯片在实现sd卡的读写时,他vitis里面对于xilffs的设置应该如下才能实现读写操作(我按照教程给的实现不了读写操作,读进去无数据)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值