zedboard第十四课(SD卡,FAT32读写)

SDK的standalone已移植好了FatFs库(SDK中叫做xilffs),所以在BSP中添加xilffs库后就可以在程序中使用FatFs中各API来操作SD卡,该库支持FAT12, FAT16 FAT32 and exFAT文件系统(本例将SD卡格式化为FAT32)。
打开BSP中的system.mss,可以修改BSP的配置信息。
我们选中xilffs这个lib,并在左侧选项卡中,对这个lib进行选项配置。确保fs_interface这个选项的值是true。还有use_lfn这个选项为true。还有use_strfunc这个选项为2,用来使能f_printf()函数。
之后我们可以在BSP中看到xilffs_v3_7这个文件夹。
diskio.c是底层操作函数,和板子相关的硬件操作。
ff.c是文件操作函数,和FATFS相关的文件操作。
我们主要使用的,就是FATFS相关的文件操作。

注意,之前版本中的f_write的关于section的BUG,在V3_7这个版本里,已经被修正了。即使写入的不是256的整数倍也是可以的,而且对写入的长度不再有最小长度的要求,哪怕只有1个BYTE都是可以的。

其中的几个重要函数是:

FRESULT f_mount (
	FATFS* fs,			/* Pointer to the file system object (NULL:unmount)*/
	const TCHAR* path,	/* Logical drive number to be mounted/unmounted */
	BYTE opt			/* 0:Do not mount (delayed mount), 1:Mount immediately */
)

这个函数用来挂载SD卡上的FAT32。

FRESULT f_open (
	FIL* fp,			/* Pointer to the blank file object */
	const TCHAR* path,	/* Pointer to the file name */
	BYTE mode			/* Access mode and file open mode flags */
)

这个函数用来打开一个FILE。

FRESULT f_lseek (
	FIL* fp,		/* Pointer to the file object */
	DWORD ofs		/* File pointer from top of file */
)

这个函数用来标记LSEEK。

FRESULT f_read (
	FIL* fp, 		/* Pointer to the file object */
	void* buff,		/* Pointer to data buffer */
	UINT btr,		/* Number of bytes to read */
	UINT* br		/* Pointer to number of bytes read */
)

这个函数用来读取文件中的数据,并转存到buff中来。

FRESULT f_write (
	FIL* fp,			/* Pointer to the file object */
	const void *buff,	/* Pointer to the data to be written */
	UINT btw,			/* Number of bytes to write */
	UINT* bw			/* Pointer to number of bytes written */
)

这个函数用来把buff中的数据,写入FILE中。

FRESULT f_close (
	FIL *fp		/* Pointer to the file object to be closed */
)

这个函数用来关闭一个FILE。

还有其他的一些函数,可以在ff.c文件中查看源代码,了解它的功能。

下面进行一些情景分析。

static FATFS fatfs;

声明一个静态的数据对象,FATFS类型,它用来作为SD卡上的FAT32文件系统的句柄。

#define FILE "test123456789.txt"
static  char src_str[MAX_LEN] = { 0 } ;
static  char dst_str[MAX_LEN] = { 0 } ;

定义缓冲区,定义文件名字符串。

int SD_Init()
{
FRESULT rc;
rc = f_mount(&fatfs,"",0);
if(rc)
{
xil_printf("ERROR : f_mount returned %d\r\n",rc);
return XST_FAILURE;
}
return XST_SUCCESS;
}

定义了初始化函数。主要是mount文件系统,利用空串,检索到系统内的默认的逻辑卷0,并初始化FATFS数据对象。
这是一个比较费解的地方,这里多做一些说明。
在fatfs外挂一个设备的时候,通过 f_mount(&fs, “”, 1);就可以访问,而在多个设备时,就得指定磁盘号。
支持以下两种方式:
f_mount(&fs, “1:”, 1);
f_mount(&fs, “1:/”, 1);

这种方式不支持:
f_mount(&fs, “1”, 1);

result = f_mount(&fs, "", 1);    /* Mount a logical drive */
 result = f_mount(&fs, "1:/", 1);    /* Mount a logical drive */
result  = f_mount(NULL, "1:/", 1); /* UnMount a logical drive */

这是f_mount使用的样例。

int SD_Transfer_read(char *FileName,u32 DestinationAddress,u32 ByteLength)
{
FIL fil;
FRESULT rc;
UINT br;

rc = f_open(&fil,FileName,FA_READ);
if(rc)
{
xil_printf("ERROR : f_open returned %d\r\n",rc);
return XST_FAILURE;
}
rc = f_lseek(&fil, 0);
if(rc)
{
xil_printf("ERROR : f_lseek returned %d\r\n",rc);
return XST_FAILURE;
}
rc = f_read(&fil, (void*)DestinationAddress,ByteLength,&br);
printf("act read len is %d \n\r",br );
if(rc)
{
xil_printf("ERROR : f_read returned %d\r\n",rc);
return XST_FAILURE;
}
rc = f_close(&fil);
if(rc)
{
xil_printf(" ERROR : f_close returned %d\r\n", rc);
return XST_FAILURE;
}
return XST_SUCCESS;
}

定义了读文件数据的函数。

int SD_Transfer_write(char *FileName,u32 SourceAddress,u32 ByteLength)
{
FIL fil;
FRESULT rc;
UINT bw;

rc = f_open(&fil,FileName,FA_CREATE_ALWAYS | FA_WRITE);
if(rc)
{
xil_printf("ERROR : f_open returned %d\r\n",rc);
return XST_FAILURE;
}
rc = f_lseek(&fil, 0);
if(rc)
{
xil_printf("ERROR : f_lseek returned %d\r\n",rc);
return XST_FAILURE;
}
rc = f_write(&fil,(void*) SourceAddress,ByteLength , &bw );
printf("SD_Transfer_write -> f_write result len is %d \n\r" , bw );
if(rc)
{
xil_printf("ERROR : f_write returned %d\r\n", rc);
return XST_FAILURE;
}
rc = f_close(&fil);
if(rc){
xil_printf("ERROR : f_close returned %d\r\n",rc);
return XST_FAILURE;
}
return XST_SUCCESS;
}

定义了写文件数据的函数。

下面来看看在main中如何使用SD的操作函数的具体流程。

r  = SD_Init();
if ( XST_SUCCESS != r ){
	printf("fail to open SD\n\r");
	return 1 ;
}
printf("OK to open SD\n\r");

初始化SD卡。

SD_Transfer_write(FILE,(void *)src_str,(MAX_LEN));
printf("write done SD\n\r");

向FILE中写入buffer里的数据。

SD_Transfer_read(FILE,(void*)dst_str,(MAX_LEN));
printf("read done SD\n\r");

从FILE中读出数据,写入BUFFER。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F103是ST公司出品的一款32位微控制器,它拥有强大的处理能力和丰富的外设资源。而FAT32是一种广泛应用于存储设备的文件系统格式之一,可以实现对大容量存储设备的高效管理。那么如何在STM32F103上实现对FAT32格式SD卡读写呢? 首先,需要在STM32F103上配置SD卡读写的相关外设模块。一般来说,常用的外设模块有SPI和SDIO两种,它们的差异在于SPI需要使用多个I/O口进行通讯,而SDIO则可以在单独一个I/O口上进行通讯,效率更高。在具体实现时,可以根据需要采用相应的模块,并进行相应的配置和初始化。 其次,需要在代码中实现对FAT32文件系统格式的解析。FAT32文件系统是一种基于文件链表的格式,即通过指针将不同的文件块按照顺序连接起来,形成一个完整的文件。在读写FAT32格式的SD卡时,需要先访问根目录,然后根据具体的路径和文件名定位到对应的文件块。在读取或写入文件时,需要按照文件块的顺序依次读取或写入数据,直到文件结束。在实现过程中,可以采用开源的FATFS文件系统库,也可以自行编写相应的解析代码。 最后,需要考虑一些具体的细节问题。例如,在读写SD卡时可能会发生读写错误或者SD卡拔出等问题,需要进行相应的异常处理。此外,为了提高读写速度和存储空间利用率,还需要对读取和写入数据的缓存区进行优化,并尽可能利用DMA等硬件加速模块提高效率。 综上所述,实现STM32F103对FAT32格式的SD卡读写,需要对外设模块进行配置和初始化,实现对FAT32文件系统格式的解析,以及注意细节问题,达到高效和可靠的读写效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值