STM32F103 и FatFS начинающим

На нелегком пути освоения МК постоянно сталкиваешься с сомнениями. Правильно ли соединил провода, не намудрил ли с инициализацией? А железо вообще исправное? Или все сразу? Слишком много переменных факторов. Конечно, подобное лишь улыбнет гуру, но новичку доставляет немало головной боли.

STM32F103 FatFS

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

Убедившись на Ардуине что все исправно, сперва взял за основу проект сообщника MikeSmith, который в свою очередь использовал исходники Martin THOMAS. Но Мартин что-то перемудрил и его код имеет свойство впадать в бесконечные циклы. Да и вообще привередлив к разным флешкам.

Дальнейшие поиски привели к коду Domen Puncer. Этот код пришлось слегка адаптировать на предмет дефайнов (очень не люблю хардкод, да и лень было провода переключать на другой порт), но в целом работает веселее. Одинаково хорошо справился с флэшками 16Mb и 16Gb. Не захотел только читать MMC 16Mb, ну да кому они нужны ))

Физические соединения.

Card Shield — STM32
CS — PB12
MOSI — PB15
SCK — PB13
MISO — PB14
+5V — +5V
GND — GND

STM32F103 FatFS 2

Тестовый код не делает ничего сверхестественного и должен быть понятен из комментариев.

#include "stm32f10x_conf.h"
#include "ff.h"

char    buff[1024];             // буфер для чтения/записи

int main(void)
{
        FRESULT result;

        // смонтировать диск
        FATFS FATFS_Obj;

        result = f_mount(&FATFS_Obj, "0", 1);
        if (result != FR_OK)
        {
                //printf("Ошибка монтирования диска %d\r\n", result);
        }


        // считаем файлы в корневом каталоге
        DIR dir;
        FILINFO fileInfo;
        int nFiles = 0;

        result = f_opendir(&dir, "/");
        if (result == FR_OK)
        {
                while (((result = f_readdir(&dir, &fileInfo)) == FR_OK) && fileInfo.fname[0])
                {
                        nFiles++;
                }
        }
        f_closedir(&dir);


        // открываем файл readme.txt для чтения
        FIL file;
        UINT nRead, nWritten;

        result = f_open(&file, "readme.txt", FA_OPEN_EXISTING | FA_READ);
        if (result == FR_OK)
        {
                f_read(&file, &buff, 1024, &nRead);
                f_close(&file);
        }

        // создаем файл write.txt
        result = f_open(&file, "write.txt", FA_CREATE_ALWAYS | FA_WRITE);
        if (result == FR_OK)
        {
                f_write(&file, &buff, nRead, &nWritten);
                f_close(&file);
        }
}

Проект для CooCox sd-test. Проверял на МК STM32F103RB.

источник: we.easyelectronics.ru

  • Shift Line Stompbox

    Спасибо огромное, отличный проект!
    Есть нюанс, SDHC карты читает только раз после пересброса. Т.е. вынул, её же вставил, смонтировал, а всё — не читается. Пришлось подлечивать.
    У автора SPI слоя иниализатор диска если железо (SPI) уже инициализировано — выходит из подпрограммы. А в инициализаторе и настройка SPI и чтение регистров статусов SD. Если статусы эти не считатывать каждую смену карточки, то SDHC карта шлет куда подальше.