STM Урок 141. USB HS Host MSC Standalone. Часть 2



В предыдущей части урока мы настроили проект и создали функцию обработки состояний программы.

Добавим ещё один глобальный массив для отправки строк в USART для последующего отображения их в терминальной программе в ПК

 

 

В функции App_File_Operations добавим строковый массив для хранения имени файла

 

 

Скопируем имя файла в строковый массив, добавив префикс раздела

 

 

Попытаемся открыть файл. В случае неудачи выведем соответствующее сообщение в терминальную программу, в случаи удачи — другое сообщение, а затем закроем файл

 

 

Соберём код, прошьём контроллер и посмотрим результат в терминальной программе, соответственно, заблаговременно её запустив и соединив с соответствующим портом.

Если всё пройдёт нормально, то получим следующий результат

 

Добавим глобальную переменную для результата выполнения файловых операций (глобальная надёжнее)

 

 

Также добавим инициализированный глобальный текстовый массив

 

 

Вернёмся в функцию App_File_Operations и добавим пару локальных переменных

 

 

Попробуем что-нибудь записать в открытый файл и также, в случае неудачи выведем соответствующее сообщение в терминальную программу, в случаи удачи — другое сообщение

 

 

Соберём код, прошьём контроллер и посмотрим сначала результат в терминальной программе

 

Затем извлечём из разъёма кабеля FLASH-накопитель и поместим его в USB-порт ПК. Наш файл на месте

 

Откроем файл и убедимся, что содержимое файла также соответствует заданному в программе

 

 

Отлично!

Теперь попробуем программными средствами прочитать содержимое файла.

Сначала откроем файл для чтения, сначала заново скопировав имя файла в локальный массив, иначе путь почему-то теряется. Также не забываем перед открытием закрыть файл

 

 

 

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

 

 

Вернёмся в функцию App_File_Operations и попытаемся прочитать содержимое нашего файла

 

 

Соберём код, прошьём контроллер и посмотрим результат в терминальной программе

 

 

Отлично! Теперь попробуем поработать с длинными именами, а также с длинными файлами (по содержимому).

Для этого скопируем на наш FLASH-накопитель ещё два файла — один с коротким именем, но с большим содержимым, а другой — также с большим содержимым, но ещё и с длинным именем

 

 

Вернёмся в наш код и закомментируем пока работу с файлом USBHost.txt

 

/*

//read and write

if (f_open(&MyFile, (const TCHAR*)fnm, FA_CREATE_ALWAYS | FA_WRITE) != FR_OK)

...

f_close(&MyFile);

}

*/

 

Объявим несколько глобальных неоптимизируемых переменных

 

 

Выше функции App_File_Operations добавим ещё одну функцию для чтения файлов с длинным содержимым

 

 

В функции App_File_Operations попытаемся открыть файл с длинным содержимым, но с коротким именем

 

 

Соберём код, прошьём контроллер и посмотрим результат в терминальной программе

 

 

Файл полностью считался.

 

 

Теперь попробуем аналогично прочитать файл с длинным именем.

Сначала закомментируем код чтения предыдущего файла

 

/*

//read long file

...

    f_close(&MyFile);

  }

*/

 

Теперь считаем содержимое файла

 

 

Как мы видим, благодаря определённым изменениям в обновлённой библиотеке FATFS нам теперь не нужно проводить дополнительные мероприятия по организации дополнительного буфера для чтения файлов с длинными именами.

Соберём код, прошьём контроллер и посмотрим результат в терминальной программе

 

 

Файл также полностью прочитан.

Теперь аналогично закомментируем участок кода, связанный с чтением данного файла.

Отключим FLASH-накопитель, подключим его к ПК и скопируем на него ещё несколько файлов и папок с файлами (также и с длинными именами, но не с кириллицей в именах и расширениях, так как кириллица — это вообще отдельная и нелёгкая тема)

 

 

Вернёмся в код и добавим в функцию App_File_Operations несколько локальных переменных

 

 

В самом низу тела функции попробуем вывести некоторую полезную информацию о нашем FLASH-накопителе, в том числе и его файловую структуру (только корневую)

 

 

Соберём код, прошьём контроллер и посмотрим результат в терминальной программе

 

 

Вся самая важная информация о файловой системе на нашем накопителе, а также и его корневая файловая структура видна. Можно, конечно также вывести информацию о содержимом каждой папки, и подпапки, но это мы оставим на будущее.

Если вы заметили, мы обеспечили ещё то, что при извлечении нашего накопителя файловая система будет отмонтирована, а при помещении накопителя в гнездо USB OTG-кабеля будет примонтирована. И не только примонтирована, а ещё и то, что мы обеспечили при этом старт нашего приложения.

Давайте это проверим.

Извлечём наш накопитель и увидим, что на дисплее слово Start превратилось в Stop

 

 

В терминальной программе мы также увидим отчёт об извлечении накопителя

 

 

Повторно вставим FLASH-Drive в гнездо и увидим, что надпись на дисплее опять превратилась в Start

 

 

Заглянем в окно терминальной программы. Наш процесс отработал, вся информация о накопителе выведена

 

 

Таким образом, мы можем извлечь один накопитель и вставить на его место другой и получить информацию уже с него, причём не только получить информацию, а полноправно с ним работать и на запись и на чтение. Только, самое главное, мы не должны забывать о том, что извлекать накопитель мы должны только тогда, когда все файлы и каталоги на нём будут закрыты. В нашем приложении это обеспечено.

Итак, в данном занятии мы научились пользоваться аппаратной поддержкой шины USB HS, а именно классом USB HOST MSC, а также закрепили на практике данные знания при работе с реальным USB FLASH-накопителем с использованием библиотеки FATFS.

Всем спасибо за внимание!

 

 

Предыдущая часть Программирование МК STM32 Следующий урок

Исходный код

 

 

Отладочную плату можно приобрести здесь 32F746G-DISCOVERY

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

STM USB HS Host MSC Standalone

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

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

*