STM Урок 36. USB. Host Mass Storage Class. Часть 1

 

 

 

Урок 36

Часть 1

 

USB. Host Mass Storage Class

 

 

Проект создаём из проекта I2CLCD80. Назовем его USB_HOST_MSC_FATFS. Запустим проект в Cube, включим USB_OTG_FS в режим Host_Only включим там Activate_VBUS.

 

image03

 

В USB_DEVICE в разделе Class For FS IP выберем пункт Mass Storage Host Class

 

image05

 

Лапки портов PD4-PD7, PB8, PB9 отключим, это пережиток прошлых занятий

 

image04

 

В разделе FATFS включим USB Disk

 

image07

 

Лапку PC0 включим на выход

 

image06

 

Включим на выход ещё лапки портов отвечающие за красный и зеленый светодиоды

 

image01

 

В Clock Configuration выберем следующие делители (нажмите на картинку для увеличения изображения)

 

image00_0500

 

В Configuration прерывания там выставились сами.

Единственное можно включить поддержку кластеров до 4 кб

 

image02

 

Сгенерируем и запустим проект, подключим lcd.c и настроим программатор на автоперезагрузку.

Соберем проект.

В main уберем весь пользовательский код кроме инициализации и очистки дисплея

 

  /* USER CODE BEGIN 2 */

        LCD_ini();

        LCD_Clear();

  /* USER CODE END 2 */

 

В файле usb_host.c подключим файл для файловой системы

 

/* USER CODE BEGIN 0 */

#include "ff_gen_drv.h"

/* USER CODE END 0 */

 

 

Также в этом файле кое-что заменим в функции USBH_UserProcess

 

static void USBH_UserProcess  (USBH_HandleTypeDef *phost, uint8_t id)

{

 

  /* USER CODE BEGIN 2 */

  switch(id)

  {

  case HOST_USER_SELECT_CONFIGURATION:

  break;

   

  case HOST_USER_DISCONNECTION:

Appli_state = APPLICATION_DISCONNECT;

Appli_state = APPLICATION_IDLE;

        f_mount(NULL, (TCHAR const*)"", 0);  

 break;

   

  case HOST_USER_CLASS_ACTIVE:

  Appli_state = APPLICATION_START;

  break;

 

  case HOST_USER_CONNECTION:

 // Appli_state = APPLICATION_START;

  break;

 

  default:

  break;

  }

  /* USER CODE END 2 */

}

 

В файле main.c объявим некоторые переменные

 

/* USER CODE BEGIN PV */

/* Private variables ———————————————————*/

extern ApplicationTypeDef Appli_state;

FATFS USBDISKFatFs;           /* File system object for USB disk logical drive */

FIL MyFile;                   /* File object */

extern USBH_HandleTypeDef hUsbHostFS;

/* USER CODE END PV */

 

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

 

/* USER CODE BEGIN 0 */

void FileReadWrite(void)

{

  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET);

}

/* USER CODE END 0 */

Добавим код в бесконечный цикл

    MX_USB_HOST_Process();

  /* USER CODE BEGIN 3 */

    if(Appli_state==APPLICATION_START)

                {

                        FileReadWrite();

      Appli_state = APPLICATION_IDLE;

                }

                else if(Appli_state==APPLICATION_IDLE)

                {

                }

  }

  /* USER CODE END 3 */

 

Подключим флеш-диск к компьютеру, создадим на нем текстовый файл «123.txt» с каким-нибудь содержимым, извлечем его из компьютера.

Подключим контроллер, флеш-диск к нему через кабель OTG.

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

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

 

  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET); // здесь видим, что мы сюда попали

  FRESULT res;                                          /* FatFs function common result code */

  uint32_t byteswritten, bytesread;                     /* File write/read counts */

  uint8_t rtext[100];                                   /* File read buffer */

Вызовем функцию подключения нашего флеш-диска. Результат также смотрим с помощью светодиодов

uint8_t rtext[100];  /* File read buffer */

if(f_mount(&USBDISKFatFs, (TCHAR const*)USBH_Path, 0) != FR_OK)

{

   /* FatFs Initialization Error */

                HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_RESET);

                HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET); //красный цвет — сигнал ошибки

                

    Error_Handler();

 }

else

{

        HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET);

        HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET); // здесь видим, что мы сюда попали

}

 

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

 

  if(f_mount(&USBDISKFatFs, (TCHAR const*)USBH_Path, 0) != FR_OK)

  {

    /* FatFs Initialization Error */

    Error_Handler();

  }

        else

        {

                if(f_open(&MyFile, "123.txt", FA_READ) != FR_OK)

                {

                        HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_RESET);

                        HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET); //красный цвет — сигнал ошибки

                        Error_Handler();

                }

                else

                {

                        HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET);

                        HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET); // здесь видим, что мы сюда попали

                }

        }

 

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

 

                if(f_open(&MyFile, "123.txt", FA_READ) != FR_OK)

                {

                        Error_Handler();

                }

                else

                {

                        res = f_read(&MyFile, rtext, sizeof(rtext), (void *)&bytesread);

                        if((bytesread == 0) || (res != FR_OK))

                        {

                                Error_Handler();

                        }

                        else

                        {

                                LCD_Clear();

                                LCD_SetPos(0,0);

                                LCD_String((char*)rtext);

                                f_close(&MyFile);

                        }

                }

 

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

 

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

 

 

Купить отладочную плату можно здесь STM32F4-DISCOVERY

 

 

Смотреть ВИДЕОУРОК

 

STM32 USB. Host Mass Storage Class

Один комментарий на “STM Урок 36. USB. Host Mass Storage Class. Часть 1
  1. Евгений:

    Чем обусловлено изменение кода USBH_UserProcess?

    Здесь:

    case HOST_USER_DISCONNECTION:

      Appli_state = APPLICATION_DISCONNECT;

      Appli_state = APPLICATION_IDLE;

            f_mount(NULL, (TCHAR const*)"", 0);  

       break;

    и здесь (в тексте статье удаленный элемент отсутствует):

    case HOST_USER_CLASS_ACTIVE:

      Appli_state = APPLICATION_READY;

      Appli_state = APPLICATION_START;

      break;

    Следующее: "Лапку PC0 включим на выход". Зачем включали, если нигде не используем возможность отключения питания на устроймтво?

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

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

*