Перейти к содержанию
    

FATFS и SD карта на STM32H743

Контроллер STM32H743. Карту видит и параметры флешки читает. Как правильно примонтировать FATFS? Файл не создает на флешке и не открывает. Вобщем не работает как надо. Могу выложить проект. Спасибо. f_mount(fs, "", 1);  отдает 0. out = f_open(file, "myfile.txt", FA_CREATE_ALWAYS | FA_WRITE);   отдает 9.

Изменено пользователем haker_fox
Уточнил название темы, переместил в подходящий раздел.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну этого как бы мало для ответа. В чём пишите? Какими библиотеками пользуетесь?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 minutes ago, smk said:

Файл не создает на флешке и не открывает.

Вообще информации на сайте автора с избытком)

Вот прямо из текущего проекта код монтирования и форматирования.

static BYTE work[FF_MAX_SS];
f_mkfs("0:", FM_FAT, 0, work, sizeof work);
f_mount(&s_fatFs, "", 0);
static char label[16];
snprintf(label, sizeof( label ), "0:%s", BOOT_DEVICE_NAME);
f_setlabel(label);
f_mount(nullptr, "", 0);

Вот пример чтения файла:

Spoiler
void Boot::updateFileProceed() {
    static FIL fil;
    static DIR dj;
    static FILINFO fin;

    if (f_mount(&s_fatFs, "", 0) != FR_OK)
        Boot::reboot();
    if (f_findfirst(&dj, &fin, "0:", "*.fmw") != FR_OK)
        Boot::reboot();
    if (!strlen(fin.fname))
        Boot::reboot();
    if (f_open(&fil, fin.fname, FA_READ) != FR_OK)
        Boot::reboot();
    const auto fSize = f_size(&fil);
    if (fSize != TOTAL_IMAGE_SIZE) {
        f_close(&fil);
        Boot::reboot();
    }
    size_t read;
    const auto fr = f_read(&fil, s_readFile, TOTAL_IMAGE_SIZE, &read);
    if (fr != FR_OK || read != TOTAL_IMAGE_SIZE) {
        f_close(&fil);
        Boot::reboot();
    }
    f_close(&fil);
    HardwareService::Mcu::Flash::blockWrite(STORAGE_ADDRESS, s_readFile, TOTAL_IMAGE_SIZE);
    HardwareService::Mcu::Misc::reboot();
}

Самое главное правильно написать diskio.c(pp). Если этот драйвер не работает надлежащим образом, то всё остальное бесполезно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Никогда раньше этого не делал. На что смотреть в diskio.c? Как устанавливается связь с физическим устройством? Пишу в Keil. FATFS с официального сайта.

Могу проект целиком выложить.

Physical drive number (0..) Как его узнать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 minutes ago, smk said:

Никогда раньше этого не делал.

Возможно, это делала Ваша среда разработки. Не знаю. Но кто-то точно делал.

8 minutes ago, smk said:

Как устанавливается связь с физическим устройством?

Да, конечно. Вообще, ещё раз повторюсь, на сайте разработчика вся информация в избытке. Надо просто потратить день и прочитать и реализовать. Но если кратко, Вы должны через diskio.c(pp) обеспечить связь Вашей библиотеки файловой системы с физическим накопителем. Только после этого накопитель можно форматировать, разбивать на разделы и форматировать, монтировать, отмонтировать, писать, читать и создавать файлы.

10 minutes ago, smk said:

Physical drive number (0..) Как его узнать?

Да он может быть любым. В diskio.c(pp) при обращении к диску этот номер попадает в виде аргумента функции. Вы можете сделать как угодно. Например, у Вас может быть один диск 7:.

Вот пример:

Spoiler

image.thumb.png.32068cef69225bc93d5b0e601f73a7e1.png

Тут правда номер диска не анализируется. Так лучше не делать, но в моём случае можно любой диск подсавить, и всё будет работать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот это HAL_SD_GetCardCID(&hsd1, &pCID); работает. Не могу понять как установить связь с FATFS. Читаю но пока не понятно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 minutes ago, smk said:

Вот это HAL_SD_GetCardCID(&hsd1, &pCID); работает.

К сожалению, я не использую подобные библиотеки. Поэтому тут уже помочь не могу. Нужно изучать документацию. Это долго, муторно, злит, тревожит, но без этого никак. Ну либо консультациями на форуме прийти к решению задачи, что уже может начать злить участников форума)))))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

48 minutes ago, smk said:

Никогда раньше этого не делал.

Поэтому и говоря писать самим, а не на ХАЛ. Тогда и будете знать, откуда ноги растут. А то ведь даже доки на FATFS не читали, хотя это всё там прописано.

image.thumb.png.e8f1e9684797baadf84ac07073c13e60.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну вобщем примерно разобрался. Кто-то может поделиться примером отредактированного diskio.c ? И еще один ламерский вопрос. Как в кейле передать в функцию указатель на массив чтоб предупреждения не давало типа (114): warning: incompatible pointer types passing 'char **' to parameter of type 'uint8_t *' (aka 'unsigned char *') [-Wincompatible-pointer-types] ? Или просто выключить его?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, smk сказал:

И еще один ламерский вопрос. Как в кейле передать в функцию указатель на массив чтоб предупреждения не давало типа (114): warning: incompatible pointer types passing 'char **' to parameter of type 'uint8_t *' (aka 'unsigned char *') [-Wincompatible-pointer-types] ? Или просто выключить его?

"В кейле" - не знаю как, а в си просто взять и передать:

char array[...];

func(&array[0]);

и читайте в учебнике по си про: "приведение типов".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, smk сказал:

Как в кейле передать в функцию указатель на массив

Никак. В сях нет типа "указатель на массив". Вы можете передать только указатель на первый элемент, информация о размерности массива при этом теряется. Имя массива неявно приводится к указателю на его первый элемент. Исходите из этого. Или же вы можете обернуть массив в структуру и передавать указатель на эту структуру.

Конструкция "&имя_массива" на самом деле означатет "адрес указателя на первый элемент массива". Именно на это и ругается компилятор.

 

1 час назад, jcxz сказал:

func(&array[0]);

Такая конструкция эквивалентна записи func(array) но более громоздка.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 минут назад, smk сказал:

Тоесть пусть ругается? Работает все исправно.

ну если не помогло:

1 час назад, jcxz сказал:

читайте в учебнике по си про: "приведение типов".

:unknw:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...