【STM32】STM32+SD+FATFS使用f_mount时返回值为13(FR_NO_FILESYSTEM)的解决办法

背景

在初始化SD卡时,发现SD_Init()之后的f_mount()偶尔会返回13(FR_NO_FILESYSTEM)。一开始的做法是格式化,然后继续挂载:

void my_sd_init(void)
{
	FRESULT res_sd; 								
	SD_Init();                        //初始化sd卡相关一些gpio
	exfuns_init();										//为exfuns申请内存
	res_sd = f_mount(fs[0],"0:",1);   //挂载
	if (res_sd == FR_NO_FILESYSTEM)   //指定的逻辑驱动器没有挂载文件系统
	{
		res_sd=mf_fmkfs((u8 *)"0:", 2, 32*1024);  /* 格式化FLASH,1:,盘符;0,使用默认格式化参数 ,簇大小32k*/					
		if (res_sd == FR_OK) 
		{	
			res_sd = f_mount(NULL,"0:",1);				
			res_sd = f_mount(fs[0],"0:",1);				
		} 
		else 
		{				
			sd_flag=0;
		}
	} 
	else if (res_sd!=FR_OK) 
	{	
		sd_flag=0;
	} 
}

问题

上述方案确实能解决,但这样就有个问题,万一之前保存很多重要的测试数据,每次挂在失败就格式化,那我的资料不就没有了?所以,挂在失败后,把程序改为:检测到第一次挂载失败后,重新挂载10次,如果挂载10次还不行,那就做重启或者跳出循环。

void my_sd_init(void)
{
	FRESULT res_sd; 								
	while(SD_Init())//检测不到SD卡
	{
	  static u8 sd_err_times = 0;
		sd_err_times++;
		if(sd_err_times==10) break; //sd卡出错,响十次蜂鸣器后退出
		printf(" SD Card Error!\r\n");
		GPIO_ResetBits(GPIOE, GPIO_Pin_2);                                   //关闭蜂鸣器
		delay_xms(500);					
		printf(" Please Check! \r\n");
		GPIO_SetBits(GPIOE, GPIO_Pin_2);                                   //打开蜂鸣器
		delay_xms(500);
	}
	exfuns_init();										//为exfuns申请内存
	res_sd = f_mount(fs[0],"0:",1);   //挂载
	//while(res_sd == FR_NO_FILESYSTEM)
	while(res_sd != FR_OK)
	{
	  static u8 mount_times = 0; 
		mount_times++;
	  printf(" 挂载文件系统失败,开始第%d次重新挂载!\r\n",mount_times);
		res_sd = f_mount(NULL,"0:",1);				
	  res_sd = f_mount(fs[0],"0:",1);	
		if (mount_times == 10) //如果超过10次挂载不成功,停止挂载
		{	
		  printf(" 挂载文件系统10次失败!\r\n");
			sd_flag=0;
      break;			
		} 

	}
	if(sd_flag != 0)
	{
	  printf(" 文件系统挂载成功!!!\r\n\r\n");
	}

}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32CubeMX是一个用于配置STM32微控制器的图形化工具。它可以帮助我们快速配置SD卡、DMA和FATFS文件系统。 在开始配置之前,我们需要先连接SD卡STM32微控制器,并确保正确配置了SD卡的GPIO引脚,使其与STM32SDIO接口连接。 首先,打开STM32CubeMX并选择相应的微控制器型号。然后,点击"Pinout & Configuration"选项卡,在左侧的"Peripherals"下选择SDIO,然后在右侧选择SDIO的引脚和模式。确保使能SDIO的钟和数据信号引脚,并选择正确的模式,如4线模式。 接下来,点击"Middleware"选项卡,在右侧的"STemWin"下选择"FATFS"。然后,在"FATFs 1"下选择"SDIO"作为SD卡的字节访问连接器,并在"Volume1 size"中指定SD卡的容量。 再次点击"Middleware"选项卡,在右侧的"FATFS"下选择"DMA",以启用DMA传输。在"Mode"中选择"POLLING" 或"DMA"作为传输模式,并选择一个可用的DMA通道,例如DMA2-Stream3。 最后,点击"Project"选项卡,在右侧的"Project Name"下输入项目名称,然后点击"Save"按钮保存配置。 现在,我们已经完成了STM32CubeMX的配置。生成代码并导入到我们的IDE中,例如Keil或者STM32CubeIDE。 在代码中,我们需要初始化SDIO和DMA,并创建FATFS实例,在主循环中使用FATFS函数完成SD卡的读写操作。我们可以使用FATFS提供的函数来打开、写入、读取和关闭文件,以及创建、删除和重命名目录。 这就是使用STM32CubeMX配置SD卡、DMA和FATFS的步骤。通过使用STM32CubeMX,我们可以快速而方便地配置SD卡、DMA和FATFS,从而实现SD卡的读写操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值