Эта библиотека предназначена для работы с SD-картой с файловой системой FAT через SDIO интерфейс с использованием DMA под управлением микроконтроллера STM32f4.
Примечание: существует библиотека для USB флешки с файловой системой FATFS (урок №32) и комбинированная USB+SD библиотека (урок №87).
Для создания данной библиотеки (FATFS) был использована библиотека с открытым исходным кодом от STM для работы с функциями SDIO.
Библиотека FATFS имеет очень хорошую англоязычную документацию, в которой описаны все необходимые функции и параметры.
Далее в статье будут описано несколько основных функций, позволяющих смонтировать флешку, открыть файл, прочитать или записать строку в него.
Скорость чтения блока составляет 2.4Мбайт/с в буфер 512 байт, скорость записи на карточку — 500 кбайт/с.
Начиная с библиотеки версии 1.4 можно переключать с 4х битного на одно-битный режим управления в файле «stm32_ub_sdcard.h» режиме SDIO. Если контакт контроля не используется, его можно отключить там же.
ПРИМЕЧАНИЕ: Torsten S. с форума по микроконтроллерам указал ошибку, которая имеет функция FATFS «f_write» (и, предположительно, «f_read»). Если в эту функция передается файл больше 512 байт, происходит ошибка, и файл неправильно читается/пишется. Функции автора “WriteBlock/ReadBlock” позволяют использовать файлы больше 512 байт, так что ошибка не возникает. Но необходимо проверить отсутствие ошибки при непосредственном использовании функции.
Возможные аппаратные ошибки:
SD-карта может неправильно работать из-за каких либо аппаратных ошибок. Вот список наиболее частых из них:
Пример работы и подключение:
Данные о карте.
Подключение карты.
Используемые выводы и DMA:
1-битный режим:
PC8 : SDIO_D0 = SD-карта DAT0
PC12 : SDIO_CK = SD-карта Clock
PD2 : SDIO_CMD = SD-карта CMD
Примечание: вывод CD SD-карты должен быть подключен к Vcc!!
4х-битный режим:
PC8 : SDIO_D0 = SD-карта DAT0
PC9 : SDIO_D1 = SD-карта DAT1
PC10 : SDIO_D2 = SD-карта DAT2
PC11 : SDIO_D3 = SD-карта DAT3/CD
PC12 : SDIO_CK = SD-карта Clock
PD2 : SDIO_CMD = SD-карта CMD
Вывод обнаружения карты:
PC0 : SD_Detect-Pin (Hi = SD-карта не вставленна)
либо DMA2_STREAM3_CHANNEL4
или DMA2_STREAM6_CHANNEL4
Требования:
Подключаемые модули CooCox-IDE: GPIO, MISC, SDIO, DMA.
Поддерживаемые библиотеки: FATFS.
Перечисления:
typedef enum {
FATFS_OK =0,
FATFS_NO_MEDIA,
FATFS_MOUNT_ERR,
FATFS_GETFREE_ERR,
FATFS_UNLINK_ERR,
FATFS_OPEN_ERR,
FATFS_CLOSE_ERR,
FATFS_PUTS_ERR,
FATFS_SEEK_ERR,
FATFS_RD_STRING_ERR,
FATFS_RD_BLOCK_ERR,
FATFS_WR_BLOCK_ERR,
FATFS_EOF,
FATFS_DISK_FULL
}FATFS_t;
typedef enum {
F_RD =0, // зачитать (лишь если файл существует)
F_WR, // записать (лишь если файл существует) и добавить данные
F_WR_NEW, // записать (создать новый файл) и добавить данные
F_WR_CLEAR // записать поверх (удалить старые данные)
}FMODE_t;
Функции:
void UB_Fatfs_Init(void); // инициализации функций FATFS
FATFS_t UB_Fatfs_CheckMedia(MEDIA_t dev); // проверка наличия карты
FATFS_t UB_Fatfs_Mount(MEDIA_t dev); // смонтировать карту
FATFS_t UB_Fatfs_UnMount(MEDIA_t dev); // отключить карту
FATFS_t UB_Fatfs_DelFile(const TCHAR* name); // удалить файл
FATFS_t UB_Fatfs_OpenFile(FIL* fp, const TCHAR* name, FMODE_t mode); // открыть файл для чтения или записи
FATFS_t UB_Fatfs_CloseFile(FIL* fp); // закрыть файл
FATFS_t UB_Fatfs_WriteString(FIL* fp, const TCHAR* text); // записать строку в открытый файл
FATFS_t UB_Fatfs_ReadString(FIL* fp, char* text, int len); // чтение строки из открытого файла
uint32_t UB_Fatfs_FileSize(FIL* fp); // чтение переменной из файла
FATFS_t UB_Fatfs_ReadBlock(FIL* fp, unsigned char* buf, uint32_t len, uint32_t* read); // побайтное чтение файла
FATFS_t UB_Fatfs_WriteBlock(FIL* fp, unsigned char* buf, uint32_t len, uint32_t* write); // побайтная запись в файл
Пример использования:
//—————————————————————
// File : main.c
// Datum : 06.04.2013
// Version : 1.1
// Autor : UB
// EMail : mc-4u(@)t-online.de
// Web : www.mikrocontroller-4u.de
// CPU : STM32F4
// IDE : CooCox CoIDE 1.7.0
// Module : CMSIS_BOOT, M4_CMSIS_CORE
// Funktion : Demo der FATFS-SDIO-Library
// Hinweis : Diese zwei Files muessen auf 8MHz stehen
// «cmsis_boot/stm32f4xx.h»
// «cmsis_boot/system_stm32f4xx.c»
//—————————————————————
#include «main.h»
#include «stm32_ub_fatfs.h»
int main(void)
{
FIL myFile; // Хэндлер файла
SystemInit(); // Инициализация настроек кварца
// инициализации функций FATFS
UB_Fatfs_Init();
// проверка наличия карты
if(UB_Fatfs_CheckMedia(MMC_0)==FATFS_OK) {
// Смонтировать карту
if(UB_Fatfs_Mount(MMC_0)==FATFS_OK) {
// записать в файл в коневом каталоге
if(UB_Fatfs_OpenFile(&myFile, «0:/UB_File.txt», F_WR_CLEAR)==FATFS_OK) {
//записать несколько строк в файл
UB_Fatfs_WriteString(&myFile,»Test der WriteString-Funktion»);
UB_Fatfs_WriteString(&myFile,»hier Zeile zwei»);
UB_Fatfs_WriteString(&myFile,»ENDE»);
// закрыть файл
UB_Fatfs_CloseFile(&myFile);
}
// отключить карту
UB_Fatfs_UnMount(MMC_0);
}
}
while(1)
{
}
}
В приложении проект CooCox отдельная библиотека для использования в других проектах. Автор оригинала статьи просит задавать вопросы на его сайте на немецком или английских языках.
Прикрепленные файлы:
- ub_stm32f4_fatfs_sdio_v104_RUS.rar (184 Кб)
- Demo_13_FATFS_SDIO_RUS.rar (473 Кб)