gpt4 book ai didi

c++ - FatFS - 无法格式化驱动器,FR_MKFS_ABORTED

转载 作者:行者123 更新时间:2023-12-05 02:44:38 26 4
gpt4 key购买 nike

我是嵌入式开发新手,负责在 SPI 闪存上实现文件系统。我在 STM32CubeIDE 上使用 w25qxx 芯片和 STM32F4xx。我已经通过 SPI 成功地为 w25 创建了基本的 i/o,能够一次写入和读取扇区。

在我的 user_diskio.c 中,我已经实现了所有需要的 i/o 方法,并验证了它们是否正确链接并被调用。

在我的 main.cpp 中,我使用 f_mkfs() 格式化驱动器,然后获取可用空间,最后打开和关闭文件。但是,f_mkfs() 不断返回 FR_MKFS_ABORTED。 (FF_MAX_SS 设置为 16384)

  fresult = FR_NO_FILESYSTEM;
if (fresult == FR_NO_FILESYSTEM)
{
BYTE work[FF_MAX_SS]; // Formats the drive if it has yet to be formatted
fresult = f_mkfs("0:", FM_ANY, 0, work, sizeof work);
}

f_getfree("", &fre_clust, &pfs);

total = (uint32_t)((pfs->n_fatent - 2) * pfs->csize * 0.5);
free_space = (uint32_t)(fre_clust * pfs->csize * 0.5);

fresult = f_open(&fil, "file67.txt", FA_OPEN_ALWAYS | FA_READ | FA_WRITE);
f_puts("This data is from the FILE1.txt. And it was written using ...f_puts... ", &fil);
fresult = f_close(&fil);

fresult = f_open(&fil, "file67.txt", FA_READ);
f_gets(buffer, f_size(&fil), &fil);
f_close(&fil);

在调查我的 ff.c 后,代码似乎在第 5617 行停止:

if (fmt == FS_FAT12 && n_clst > MAX_FAT12) 返回 FR_MKFS_ABORTED;/* FAT12 的簇太多 */

n_clst 是在某些条件逻辑之前的几行计算的,在第 5594 行:

n_clst = (sz_vol - sz_rsv - sz_fat * n_fats - sz_dir)/pau;

这是调试器读取变量的内容:

enter image description here

这导致 n_clst 被设置为 4294935040,因为它是无符号的,尽管进行计算的实际结果将是 -32256如果变量已签名。可以想象,这似乎不是一个准确的计算。

我正在使用的设备具有 16M 位 (2MB) 的存储空间,分为 512 个大小为 4kb 的扇区。最小可删除 block 大小为 32kb。如果您需要有关我使用的闪存芯片的更多信息,page 5 of this pdf outlines all of the specs.

这是我的 USER_ioctl() 的样子:

DRESULT USER_ioctl (
BYTE pdrv, /* Physical drive nmuber (0..) */
BYTE cmd, /* Control code */
void *buff /* Buffer to send/receive control data */
)
{
/* USER CODE BEGIN IOCTL */
UINT* result = (UINT*)buff;
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_11, GPIO_PIN_SET);

switch (cmd) {
case GET_SECTOR_COUNT:
result[0] = 512; // Sector and block sizes of
return RES_OK;
case GET_SECTOR_SIZE:
result[0] = 4096;
return RES_OK;
case GET_BLOCK_SIZE:
result[0] = 32768;
return RES_OK;

}
return RES_ERROR;
/* USER CODE END IOCTL */
}

我试过使用 f_mkfs() 的参数,将 FM_ANY 换成 FM_FAT、FM_FAT32 和 FM_EXFAT(同时在我的 ffconf.h 中启用 exFat ...在那里。

最佳答案

这里:

fresult = f_mkfs("0:", FM_ANY, 0, work, sizeof work);

第二个参数无效。它应该是指向 MKFS_PARM 结构的指针或默认选项的 NULL,如 http://elm-chan.org/fsw/ff/doc/mkfs.html 中所述。 .

你应该有这样的东西:

MKFS_PARM fmt_opt = {FM_ANY, 0, 0, 0, 0};
fresult = f_mkfs("0:", &fmt_opt, 0, work, sizeof work);

除非您的媒体(SPI 闪存)不太可能使用默认选项 - 文件系统无法从媒体获取格式化参数,例如 SD 卡。您必须提供必要的格式信息。

鉴于您的删除 block 大小,我猜:

 MKFS_PARM fmt_opt = {FM_ANY, 0, 32768, 0, 0};

但需要说明的是,我从未将 ELM FatFS(STM32Cube 集成)与 SPI 闪存一起使用 - 可能还有其他问题。我也不使用 STM32CubeMX - 我认为该版本可能具有不同的界面,但我建议使用 ELM 的最新代码,而不是 ST 可能的僵化版本。

另一个考虑因素是,由于磨损均衡问题,FatFs 不是特别适合您的媒体。此外,ELM FatFs 没有日志记录或检查/修复功能,因此断电时不安全。这对于无法轻松备份或修复的不可移动媒体尤为重要。

您可能会考虑专门为 SPI NOR 闪存设计的文件系统,例如 SPIFFS , 或断电安全 LittleFS .下面是STM32中LittleFS的一个例子:https://uimeter.com/2018-04-12-Try-LittleFS-on-STM32-and-SPI-Flash/

关于c++ - FatFS - 无法格式化驱动器,FR_MKFS_ABORTED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66338066/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com