Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кармин Новиелло - Освоение STM32.pdf
Скачиваний:
2743
Добавлен:
23.09.2021
Размер:
47.68 Mб
Скачать

Файловая система FAT

702

disk_ioctl(): данная функция считывает и настраивает некоторые специфиче-

ские параметры устройства, такие как размер секторов, состояние питания устройства и т. д.

get_fattime(): возвращает текущее время, таким образом файлы могут иметь кор-

ректную временную отметку. Если микроконтроллер не предоставляет модуль RTC, то данная функция может возвращать 0.

Кроме того, последние три процедуры необходимы только в том случае, если библиотека FatFs скомпилирована с опцией _FS_READONLY == 0. То есть, мы можем избежать необходимости предоставления реализации этих функций, если будем использовать режим FatFs только для чтения.

25.1.1.Использование CubeMX для включения в ваши проекты библиотеки FatFs

Как было сказано ранее, библиотека FatFs является компонентом фреймворка CubeHAL, и CubeMX поддерживает его. Однако то, как CubeMX управляет этой библиотекой, не совсем логично, по крайней мере для новичков.

Рисунок 2: Что CubeMX показывает для микроконтроллеров STM32, не имеющих совместимого адаптера

Многие из вас заметят, что CubeMX показывает только один вариант генерации в библиотеке промежуточного программного обеспечения FatFs, как показано на рисунке 2. Для большинства микроконтроллеров STM32 появляется непонятный пункт User-de- fined. Но что именно это означает? Это просто означает, что используемый вами микроконтроллер STM32 не предоставляет периферийных устройств, совместимых с адаптерами, разработанными инженерами ST (SRAM/SDRAM, USB или SDIO), и вам нужно будет предоставить собственную реализацию низкоуровневых драйверов ввода-вывода.

Рисунок 3: Что CubeMX показывает для микроконтроллера STM32F746VG

На рисунке 3, напротив, показаны варианты, доступные при использовании микроконтроллера STM32F746VG, который предоставляет интерфейс SDIO4, контроллер FMC и интерфейс устройства USB. Однако, как видите, на рисунке 3 варианты генерации отображаются серым цветом. Это потому, что нам нужно сначала включить соответствующее периферийное устройство, а затем выбрать требуемую конфигурацию FatFs. Например,

4 В микроконтроллерах STM32F7 периферийное устройство SDIO называется SDMMC.

HAL_SD

Файловая система FAT

703

предположим, что мы работаем с микроконтроллером STM32F401RE, который предоставляет периферийное устройство SDIO. Сначала нам нужно включить необходимый режим SDIO (1-битный, 4-битный и т. д.) в представлении IP Tree, а затем выбрать соответствующий вариант FatFs.

Сгенерированный проект имеет структуру, аналогичную показанной на рисунке 4.

Папка Middlewares/Third_Party/FatFs/src содержит библиотеку FatFs, а папка Middlewares/Third_Party/FatFs/src/drivers содержит процедуры ввода-вывода для работы с SD-картами через специализированный интерфейс (SDIO). Эти процедуры абстрагируются от конкретных конфигураций платы и опираются на API-интерфейсы, реализованные в файле src/bsp_driver_sd.c. Процедуры, содержащиеся в этом файле, в свою очередь, используют функции CubeHAL (из модуля для SDIO).

Рисунок 4: Структура сгенерированного проекта с библиотекой FatFs промежуточного ПО

Если вместо этого вы генерируете проект, выбирая вариант User-defined, вы найдете

файл src/user_diskio.c, который содержит функции USER_initialize(), USER_status(),

USER_read(), USER_write() и USER_ioctl(). Данные процедуры являются пустыми шаблонами, и они должны быть заполнены кодом для управления вашим конкретным устройством памяти.

И наконец, учтите, что инструмент CubeMXImporter умеет автоматически импортировать проекты, созданные с библиотекой FatFs промежуточного ПО.

25.1.1.1.API-интерфейс Generic Disk Interface

Инженеры ST разработали еще один уровень абстракции между библиотекой FatFs и низкоуровневыми драйверами устройств. Он называется уровнем Generic Disk Interface и, по существу, представляет собой уровень абстракции, который позволяет обрабатывать несколько дисковых приводов в одном приложении. Он напоминает виртуальную файловую систему (Virtual Filesystem) в операционной системе Linux.

Каждый драйвер устройства на этом уровне соответствует экземпляру следующей структуры Си:

Файловая система FAT

704

typedef struct {

 

DSTATUS (*disk_initialize)

(BYTE);

DSTATUS (*disk_status)

(BYTE);

DRESULT (*disk_read)

(BYTE, BYTE*, DWORD, UINT);

#if _USE_WRITE == 1

 

DRESULT (*disk_write)

(BYTE, const BYTE*, DWORD, UINT);

#endif /* _USE_WRITE == 1 */

 

#if _USE_IOCTL == 1

 

DRESULT (*disk_ioctl)

(BYTE, BYTE, void*);

#endif /* _USE_IOCTL == 1 */

 

} Diskio_drvTypeDef;

 

Это не что иное, как структура Си, содержащая пять указателей на функции, которые отвечают за реализацию тех процедур, которые необходимы FatFs для управления доступом к конкретному устройству памяти. Функция:

uint8_t FATFS_LinkDriver(Diskio_drvTypeDef *drv, char *path);

отвечает за связывание экземпляра этой структуры с заданным путем монтирования (например, путь “0:/” для адресации тома 0).

Благодаря этому небольшому улучшению, сделанному ребятами из ST, мы можем использовать разные файловые системы, используя при этом разные устройства (например, файловую систему USB-диска в сочетании с другой файловой системой, хранящейся на SD-карте).

25.1.1.2.Реализация драйвера доступа к SD-картам по SPI

SD-карты памяти – это больше, чем просто Flash-память. Они также включают в себя отдельный процессор, который реализует всю логику для обмена данными через интерфейс SD (отвечающий нескольким протоколам обмена данными) и для надлежащего управления доступом к конкретному типу Flash-памяти (NOR, NAND и т. д.). Более того, на всех SD-картах реализованы методы выравнивания степени износа для продления срока службы стираемой Flash-памяти.

Отличительной особенностью SD-карт является способность отвечать на команды и сообщения, передаваемые по шине SPI5. Это позволяет использовать их вместе с недорогими микроконтроллерами (для этой операции подходят даже 8-разрядные), чем и объясняется их популярность во встраиваемых приложениях. Я не буду здесь описывать протокол SPI, поддерживаемый SD-картами. Чан предоставляет6 достаточно информации для ознакомления с этим предметом. Повторять его здесь бесполезно и контрпродуктивно. Чан также предоставляет несколько примеров проектов, которые показывают, как подключить SD-карту через интерфейс SPI.

В следующей главе будет показано, как использовать SD-карты в режиме SPI для обслуживания веб-страниц, хранящихся на SD-картах, во встроенном веб-приложении.

5Однако реализация этой функциональности не является обязательной для производителей SD-карт. На рынке существует несколько SD-карт, которые не реализуют спецификацию SPI или, по крайней мере, не реализуют ее буквально.

6http://elm-chan.org/docs/mmc/mmc_e.html