smk 0 2 июня, 2023 Опубликовано 2 июня, 2023 (изменено) · Жалоба Контроллер STM32H743. Карту видит и параметры флешки читает. Как правильно примонтировать FATFS? Файл не создает на флешке и не открывает. Вобщем не работает как надо. Могу выложить проект. Спасибо. f_mount(fs, "", 1); отдает 0. out = f_open(file, "myfile.txt", FA_CREATE_ALWAYS | FA_WRITE); отдает 9. Изменено 2 июня, 2023 пользователем haker_fox Уточнил название темы, переместил в подходящий раздел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Spider 0 2 июня, 2023 Опубликовано 2 июня, 2023 · Жалоба Ну этого как бы мало для ответа. В чём пишите? Какими библиотеками пользуетесь? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 2 июня, 2023 Опубликовано 2 июня, 2023 · Жалоба 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). Если этот драйвер не работает надлежащим образом, то всё остальное бесполезно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smk 0 2 июня, 2023 Опубликовано 2 июня, 2023 · Жалоба Никогда раньше этого не делал. На что смотреть в diskio.c? Как устанавливается связь с физическим устройством? Пишу в Keil. FATFS с официального сайта. Могу проект целиком выложить. Physical drive number (0..) Как его узнать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 2 июня, 2023 Опубликовано 2 июня, 2023 · Жалоба 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 Тут правда номер диска не анализируется. Так лучше не делать, но в моём случае можно любой диск подсавить, и всё будет работать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smk 0 2 июня, 2023 Опубликовано 2 июня, 2023 · Жалоба Вот это HAL_SD_GetCardCID(&hsd1, &pCID); работает. Не могу понять как установить связь с FATFS. Читаю но пока не понятно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 2 июня, 2023 Опубликовано 2 июня, 2023 · Жалоба 14 minutes ago, smk said: Вот это HAL_SD_GetCardCID(&hsd1, &pCID); работает. К сожалению, я не использую подобные библиотеки. Поэтому тут уже помочь не могу. Нужно изучать документацию. Это долго, муторно, злит, тревожит, но без этого никак. Ну либо консультациями на форуме прийти к решению задачи, что уже может начать злить участников форума))))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 42 2 июня, 2023 Опубликовано 2 июня, 2023 · Жалоба 48 minutes ago, smk said: Никогда раньше этого не делал. Поэтому и говоря писать самим, а не на ХАЛ. Тогда и будете знать, откуда ноги растут. А то ведь даже доки на FATFS не читали, хотя это всё там прописано. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smk 0 3 июня, 2023 Опубликовано 3 июня, 2023 · Жалоба Ну вобщем примерно разобрался. Кто-то может поделиться примером отредактированного diskio.c ? И еще один ламерский вопрос. Как в кейле передать в функцию указатель на массив чтоб предупреждения не давало типа (114): warning: incompatible pointer types passing 'char **' to parameter of type 'uint8_t *' (aka 'unsigned char *') [-Wincompatible-pointer-types] ? Или просто выключить его? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 231 3 июня, 2023 Опубликовано 3 июня, 2023 · Жалоба 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]); и читайте в учебнике по си про: "приведение типов". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smk 0 3 июня, 2023 Опубликовано 3 июня, 2023 · Жалоба Начитался уже. Потому и спросил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 3 июня, 2023 Опубликовано 3 июня, 2023 · Жалоба 1 час назад, smk сказал: Как в кейле передать в функцию указатель на массив Никак. В сях нет типа "указатель на массив". Вы можете передать только указатель на первый элемент, информация о размерности массива при этом теряется. Имя массива неявно приводится к указателю на его первый элемент. Исходите из этого. Или же вы можете обернуть массив в структуру и передавать указатель на эту структуру. Конструкция "&имя_массива" на самом деле означатет "адрес указателя на первый элемент массива". Именно на это и ругается компилятор. 1 час назад, jcxz сказал: func(&array[0]); Такая конструкция эквивалентна записи func(array) но более громоздка. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smk 0 3 июня, 2023 Опубликовано 3 июня, 2023 · Жалоба Тоесть пусть ругается? Работает все исправно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 231 3 июня, 2023 Опубликовано 3 июня, 2023 · Жалоба 7 минут назад, smk сказал: Тоесть пусть ругается? Работает все исправно. ну если не помогло: 1 час назад, jcxz сказал: читайте в учебнике по си про: "приведение типов". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 3 июня, 2023 Опубликовано 3 июня, 2023 · Жалоба То есть напишите правильно. Или покажите код. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться