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

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

#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("Ошибка монтирования диска %drn", 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. Проверял на МК STM32F103RB
Источник

Оставить комментарий

Вы можете использовать следующие теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>