STM32Cube. Настройка и использование FatFS.

Наш учебный курс по программированию микроконтроллеров с использованием новейших инструментов от ST, а именно STM32Cube, в самом разгаре 😉 И на очереди у нас работа с файловой системой FatFS.

Работа с FatFS

В этот раз я буду использоваться плату с микроконтроллером STM32F103VET6 (в отличие от предыдущих статей цикла, в которых использовалась STM32F4-Discovery). В остальном все точно так же — запускаем Cube, создаем новый проект и сейчас начнем разбираться с FatFS )

Работать с файловой системой мы будем при помощи внешней SD-карты, подключенной к микроконтроллеру при помощи интерфейса SDIO, с которого мы и начнем настройку нашего проекта.

Итак, на вкладке Pinout нам нужно задействовать интерфейс SDIO. Как только мы активируем интерфейс, сразу же станет доступным для выбора пункт SD Card в разделе Middlewares — FATFS:

STM32Cube настройка SDIO

Cube, конечно же, зарезервировал все выводы микроконтроллера, которые понадобятся нам для подключения карты памяти. Кстати, обратите внимание, модули UART4 и UART5 стали недоступны для использования в этом проекте. Связано это как раз-таки с занятыми интерфейсом SDIO выводами контроллера.

Переходим к следующему пункту, а точнее ко вкладке Configuration. Там появились новые пункты, доступные для дополнительной конфигурации:

Использование FatFs в STM32Cube

Начнем с настройки SDIO. Дважды кликаем на SDIO и попадаем в окно настроек интерфейса. В принципе нас там интересует только делитель частоты тактирования SDIO:

Интерфейс SDIO

Аналогично мы можем попасть в окно настроек непосредственно файловой сиcтемы. Но там я все оставил без изменений, поскольку на данном этапе нас все устраивает 😉

В общем-то на этом работа с STM32Cube и заканчивается, осталось только сгенерировать исходный код и перейти к работе с проектом. Итак, генерируем и открываем проект в IAR’е.

Cube уже позаботился о том, чтобы вызвать необходимые функции инициализации, а кроме того в сгенерированном коде можно увидеть вызов функции FATFS_LinkDriver(). Давайте поподробнее остановимся на этом моменте.

Для работы с функциями чтения/записи Cube создал файл sd_diskio.c, в котором определены все необходимые функции, а именно:

SD_initialize,
SD_status,
SD_read, 
SD_write,  
SD_ioctl

Кроме того, определена структура SD_Driver, которая содержит указатели на все перечисленные функции. А функция FATFS_LinkDriver() как раз-таки и нужна для того, чтобы поставить эту структуру в соответствие текущему номеру диска. Если мы первый раз вызываем эту функцию, то номер диска будет равен 0, соответственно, при повторных вызовах этот номер будет увеличиваться на единицу. Это очень удобно, когда в проекте используется несколько внешних дисков, например, внешняя NAND-память и SD-карта.

С этим все понятно, давайте добавим в функцию main() тестовый код, который создаст новый файл на карте памяти и запишет в него некоторые данные:

/* USER CODE BEGIN 3 */
  FATFS fileSystem;
  FIL testFile;
  uint8_t testBuffer[16] = "SD write success";
  UINT testBytes;
  FRESULT res;
 
  if(f_mount(&fileSystem, SD_Path, 1) == FR_OK)
  {
    uint8_t path[13] = "testfile.txt";
    path[12] = '\0';
 
    res = f_open(&testFile, (char*)path, FA_WRITE | FA_CREATE_ALWAYS);
 
    res = f_write(&testFile, testBuffer, 16, &testBytes);
 
    res = f_close(&testFile);
  }
  /* Infinite loop */
  while (1)
  {
 
  }
  /* USER CODE END 3 */

Здесь мы открываем текстовый файл, а если его нет на карте, то создаем, и после этого записываем текстовую строку. В общем, все как и в обычных проектах, использующих FatFs, тут Cube не привнес никаких различий. Важным моментом является то, что нельзя забывать закрыть файл после окончания работы с ним ) Поэтому после записи наших данных вызываем функцию f_close(). Итак, программируем микроконтроллер и запускаем программу на исполнение. По идее на нашей карте должен был появиться файл, давайте это проверим! Поскольку у нас в программе только поддержка FatFs, без USB, то достаем карту, вставляем в кардридер и проверяем:

Работа с файловой системой в STM32Cube

На карте памяти появился файл testfile.txt, в котором записано именно то, что мы и записывали, а именно строка, говорящая нам о том, что запись проведена успешно 😉 Таким образом, наша задача полностью решена.

Итак, разобрались мы в этой статье как при помощи STM32Cube реализовать поддержку FatFs в нашем проекте. Собственно, большую часть работы Cube взял на себя, нам осталось совсем немного. Так что на сегодня на этом заканчиваем, обязательно следите за обновлениями нашего сайта! 😉

Понравилась статья? Поделись с друзьями!

STM32Cube. Настройка и использование FatFS.: 92 комментария
  1. Спасибо за статью! Непонятно какую частоту мы получаем при SDIOCLK clock divide factor=3? 72/3?

    • Это уже в зависит от того, какие частоты шин и периферии настроены в Cube в окне RCC Configuration

  2. Такой вопрос, как подключен карт-ридер, к каким портам, может есть принципиальная схема, хотелось бы его использовать на своей плате STM32F429 discovery

  3. К сожалению, не получилось воспроизвести этот пример на STM32F4Discovery. Очень нужен, но пока … 🙁 пробовал и 1битную и 4битную версию и подтяжки и без. Очень мало подробностей и нет промежуточного контроля процесса. не понятно куда рыть. Но спасибо за Вашу работу в любом случае. Все остальные примеры заработали и полезны.

    • А какую ошибку функции fatfs возвращают?
      Кстати, можно попробовать предделитель частоты увеличить.

  4. А как мне посмотреть процесс? я только учусь, вот в руки попала STM32F4Discovery. Судя по тому что я добавил зажигание светодиода в ELSE то не выполняется первое условие if(f_mount(&fileSystem, SD_Path, 1) == FR_OK). Как то можно заглянуть внутрь работы?

    • В режиме отладки можно прямо по строкам кода пройтись и тогда будет понятно, в чем именно проблема. Но первым делом советую тактовую частоту понизить попробовать (увеличить делитель).

  5. Монтирует, но не открывает файл и не создает (пробовал с уже созданным). Делитель увеличивал. А какая формула вычисления делителя, что делится на 2+3?
    if(f_open(&testFile, (char*)path, FA_CREATE_ALWAYS | FA_WRITE) == FR_OK) //открыли файл или создали если нет
    {HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_SET);//LED ORANGE }
    else { HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);//red led
    while (1) { }
    И вот получаю красный. Когда задачи выполняются одна за другой как будто все проходит хорошо но файла в результате нет.
    И не могли бы Вы посвятить статью отладке программ?

    • Частота шины делится на предделитель и в итоге получаем частоты SDIO.
      А, кстати, ты функцию f_close() вызываешь после работы с файлом?

      Вот статья по отладке, старая еще — http://microtechnics.ru/stm32-uchebnyj-kurs-otladka-programmy-v-keil/ , но я не уверен что в данном случае она сильно поможет, честно говоря…

      Тут по сути надо зайти в режим отладки и клавишами F9, F10 идти по шагам по программе

  6. Добрый вечер! Спасибо за статью! И у меня есть к Вам вопрос? Как организовать запись на SD карту оцифрованных значений, можно ли напрямую из функции main() забирать значения из ADC и писать их на флешку в вашем примере?

    • Надо будет к ASCII формату привести.
      То есть если, например, надо число 25 записать в файл, то можно так сделать:
      uint8_t buffer[2];

      buffer[0] = 0x32;
      buffer[1] = 0x35;

      Затем два байта записать в файл и в файле будет число 25.

  7. Спасибо за ответ! А можно ли делать запись оцифрованных значений в виде бинарного файла?

  8. Напишите аналогичный пример работы с FATFS на примере подключения SD по SPI

    • У Вас получилось в Кубе сделать FATFS по SPI? Если да, то подскажите.
      Если можно.
      Спасибо.

      • Да, у меня все получилось и по SPI и по SDIO. По SDIO вообще ничего делать не надо CUBE сам все за вас сделает, а после генерации проекта просто используем функции из драйвера. По SPI необходимо прописать низкоуровневые функции в файле \Middlewares\Third_Party\FatFs\src\diskio.c
        Единственная проблема, Keil не всегда корректно работает с распределением памяти под массивы (буферы) при настройках, заданных по умолчанию в кубе. У меня эта проблема периодически появляется. Я далеко не профессиональный программист, развлекаюсь так для себя. Проблемы решаются методом «тыка» поэтому когда занимался с FATFS все решилось использованием IAR вместо KEIL. Сейчас работаю над другим проектом, тоже столкнулся с аналогичной проблемой, переезжать на IAR лень. Вопрос решился, когда снял галочку в разделе оптимизации Options for target — C/C++ ..One ELF Section per Function.

  9. Добрый день, попробовал реализовать FTFS на плате STM32VLDISCOVERY с подключенной SD к SPI1 (РА5-РА7). Использовал CUBE. Прошла инициализация, создался файл на SD, а вот прочитать и записать в файл не получилось. В некоторых случаях переставал инициализироваться дисплей (висит на SPI2). В отладчике видно, что выкидывает в HardFault_Handler. Думаю проблемы с распределением памяти.

  10. Добрый день. Попробовал без дисплея, не помогло. А так же много других вариантов. Наверно проблема в криво написанных функциях обмена с SD по SPI. Поэтому остается актуальной просьба написать статью об этом. 🙂
    Ну а если не получится, перепаяю STM32F100RB на STM32F415RG и буду использовать ваш проверенный вариант.

  11. Думаю надо отписаться по результатам дальнейших экспериментов с FATFS. Перепаял таки STM32F100RB на STM32F405RG, ошибки повторились. Затем попробовал Ваш пример уже с использованием SDIO — НЕ РАБОТАЕТ!!!!!. Сломал не одни бубны в адском танце. Оказалось проблема совсем в неожиданном месте — в компиляторе. Я использовал KEIL. После сборки проекта в IAR все заработало. Теперь снова буду пробовать SPI.

  12. До попытки работы с FATFS меня полностью устраивала пара KEIL + CUBE.
    Кстати только что запустил FATFS по SPI — тоже работает.

  13. У меня в связке CubeMX + KEIL5 все работает. Но правда пришлось пройти следующие шаги. Чтобы убедиться в работе SDIO сперва настроил работу функций HAL_SD_WriteBlocks. И при попытке записи FIFO буфер вернул ошибку SD_TX_UNDERRUN. Помогло увеличение значения делителя. Затем отформатировал SD в FAT и попробовал функции FAT. f_open вызвал ff_memalloc((_MAX_LFN+1)*2) , которая вернула ошибку. Помогло уменьшение _MAX_LFN в ffconf.h.
    Что это за LFN и почему при родном значении 255 память не смогла выделиться? Контроллер stm32f429ni , плата eval.

    • Я планирую с начала сентября заняться новыми статьями, но уверенности нет, как и свободного времени…

  14. Если не сложно подскажите в каком файле user_diskio.c или diskio.c мне нужно вписать низкоуровневые функции по работе с картой ? заранее благодарен.

  15. Маленькое замечание:

    uint8_t path[13] = «testfile.txt»;
    path[12] = »;

    Последняя строчка не имеет смысла т.к. текст в ковычках (в первой строке) так и так будет с нулевым символом в конце (согласно стандарту).

  16. К стати, еще забавный факт. В кейле (5 версия) не работает пример с оптимизацией -O3 (поумолчанию ставится кубом), но без оптимизации работает.

  17. скинь проект плиз сюда или на почту плиз. постоянно ошибка вываливается FR_NOT_ENOUGH_CORE. неделю мучаюсь…:(

    • Не хватает памяти для работы. Существует одна из следующих причин:

      Не удалось выделить память для буфера LFN рабочего. (Соответствующий параметр: _USE_LFN)
      Размер данного буфера недостаточен для необходимого размера.

  18. Да, спасибо. в кубе поправил эту опцию-заработало… но замечаю странную особенность — под отладкой через раз работает… бывает зайдёт в какую-то функцию и сидит там где-то в цикле крутится, зато если просто зашить и вставить флэшку пишет в неё просто великолепно.

  19. Если делать все как написал автор — работать НЕ будет. Даже удивительно, как у автора заработало. Автор забыл указать еще несколько пунктов.

  20. Я по началу тоже долбался. Но потом увидел, что Stack_Size и Heap_Size очень маленькие!

    В общем 99.9% у тебя рабочее, но может у тебя стек и heap уже стояли больше, чем создает CubeMX.

    На моем случае STM32F103RCT они стоят недостаточно большие 400 и 200 соответственно. По официальному описанию на FatFS их надо ставить 800 и 400. У меня меняется все это дело в startup_stm32f103xe.s файле.
    …..
    …..
    Stack_Size EQU 0x00000800
    …..
    …..
    Heap_Size EQU 0x00000400

    Кстати с оптимизацией O3 работает отлично! В связке Keil 5 и CubeMX работает тоже отлично!

    Вот ссылка на полный проект:
    https://yadi.sk/d/ghDIpwZKk7rvL

  21. и еще, после каждой регенерации CubeMX сбрасывает стек и heap!

    Stack_Size EQU 0×00000400
    …..
    …..
    Heap_Size EQU 0×00000200

    и приходится выставлять назад в

    Stack_Size EQU 0×00000800
    …..
    …..
    Heap_Size EQU 0×00000400

  22. Aveal большое спасибо за статью, Сергей большое спасибо за дополнение, мне это очень помогло так как использовал STM32F103RCT. В файле startup_stm32f103xe.s изначально было:
    Stack_Size EQU 0×00000200
    …..
    …..
    Heap_Size EQU 0×00000400
    поменял на:
    Stack_Size EQU 0×00000800
    …..
    …..
    Heap_Size EQU 0×00000400
    и в кубе выставил SDIOCLK clock divide factor=6.
    В связке CubeMX + KEIL5 всё заработало!

  23. Ещё вопрос, каков максимальный объём массива uint8_t testBuffer[ ] который можно записать в файл?

    • Насколько я помню Fat это не ограничивает, то есть размер массива ограничен только величиной оперативной памяти контроллера. По 32кБ за раз я писал как минимум.

  24. Aveal, замечательная статья и замечательные уроки.
    Помогите разобраться с чтением с карты. Монтирование, открытие и запись проходят успешно, а прочитать не могу. Уже весь мозг сломал. Код был сгенерирован под Keil4.74
    uint8_t mas[6]=»qwerty»;
    uint8_t mas2[6];
    if (f_mount(&fileSystem, SD_Path, 1) == FR_OK)
    {
    Led_Red_On;
    if (f_open(&testFile, (char*)»my_file_017.txt», FA_WRITE | FA_CREATE_ALWAYS)==FR_OK) Led_Green_On;
    if (f_write(&testFile, mas, 6, &testBytes)==FR_OK) Led_Yellow_On;
    if (f_read (&testFile, mas2, 6, &testBytes)==FR_OK) Led_Blue_On;
    if (f_read (&testFile, &mas2, 6, &testBytes)==FR_OK) Led_Blue_On;
    Тут я пробовал прочитать с записью в массив по указателю и без него. все равно ничего на получается.
    Красный, зеленый, желтый диоды включаются, когда пошагово отлаживаю, а синий нет.
    Подскажите плииииз, в чем дело, почему не читается?
    Спасибо заранее всем, кто ответит.

    • Добрый день!

      Просто надо файл открывать с флагом FA_READ, а после записи закрывать. Примерно так:
      f_open(&testFile, (char*)»my_file_017.txt», FA_WRITE | FA_CREATE_ALWAYS);
      (f_write(&testFile, mas, 6, &testBytes);
      f_close(&testFile);

      f_open(&testFile, (char*)»my_file_017.txt», FA_READ);
      (f_read (&testFile, mas2, 6, &testBytes);
      f_close(&testFile);

  25. Спасибо большое. Все заработало.
    У меня еще 1 вопрос:
    если в .тхт файле есть строки, то как мне их выводить последовательно друг за другом?
    например:
    1.aaaaaaaa
    2.bbbbbbbb
    3.ccccccccc
    4.dddddddd
    и т.д.
    Спасибо за ответ.

  26. я имел в виду, что на карте уже записаны строки и мне их нужно последовательно считывать.
    конкретнее. у меня на карте записана картинка, много 320 строк длиной 240 символов.
    я хочу брать строку, выводить на дисплей, потом брать следующую, опять на дисплей и так 320 раз.
    как мне каждый раз переходить на новую строку для считывания?

    • Можно функцией f_lseek переместить указатель файла в любое место и считывать оттуда. А вообще при чтении N байт указатель автоматически смещается на N позиций, поэтому при вызове функции в следующий раз будут прочитаны новые данные, а не те же самые.

  27. иными словами, если я сделаю в цикле:
    while(counter<320)
    {
    f_read (&testFile, mas, 240, &testBytes);
    вывод на дисплей;
    counter++;
    }
    то каждый раз я буду выводить на дисплей новую строку (1-320)?
    до или после функции f_read (&testFile, mas, 240, &testBytes) надо что-то дописать?

  28. Помогите люди добрые!
    Написал инициализацию для SD на HAL в среде Keil5(через SPI интерфейс). Отдельно от FATFS инициализация проходит, но как только собираешь проект SPI начинает клинить… не передает данные, возвращает BUSY(мол, отвали занятая я…).
    Может у кого есть проект для Keil5 c инициализаций SD по интерфейсу SPI написанный на HAL, в качестве примера?

  29. Интересная особенность, в Кубе указал SDIO 4 бит, а в сгенерированном проекте
    hsd.Init.BusWide = SDIO_BUS_WIDE_1B;
    Все при этом работает
    Если меняю на
    hsd.Init.BusWide = SDIO_BUS_WIDE_4B;
    — не работает…

  30. Пытаюсь подключить SDHC карточку по SDIO интерфейсу. Контроллер STM32F401VE. Пробовал по описанию в Вашей статье, пробовал по документации: http://www.st.com/content/ccc/resource/technical/document/user_manual/10/c5/1a/43/3a/70/43/7d/DM00104712.pdf/files/DM00104712.pdf/jcr:content/translations/en.DM00104712.pdf (всё делал через Cube)
    Результат один и тот же. В Вашем примере функция монтирования f_mount(…) выдаёт ошибку FR_NOT_READY. А в примере от ST функция создания файловой системы f_mkfs(…) выдаёт ту же ошибку. SDHC карточка размером 4 Gb class 6 от самсунга. Карточка рабочая, в компе определяется, форматируется. Что ещё очень странно: если карточку достать, то ошибка та же самая. Может быть сталкивались с таким или знаете в чём может быть проблема?

    • Иногда бывает так, что с какой-то конкретной картой не работает, а с другими все отлично.

      • Спасибо за ответ. Наверное, стоит попробовать с другой картой. Но с этой всё работало в режиме общения по SPI на контроллерах STM32F105 и STM32F407.

        Ещё попробовал вот эту библиотеку как с «кубом» так и без него:
        https://github.com/yigiter/Sample-STM32F4-codes/tree/master/SDIOLib
        Не проходит команда: SD_Command(CMD8, SHRESP, 0x000001AA);
        В SDIO интерфейсе выставляется флаг: CTIMEOUT. Не хочет карточка общаться по SDIO или я что-то упускаю из вида.

        • Заработало. Как это часто бывает — дело было в хреновых контактах. В данном случае держатель у microSD подкачал.

  31. В ходе работы с FatFS столкнулся с следующим нюансом. Проект, описанные в данной статье, работает только со внешним источником тактирования, со внутреннем — нет. Почему- не знаю, но главное, что работает.
    Думаю, озвученное будет полезно)

  32. День добрый, уважаемые знатоки. Задача в том, чтобы на компе отобразилась флешка. В качестве проца stm32f103. Выбрал в CubeMX режим Mass Storage Class. Разрешил FATFS. Просто собрал, зашил и на ПК определился носитель. Но какая файловая система у него ПК не понимает и зайти на носитель не дает. Где и как в проекте объяснить, что я хочу FATFS применить именно для USB. Файлов чертова прорва, куда чего прописывать? Заранее спасибо!

  33. В чем разница между 0:/1.txt и 0://1.txt ?
    Так и так работает. Но как правильнее?

  34. Это снова я. Может ли память, которую необходимо отформатировать, быть меньше, чем размер кластера? Скажите, люди добрые

  35. Снова здравствуйте. Хочу выяснить такой момент. С компа форматирование STMки получается в режиме Очистка оглавления. Просто форматирование не прокатывает. Каждый раз при подключении устройства форматировать не удобно, так что попытался это сделать средствами STMки, функцией f_mkfs. Не работает. Подскажите, почему не работает. Заранее спасибо!

  36. Добрый день. Вопрос по использованию ф-ции f_mkfs.
    Если форматировать под windows, запись и чтение проходит успешно. Если запускать в своей программе f_mkfs ( f_mkfs((TCHAR const*)SDPath, 0, 0) ), программа проходит без ошибок, но карта после подключения к компьютеру требует форматирования. В чем может быть дело? Понижение частоты тактирования ничего не изменило

    • Добрый день, довольно-таки странная ситуация — обычно бывает наоборот: форматирование через Windows дает сбои, а через mkfs — нет… Возможно стоит с аргументами функции f_mkfs поиграться.

  37. Вопрос: как дозаписать уже существующий файл?
    Есть в библиотеке FATFS какой — либо указатель как на «высоком» уровне?

    Спасибо.

    • Добрый день!
      По такому же механизму можно дозаписать — открываем файл и пишем в него данные. Только при открытии нужно другие флаги указать.

  38. Доброго времени суток. Вырисовалась такая проблема есть два исходника одной программы, разных дат создания и различающихся по общему функционалу. В более ранней версии FatFs работает как часы, а в последней версии ПО при попытке запустить функцию f_open ПО уходит в HardFault_Handler. По отладке это происходит сразу после строки в f_open:
    if (!fp) return FR_INVALID_OBJECT;
    Файлы библиотек идентичные, настройки одинаковые, Stack и Heap увеличивал. Помогите разобраться что за кутерьма?

    • Добрый день!
      Имею похожие проблемы. Подскажите что не так. Все делал по Вашему примеру и все в принципе заработало. Но вот как только я в проект добавил обработку внешнего АЦП + запустил динамическую LED индикацию + клавиатура … . начались сбой. Притом сбои крайне не регулярные. Последовательность примерно такая: монтируем диск, открываем файл для чтения, читаем, закрываем, открываем для записи, пишем, закрываем. Отчет о результате каждого действия вывожу на индикатор. Каждый раз ошибка в новом месте, то не монтируется то не закрывается, то не пишется …. . Но бывает что все проходит как нужно. Думал аппаратная проблема, но фиг. на этом же устройстве, со всей требухой (внешний ацп, индикатор ..) запустил USB MSD + SDIO, опять же по примеру автора статей. Все работает четко как часы. Подскажите пожалуйста куда копать?
      Процессор STM32F103RCT6, использую Cube в паре с Keil uVision 5.

      • Добрый вечер!
        А все работает без сбоев, если аналогично запускать, но без дополнительной периферии? То есть такие же операции с файлами, но без АЦП и т. д. По идее не должны влиять другие модули, ведь в FatFs прерывания не используются даже.

        • Добрый день! Спасибо что ответили. Проигрался я вчера еще полдня с проектом и в принципе практически все заработало. За исключением того что функция f_mkdir() не хочет создавать папку на диске. Основная проблема оказалась в слишком высокой скорости тактирования. После установки делителя = 40 в принципе все начало работать. Хотя и не так хорошо ка хотелось бы. А с функцией f_mkdir() вообще ничего не понятно. Я ведь не создаю проект с нуля, а фактически перебрасываю часть из готового под AVR. Там я использовал ту же самую FatFs. Все работало отлично. Данные регистрируются четко без потерь, просто надо было добавить возможность считывания результатов регистрации через USB, вот и решил сделать на STM а тут такие непонятки. Пока что для STM я делаю всего второй проект и у меня как и у некоторых других складывается впечатление что Keil на совсем правильно работает с памятью МК. Как Вы думаете имеет ли смысл перебросить проект из Keil в IAR? Может ли это реально помочь?

          • Добрый день!
            А в каком смысле не правильно работает с памятью? При прошивке или при сборке проекта?
            f_mkdir возвращает код ошибки?

          • Явных ошибок не выдает, но складывается впечатление что если в нескольких программных модулях резервируются массивы памяти то они могут частично накладываться. Т.е. возникают ошибки при сборке проекта. Ф-ия f_mkdir() выдает ошибку FR_DISK_ERR, Но если на флешке предварительно создать (на ПК) нужные папки то в них вполне успешно создаются, пишутся и читаются файлы без ошибок. Heap и Stack увеличил, поставил аж по 0x800.

          • Продолжил я играться со значением «SDIOCLK clock divide factor» и вот до чего доигрался:
            1. Если поставить менее 40 то не работает вообще.
            2. Если выставить 40 — 45 начинает более менее работать но периодически глючит в частности f_mkdir() не работает.
            3. Если выставить в >= 100 работает четко и стабильно НО USB MSD работать отказывается — долго определяет карту и пишет что диск не форматирован.
            4. И наконец если выставить 50 — 60 работает нормально и FatFs и USB MSD. Только приходиться ждать лишних 10 с при подключении устройства к ПК.
            В варианте 4 то понятно почему дольше, но вот почему в 3. вообще не работает не понятно?
            Уж и не знаю почему так, то ли все потому что у меня карта памяти «тормознутая» или же проблема с моим макетом на котором я работаю — плохая разводка. Но вот такой результат. А Keil все равно глючноватый как мне кажется.

          • Я Keil’ом не пользуюсь сам, не могу сказать, какие там есть проблемы =) Можно попробовать с настройками оптимизации поэкспериментировать как вариант.
            По поводу пункта 3 — возможно, карта слишком долго отвечает, USB отправляет запрос, а карта еще пережевывает предыдущий, и поэтому USB не работает.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *