В моем user_diskio.c я реализовали все необходимые методы ввода-вывода и проверили, что они правильно связаны и вызываются.
в моем 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);
Код: Выделить всё
if (fmt == FS_FAT12 && n_clst > MAX_FAT12) return FR_MKFS_ABORTED; /* Too many clusters for FAT12 */Код: Выделить всё
n_clstКод: Выделить всё
n_clst = (sz_vol - sz_rsv - sz_fat * n_fats - sz_dir) / pau;Это приводит к тому, что для n_clst устанавливается значение 4294935040, поскольку оно беззнаковое, хотя фактический результат вычислений был бы -32256, если бы переменная была подписана. Как вы понимаете, это не совсем точный расчет.
Устройство, которое я использую, имеет 16 Мбит (2 МБ) памяти, организованной в 512 секторов по 4 КБ. Минимальный размер стираемого блока составляет 32 КБ. Если вам нужна дополнительная информация о флэш-чипе, который я использую, на странице 5 этого PDF-файла приведены все характеристики.
Вот как выглядит мой 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 (вместе с включением exFat в моем ffconf.h)
code>. Я также пробовал использовать несколько значений для au вместо значения по умолчанию. Для получения более подробной документации по методу f_mkfs(), который я использую, проверьте здесь, существует несколько вариантов этого метода. .
Подробнее здесь: https://stackoverflow.com/questions/663 ... fs-aborted