Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Помогите подключить FatFs к STM32F105RBT6 + SDHC

Сб фев 23, 2019 22:01:36

Пытаюсь подключить FatFs (http://elm-chan.org/fsw/ff/00index_e.html) к STM32F105RBT6 + карта SDHC (поддержка старых SD не требуется), проект в Keil 5.26,

отладка в оперативной памяти (из 64кб - 40кб под прошивку 24кб оставшаяся оперативная память)

Создал проект с тремя основными функциями - инициализация SDHC (предполагается работа только с одной картой), чтение N секторов в буфер начиная со стартового адреса,

запись N секторов из буфера начиная со стартового адреса, проверял на буферах размером до 8 секторов, всё надежно работает.

Пытаюсь подключить библиотеку, нужно написать функцию disk_read:



получаю ошибку:

fatfs/diskio.cpp(159): error: no matching function for call to 'spi_SD_Read_Block'


моя функция:



Что не так?

Второй вопрос: я саму библиотеку правильно скачал http://elm-chan.org/fsw/ff/arc/ff13c.zip ?

Третий вопрос: мой проект написан на C++ а библиотека FatFs на C, как правильно, в этом случае, её подключать?
Последний раз редактировалось DENIS451 Вс фев 24, 2019 12:49:55, всего редактировалось 1 раз.

Re: Помогите подключить FatFs к STM32F105RBT6 + SDHC

Вс фев 24, 2019 04:11:39

DENIS451 писал(а):Что не так?
Праздник, наверное ... :sleep:
Хотя, переводчики не дремлют :
ошибка: нет соответствующей функции для вызова 'spi_SD_Read_Block'

Сами не пробовали перевести ?

Re: Помогите подключить FatFs к STM32F105RBT6 + SDHC

Вс фев 24, 2019 10:18:49

Перевести отдельные слова я могу.

Уточнение, если поставить такую заглушку:

char buffer[10];


if(0 == spi_SD_Read_Block(buffer, sector, uint8_t (count))) {return RES_OK;}
else {return RES_ERROR;}


код компилируется, т.е. компилятору не нравиться передача указателя на буфер, но почему?!

BYTE это обычный unsigned char, после подключения FatFs я могу в своём коде поменять unsigned char или uint8_t на BYTE и ничего не изменится.

typedef unsigned char BYTE; /* char must be 8-bit */

Re: Помогите подключить FatFs к STM32F105RBT6 + SDHC

Вс фев 24, 2019 10:29:00

Чудеса...
У Вас ошибка, судя по содержимому её теста, связана не с указателем, а с невозможностью компилятору найти реализацию функции spi_SD_Read_Block.

Re: Помогите подключить FatFs к STM32F105RBT6 + SDHC

Вс фев 24, 2019 21:19:17

С буфером вопрос решился - я что то думал что unsigned char и просто char в данном случае одно и тоже, а это не так.
Остальные вопросы в силе, (скоро новые возникнут).

Добавлено after 6 hours 45 minutes 21 second:
Новые вопросы:

Есть некоторые успехи, в этой тестовой функции:


все функции до f_close нормально работают (как минимум возвращают 0, а не код ошибки, и делают ожидаемые вещи),
а вот f_close возвращает 1, почему такое может быть?

Нужно ли настраивать таймер на 10ms и вызывать в нём disk_timerproc (я вообще не нашёл такой функции в FatFs)?

Каким образом и где FatFs создаёт буферы для чтения и записи сектров, указатели которых передаются в функции
disk_write и disk_read, если они создаются динамически, можно ли их заставить создаваться в стеке без потери функциональности
библиотеки?

Re: Помогите подключить FatFs к STM32F105RBT6 + SDHC

Вт фев 26, 2019 00:55:41

Вот весь проект:
https://yadi.sk/d/w98_y4E7kJN6Eg


Уточнение, перераспределение памяти для отладки в RAM - 44кб под
прошивку 20кб оставшаяся оперативная память память.

Сейчас появилась такая проблема, в fileWork.cpp в функции ff_test
есть строка:

res = f_open(&logFile, "log.txt", FA_OPEN_APPEND | FA_WRITE);

если выходить из функции до неё, то всо нормально, выполнение этой строки, в какой то момент(не пойму что я сделал), начало приводить к зависанию МК, до этого проблема была только с f_close (код ошибки 1), и ведь строки в log.txt успешно добавлялись!

Карта подключена к J10 (схема в проекте), к J2 подключен экран 20x4,
lines[NumLines][20] массив для хранения строк отладочного экрана строки
крутятся энкодером, пробовал подавать питание на J1 убирая перемычку J4, на проблему это не повлияло.

Добавлено after 8 hours 17 minutes 12 seconds:
Нашёл ошибку, в функции чтения и записи секторов (spi_SD_Write_Block и spi_SD_Read_Block) они корректно работали
только при чтении одного сектора, иначе адрес котцался, так правильно:



но исправление на вышеописанную проблему никак не повлияло.

Кстати, я беру некоторый код отсюда: https://eax.me/stm32-fatfs/ вам тут ничего не кажется подозрительным?

Добавлено after 5 hours 9 minutes 30 seconds:
Новый вопрос, при каком минимальном количестве оперативной памяти в микроконтроллере у вас нормально работал FatFs не урезанный
(с поддержкой длинных имён и юникодом c русской кодовой страницей)?

Re: Помогите подключить FatFs к STM32F105RBT6 + SDHC

Вт фев 26, 2019 17:11:43

Было переполнение стэка, он был задан 1кб (размер по умолчанию), поставил 4кб, глюк исчез.

Это только у меня такая проблема, всем остальным хватает 1кб для FatFs на STM32 ?!

При каких обстоятельствах мне ждать от FatFs переполнения уже 4кб?

Я нашёл где прячется этот самый массив на 512 байт минимум (см. win BYTE win[FF_MAX_SS];):


причём структурных переменных "FATFS" может быть много, они что при прерываниях тоже в стек лезут?

Re: Помогите подключить FatFs к STM32F105RBT6 + SDHC

Вт фев 26, 2019 17:44:00

структуры у вас лезут не сами куда-то, а вы их помещаете либо в области глобальных переменных, либо в "куче", либо в области локальных переменных - а вот это ничто иное, как стек. если у вас структура определена внутри функции, как локальная, она попадет в стек - и это естественно.

FatFS от Чена в минимально-приемлемой конфигурации (чтение одного и запись другого файла) вполне неплохо обходится чуть более, чем килобайтом памяти. кстати, у него на сайте о требоаниях к ОЗУ все расписано весьма подробно и детально по всем возможностям...
Ответить