我是嵌入式开发的新手,我的任务是在 SPI 闪存上实现文件系统。我在 STM32CubeIDE 上使用 w25qxx 芯片和 STM32F4xx。我已经成功地为 w25 over SPI 创建了基本的 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);
在调查 my 后ff.c
,代码似乎在第 5617 行停止:
if (fmt == FS_FAT12 && n_clst > MAX_FAT12) return FR_MKFS_ABORTED; /* Too many clusters for FAT12 */
n_clst
在一些条件逻辑之前计算了几行,第 5594 行:
n_clst = (sz_vol - sz_rsv - sz_fat * n_fats - sz_dir) / pau;
以下是调试器读取变量的内容:
这将导致n_clst
设置为4294935040
,因为它是无符号的,尽管进行计算的实际结果将是-32256
变量是否有符号。可以想象,这似乎不是一个准确的计算。
我正在使用的设备具有 16M 位 (2MB) 的存储空间,存储在 512 个 4kb 的扇区中。最小可擦除块大小为 32kb。如果您需要有关我正在使用的闪存芯片的更多信息,此 pdf 的第 5 页概述了所有规格。
这就是我的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
.f_mkfs()
我正在使用,检查这里,这种方法有一些变体漂浮在那里。