背景
在初始化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");
}
}