【STM32知识点】FatFs文件系统移植

一、把FatFs源码拷贝到工程目录,此此移植文件系统是基于之前SPI_FLASH的工程下进行。

源码地址:Petit FAT File System Module

 二、在keil打开工程文件,将源码添加到工程中。

 三、添加FatFs源码的头文件。

 四、尝试构建程序,解决错误。

        主要错误为函数未定义却使用了。可以进行删除,或者实现即可。

五、实现FatFs底层驱动的接口。

a.disk_status  获取设备状态的接口。示例代码如下:

DSTATUS disk_status (
	BYTE pdrv		/* Physical drive nmuber to identify the drive */
)
{
	DSTATUS stat=STA_NOINIT;
	switch (pdrv) {
	case DEV_FLASH :
		{
		    if(SPI_FLASH_ReadID()==sFLASH_ID)
		      stat&=~STA_NOINIT;
		    else
		      stat=STA_NOINIT;
		}
		return stat;	
	}
	return STA_NOINIT;
}

b.disk_initialize 初始化设备的接口。示例代码如下:

DSTATUS disk_initialize (
	BYTE pdrv				/* Physical drive nmuber to identify the drive */
)
{
	DSTATUS stat=STA_NOINIT;
	switch (pdrv) {
	case  DEV_FLASH :
		{
		    SPI_FLASH_Init();
		    if(SPI_FLASH_ReadID()==sFLASH_ID)
		      stat&=~STA_NOINIT;
		    else
		      stat=STA_NOINIT;
		}
		return stat;
	}
	return STA_NOINIT;
}

c.disk_read 读。示例代码如下:

DRESULT disk_read (
	BYTE pdrv,		/* Physical drive nmuber to identify the drive */
	BYTE *buff,		/* Data buffer to store read data */
	LBA_t sector,	/* Start sector in LBA */
	UINT count		/* Number of sectors to read */
)
{
	DRESULT res;
	switch (pdrv) {
	case  DEV_FLASH :
		{
			SPI_FLASH_BufferRead(buff, sector*4096, count*4096);
			res=RES_OK;
		}
		return res;
	}
	return RES_PARERR;
}

d.disk_write 写。示例代码如下:

DRESULT disk_write (
	BYTE pdrv,			/* Physical drive nmuber to identify the drive */
	const BYTE *buff,	/* Data to be written */
	LBA_t sector,		/* Start sector in LBA */
	UINT count			/* Number of sectors to write */
)
{
	DRESULT res;
	switch (pdrv) {
	case  DEV_FLASH :
		{
			SPI_FLASH_SectorErase(sector*4096);	 
			SPI_FLASH_BufferWrite((BYTE *)buff, sector*4096, count*4096);
			res=RES_OK;
		}
		return res;
	}
	return RES_PARERR;
}

e.disk_ioctl 设备属性接口。示例代码如下:

DRESULT disk_ioctl (
	BYTE pdrv,		/* Physical drive nmuber (0..) */
	BYTE cmd,		/* Control code */
	void *buff		/* Buffer to send/receive control data */
)
{
	DRESULT res;
	switch (pdrv) {
	case  DEV_FLASH :
		{
			switch (cmd) {
 			       /* 扇区数量:2048*4096/1024/1024=8(MB) */
       			       case GET_SECTOR_COUNT:
       			      *(DWORD * )buff = 2048;		
       		                       break;
      		                      /* 扇区大小  */
      		                       case GET_SECTOR_SIZE :
       		                      *(WORD * )buff = 4096;
      			       break;
       			       /* 同时擦除扇区个数 */
        			        case GET_BLOCK_SIZE :
         		                      *(DWORD * )buff = 1;
      		                       break;        
    				  }
			res=RES_OK;
		}
		return res;	
	}
	return RES_PARERR;
}

f.DWORD get_fattime 获取时间。示例代码如下:

DWORD get_fattime (void)
{
	return ((2021-1980)<<(25)|(1)<<(21)|(1)<<(16)|(1)<<(11)|(1)<<(5)|(2)<<(0));
}

六、修改ffconf.h,配置文件系统的具体功能。

a.FF_USE_MKFS        1        使用格式化的功能

b.FF_CODE_PAGE     936        修改编码页以支持中文文件名

c.FF_USE_LFN        0        支持长文件名

d.FF_MAX_SS        4096        修改支持最大的设备扇区大小,与flash设备对应。

 七、尝试使用文件系统来测试是否移植成功。

常规使用流程

a.挂在文件系统到一个设备。使用函数:f_mount()

b.打开文件。使用函数:f_open()

c.数据的读取与写入

d.关闭文件。使用函数:f_close()

 注意:测试过程可使用返回值判断是否移植成功。在挂载设备时,存在错误FR_NO_FILESYSTEM(13),可采用函数f_mkfs进行解决,该函数用于格式化文件系统。相关代码如下:

printf("\r\nFatFs测试实验\r\n");
	res=f_mount(&flash_fs, "", 1);
 	if(res==FR_OK)
	{
		printf("\r\n文件系统挂载成功!\r\n");
	}
	else
	{
		printf("\r\nf_mount错误代码:%d\r\n",res);
		if(res == FR_NO_FILESYSTEM)
		{
			res=f_mkfs("", 0, work, sizeof work);
			if(res==FR_OK)
			{
		      	     printf("\r\n文件系统格式化成功!\r\n");
			}
			else
			{
		    	      printf("\r\nf_mkfs错误代码:%d\r\n",res);
			}
		}
	}
	//打开文件,写入数据,关闭文件
	 res = f_open(&flash_fil, "hello.txt", FA_OPEN_ALWAYS|FA_WRITE|FA_READ);
	 if(res==FR_OK)
	{
		printf("\r\nf_open测试成功!\r\n");
	}
	else
	{
		printf("\r\nf_open错误代码:%d\r\n",res);
	}
	//
	printf("\r\n正在写入:%s\r\n",Tx_Buffer);
	res=f_write(&flash_fil, Tx_Buffer,BufferSize,&Num_Of_Written);
	if(res==FR_OK)
	{
		printf("\r\nf_write测试成功!\r\n");
	}
	else
	{
		printf("\r\nf_write错误代码:%d\r\n",res);
	}
	//
	f_close(&flash_fil);
	//打开文件,读取数据,关闭文件
	res = f_open(&flash_fil, "hello.txt", FA_OPEN_ALWAYS|FA_WRITE|FA_READ);
	 if(res==FR_OK)
	{
		printf("\r\nf_open测试成功!\r\n");
	}
	else
	{
		printf("\r\nf_open错误代码:%d\r\n",res);
	}
	//
	res=f_read(&flash_fil, Rx_Buffer, BufferSize, &Num_Of_Read);
	printf("\r\n读取完成:%s\r\n",Rx_Buffer);
	if(res==FR_OK)
	{
		printf("\r\nf_read测试成功!\r\n");
	}
	else
	{
		printf("\r\nf_read错误代码:%d\r\n",res);
	}
	//
	f_close(&flash_fil);

 结果展示:

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在STM32F407上移植FATFS文件系统,首先需要了解FATFS是一个开源的文件系统,它可以在嵌入式设备上实现存储器的文件读写操作。 在移植FATFS之前,需要准备一些基本的材料,如软件开发环境、相关的文档和资料。可以从FATFS的官方网站下载最新版本的库文件和相关的示例代码。 首先,创建一个新的工程,并在工程中添加所需的库文件和头文件。将fatfs.c和diskio.c两个源文件添加到工程,并在工程设置中包含相关的头文件目录。 接下来,在工程中添加适配底层硬件的代码,在这里是针对STM32F407的。需要编写适配FATFS的底层I/O读写操作的代码,包括初始化SD卡、读取扇区数据和写入扇区数据。 然后,根据具体需求配置FATFS的参数。可以在fatfs_conf.h文件中修改相关的参数,如簇大小、扇区大小和最大文件数等。这些参数根据实际应用需求进行调整。 最后,编写应用程序代码。可以利用FATFS提供的API来实现文件的打开、读取和写入等操作。需要注意的是在使用FATFS API之前,需要先调用f_mount函数挂载文件系统。 完成以上步骤后,就可以进行编译和烧录操作,将程序下载到STM32F407上进行测试。可以通过读取和写入文件来验证FATFS的正常工作。 总结来说,STM32F407上移植FATFS文件系统需要准备相关的材料,包括库文件和文档。然后添加相关的源文件和头文件到工程中,并编写适配底层硬件的代码。之后根据需求配置FATFS参数,并编写应用程序代码。最后进行编译和烧录操作,进行测试。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值