【STM32】解决FATFS文件系统f_mkfs卡死问题

最近调试FATFS,通过STM32对SPI Flash进行读写操作。昨天晚上调通了,今天早上再调试,发现f_mount返回FR_NOFILESYSTEM。
依据网上所说,对磁盘格式化f_mkfs,卡死在FATFS库的ff.c->f_mkfs()的某个for循环里。

FATFS &fs;
//初始化省略

//res返回FR_NO_FILESYSTEM
res = f_mount(&fs, "0:", 1);
if(res == FR_NO_FILESYSTEM){
	//格式化,卡死
	res = f_mkfs("0:", 0, 0);
}

f_mkfs卡死的for循环代码位置

if (!au) {				/* AU auto selection */
	vs = n_vol / (2000 / (SS(fs) / 512));
	for (i = 0; vs < vst[i]; i++) ;//<----卡死在这里
	au = cst[i];
}

最后对SPI Flash进行了全片擦除命令,之后就可以正常操作了。
复盘猜想,大概是因为调试时,没有正确退出调试状态,在SPI Flash读写的时候下电,无意中破坏了创建好的文件系统,但也没法正确进行格式化。所以会之前读写正常,之后初始化失败。全片擦除之后再进行初始化操作就正常了,就是全片擦除速度很慢,128MB大概要30s。

FATFS &fs;
//初始化省略

//若res返回FR_NO_FILESYSTEM,进入格式化
res = f_mount(&fs, "0:", 1);
if(res == FR_NO_FILESYSTEM){
	//换成自己的全片擦除函数
	SPI_Flash_Erase_Chip();
	//格式化
	res = f_mkfs("0:", 0, 0);
}

网上好像也搜不到,搞了一整天。

物联沃分享整理
物联沃-IOTWORD物联网 » 【STM32】解决FATFS文件系统f_mkfs卡死问题

发表评论