STM32 и USB. Реализация USB Mass Storage Device.

Работа с картой памяти

Продолжаем микро-цикл статей (в рамках макро-цикла, посвященного работе с STM32CubeMx), в которых мы разбираемся как настраивать разные режимы работы USB в микроконтроллерах STM32 при помощи Cube 🙂 И сегодня на очереди MSD (USB Mass Storage Device), а также работа с SD-картой памяти. То есть сегодня мы реализуем свой собственный кардридер на микроконтроллере STM32F10x!

Как я уже упомянул во вступлении к статье, сегодня я буду использовать микроконтроллер семейства STM32F10x, а карта памяти будет подключаться  по интерфейсу SDIO. Собственно, давайте перейдем в Cube и начнем все поэтапно настраивать…

Первым делом задействуем внешний генератор тактовых импульсов, а также включаем USB и SDIO. Кроме того, выбираем нужный нам режим работы USB, а именно – Mass Storage Class:

Настройка USB Mass Storage Device.

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

Кроме того, у меня на плате используется так называемый USB_DISCONNECT_PIN – вывод, который отвечает за программное подключение/отключение USB. Эта обязанность возложена на PA10, поэтому я дополнительно проинициализировал эту ножку для работы в режиме выхода.

Итак, с этим все понятно, все настроено, давайте перейдем к настройкам тактирования. В очередной раз напоминаю, что этому была посвящена отдельная статья (ссылка), поэтому сейчас мы останавливаться на этом моменте не будем 🙂 Здесь стоит обратить внимание только на один момент, а именно на тактирование USB. Так вот, на модуль USB должны обязательно приходить 48 МГц, иначе работать данная периферия не будет:

Тактирование USB.

Следующим на очереди будет окно дополнительной конфигурации выбранной периферии в STM32CubeMx, но там мы почти ничего не будем менять. Изменим только предделитель частоты для тактирования модуля SDIO:

Использование карты памяти SD.

На этом в принципе и все, переходим к генерации исходного кода, а также файлов проекта. После окончания этой процедуры получаем полностью готовый и настроенный проект, но на этом наша работа не заканчивается, как и всегда, в проект надо будет внести изменения 🙂 Так что открываем IAR (именно эту среду я использую) и переходим к редактированию исходного кода.

Первым делом я сбрасываю USB_DISCONNECT_PIN в нулевое состояние для активации подключения по USB:

/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_SDIO_SD_Init();
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_RESET);
MX_USB_DEVICE_Init();

Как видите, Cube уже реализовал вызов функций инициализации интерфейсов USB и SDIO, но, вопреки ожиданиям, никакой связи этих интерфейсов в проекте нет, и ее нам нужно реализовать самим. Для этого переходим в файл usbd_storage_if.c и находим там ряд функций:

STORAGE_Init_FS,
STORAGE_GetCapacity_FS,
STORAGE_IsReady_FS,
STORAGE_IsWriteProtected_FS,
STORAGE_Read_FS,
STORAGE_Write_FS,
STORAGE_GetMaxLun_FS,
(int8_t *)STORAGE_Inquirydata_FS

Сейчас эти функции пустые и именно их нам надо отредактировать в соответствии с тем типом памяти, которую мы будем использовать. В нашем случае это внешняя SD-карта памяти. Не будем заниматься всеми перечисленными функциями, ограничимся только теми, которые обязательно надо реализовать для того, чтобы наше устройство заработало.

И первая на очереди – STORAGE_GetCapacity_FS(). В этой функции мы должны определить количество блоков памяти, а также размер одного блока. Начнем с размера блока и определим его следующим образом:

#define BLOCK_SIZE                                               512

Для того, чтобы узнать полный размер карты памяти мы можем использовать функцию HAL_SD_Get_CardInfo(). Эта функция принимает на вход два аргумента, которые уже определены в файле main.c. Поскольку мы хотим их использовать в другом файле, то добавляем:

extern SD_HandleTypeDef hsd;
extern HAL_SD_CardInfoTypedef SDCardInfo;

Итак, с размером карты памяти мы разобрались, а как же нам узнать количество блоков? А все просто – делим общий размер на размер одного блока, и в итоге получаем следующую реализацию функции:

int8_t STORAGE_GetCapacity_FS (uint8_t lun, uint32_t *block_num, uint16_t *block_size)
{
	/* USER CODE BEGIN 3 */   
	HAL_SD_Get_CardInfo(&hsd, &SDCardInfo);
	*block_num  = SDCardInfo.CardCapacity / BLOCK_SIZE;
	*block_size = BLOCK_SIZE;
	return (USBD_OK);
	/* USER CODE END 3 */ 
}

Теперь нам осталось создать самые важные функции, а именно функции чтения/записи – STORAGE_Read_FS() и STORAGE_Write_FS(). Здесь мы просто возьмем готовые функции для работы с SD картой и просто приведем аргументы к нужному нам виду:

/****************************************************************************************
* Function Name            : STORAGE_Read_FS
* Description              : 
* Input                    : None.
* Output                   : None.
* Return                   : None.
****************************************************************************************/
int8_t STORAGE_Read_FS(uint8_t lun,
                       uint8_t *buf,
                       uint32_t blk_addr,
                       uint16_t blk_len)
{
	/* USER CODE BEGIN 6 */
	HAL_SD_ReadBlocks(&hsd, (uint32_t*)buf, (uint64_t)(blk_addr * BLOCK_SIZE), BLOCK_SIZE, blk_len);
	return (USBD_OK);
	/* USER CODE END 6 */
}

/****************************************************************************************
* Function Name  : STORAGE_Write_FS
* Description    :
* Input          : None.
* Output         : None.
* Return         : None.
****************************************************************************************/
int8_t STORAGE_Write_FS(uint8_t lun,
                        uint8_t *buf,
                        uint32_t blk_addr,
                        uint16_t blk_len)
{
	/* USER CODE BEGIN 7 */
	HAL_SD_WriteBlocks(&hsd, (uint32_t*)buf, (uint64_t)(blk_addr * BLOCK_SIZE), BLOCK_SIZE, blk_len);
	return (USBD_OK);
	/* USER CODE END 7 */
}

Вот, собственно, и все!

Важное дополнение! В новых версиях HAL Driver изменены функции для работы с SD картой, поэтому необходимо изменить и функции для работы с USB:

/****************************************************************************************
* Function Name            : STORAGE_Read_FS
* Description              : 
* Input                    : None.
* Output                   : None.
* Return                   : None.
****************************************************************************************/
int8_t STORAGE_Read_FS (uint8_t lun, 
                        uint8_t *buf, 
                        uint32_t blk_addr,                       
                        uint16_t blk_len)
{
	/* USER CODE BEGIN 6 */
	HAL_SD_ReadBlocks(&hsd, buf, blk_addr, (uint32_t) blk_len, 10);
	return (USBD_OK);
	/* USER CODE END 6 */
}


/****************************************************************************************
* Function Name            : STORAGE_Write_FS
* Description              :
* Input                    : None.
* Output                   : None.
* Return                   : None.
****************************************************************************************/
int8_t STORAGE_Write_FS (uint8_t lun, 
                         uint8_t *buf, 
                         uint32_t blk_addr,
                         uint16_t blk_len)
{
	/* USER CODE BEGIN 7 */
	HAL_SD_WriteBlocks(&hsd, buf, blk_addr, (uint32_t) blk_len, 10);
	return (USBD_OK);
	/* USER CODE END 7 */
}

Здесь “10” – это величина таймаута для операций чтения/записи.

Собираем наш проект, программируем микроконтроллер, подключаем плату к ПК и видим, что в системе у нас появилось запоминающее устройство, а также определился внешний накопитель, соответствующий используемой карте памяти. Таким образом, наша задача решена и мы получили работающий кардридер 🙂

На сегодня на этом мы заканчиваем, в ближайшее время вновь вернемся к обсуждению разных режимов работы USB в STM32CubeMx, так что до скорого!

Поделиться!

Подписаться
Уведомление о
guest
81 Комментарий
старее
новее большинство голосов
Inline Feedbacks
View all comments
Elis
Elis
5 лет назад

И еще раз спасибо)

Alexey
Alexey
5 лет назад

Здравствуйте! На какой скорости осуществляется чтение/ запись? Full speed usb? И как всегда спасибо за статю!

Паша
Паша
5 лет назад

Подумал сделать кардридер на stm32

Gleb
Gleb
4 лет назад

Добрый день! Попробовал Ваш пример на stm32discoveryf4(stm32f407vg,keil), инициализацию и весь проект генерировал в stm32cube, карта 1gb transend. Не работает. Попробовал вручную задать размер карты, видит но чтение и запись не идут. Подскажите где искать проблему?

Gleb
Gleb
4 лет назад

Доброе утро! Да карта работает. HAL_SD_Get_CardInfo ничего не выдает, если прописать поля
*block_num и *block_size вручную то определяется карта указанного размера. Потом выходит сообщение что карта должна быть форматирована. Пробую форматировать, выходит сообщение форматирование не может быть завершено. Похоже что hal_sd функции записи и чтения тоже не работают.
Вот инициализация, которую мне stm32cube сгенерировал:
void MX_SDIO_SD_Init(void)
{
hsd.Instance = SDIO;
hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;
hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;
hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;
hsd.Init.BusWide = SDIO_BUS_WIDE_1B;
hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
hsd.Init.ClockDiv = 3;
HAL_SD_Init(&hsd, &SDCardInfo);

HAL_SD_WideBusOperation_Config(&hsd, SDIO_BUS_WIDE_4B);

}

Gleb
Gleb
4 лет назад

Попробовал то же самое в IAR, то же самое Видит съемный диск G, дальше пишет нет доступа к G, неверная функция.

Gleb
Gleb
4 лет назад

Огромное Вам спасибо! И за статью и за подсказки! Пойду искать другую карту.

Gleb
Gleb
4 лет назад

Добрый день! Попробовал Ваш пример на карте SanDisk 8Gb SDHC, заработало! Все дело в командах видимо. Вот хорошая статья про SD карты http://habrahabr.ru/post/213803. Спасибо за Ваши статьи, пойду пробовать FatFS! Хотелось бы статью про emWin.

RiseOfDeath
RiseOfDeath
4 лет назад

В чем измеряется SDCardInfo.CardCapacity ?

У меня для восьмигиговой карточки он равен 0x4

Сергей
Сергей
4 лет назад

В новом CubeMX уже поменяли переменные

BLOCK_SIZE на STORAGE_BLK_SIZ

, теперь все так должно быть:

int8_t STORAGE_GetCapacity_FS (uint8_t lun, uint32_t *block_num, uint16_t *block_size)
{
/* USER CODE BEGIN 3 */
HAL_SD_Get_CardInfo(&hsd, &SDCardInfo);
*block_num = SDCardInfo.CardCapacity / STORAGE_BLK_SIZ;
*block_size = STORAGE_BLK_SIZ;
return (USBD_OK);
/* USER CODE END 3 */
}

и

int8_t STORAGE_Read_FS (uint8_t lun,
uint8_t *buf,
uint32_t blk_addr,
uint16_t blk_len)
{
/* USER CODE BEGIN 6 */
HAL_SD_ReadBlocks(&hsd, (uint32_t*)buf, (uint64_t)(blk_addr * STORAGE_BLK_SIZ), STORAGE_BLK_SIZ, blk_len);
return (USBD_OK);
/* USER CODE END 6 */
}

и тогда все работает!

Паша
Паша
4 лет назад

Только вот сейчас ( на выходных ) решил собрать Card Reader и узнал что весьма ограниченное семейство Stm32 поддерживает SDIO и USB Device в одном контроллере.

Роман
Роман
4 лет назад

Добрый день!
Кто-то собирал макет? Какая получилась результирующая скорость чтения данных с карты?

Marat
Marat
4 лет назад

А зачем менять предделитель тактовой частоты для модуля SDIO?
Хотелось бы больше подробностей, зачем что-то делается..

З.Ы. За статьи спасибо огромное!

Marat
Marat
4 лет назад

У меня на плате STM32F4-Discovery скорость записи – 145 кб/с..

Все сделано как в примере, чтение и запись работают. Но скорость записи низкая, пытаюсь понять, можно ли повысить и как.

Marat
Marat
4 лет назад

Копирование с карты памяти идет очень быстро, разница с записью просто огромная.

Частоту SDIO не менял – оставил предделитель 0, как и было по умолчанию. Если не ошибаюсь, SDIO тактируется от шины APB2 – а там сейчас 84 МГц.

А что можно посмотреть в драйвере USB? И какие файлы ковырять?

Marat
Marat
Reply to  Aveal
4 лет назад

HAL_SD_WriteBlocks позволяет писать блоками по 512 байт – так написано в комментариях функции..

Marat
Marat
4 лет назад

Попробовал сделать проект для STM32F429 – изначально плата не завелась, ОС просто не видела подключения нового устройства. Дело оказалось в VBUS_SENSE, перевел в состояние Disable и ОС увидела новое устройство. Правда видит почему-то только в порту USB 3.0, в 2.0 – устройство неопознан, сбой запроса дескриптора.

Но это не все, увы – как кардридер плата не работает : после подключения к компу в Диспетчере Устройств она появляется сразу, а вот в Моем Компьютере иконка съемного диска появляется с большой задержкой и объем диска под иконкой не отображается. При попытке открыть его выдается сообщение об ошибке – Неверная функция.

Какой-то баг в функции STORAGE_GetCapacity_FS – потому как если убрать из нее реализацию, то после подключения платы сразу выскакивает сообщение ОС о том, что диск не форматирован и предлагает его отформатировать.

Roman
Roman
4 лет назад

Добрый день! на stm32f4disc код заработал сразу, только при записи возникает проблема- записанные данные не сохраняются на sd, после извлечения их нет, хотя сразу после записи файлы отображаются на карте и их можно прочитать. Не подскажете в какую сторону копать?

Roman
Roman
4 лет назад

Да, файловая система работает нормально. Похоже проблема была в частоте при инициализации, увеличил делитель на этом этапе, сейчас все в порядке. Спасибо!

Хлуденьков
Хлуденьков
4 лет назад

Собрал под кубом только для SD, без изменения тактовых частот по умолчанию. Работает, спасибо.
А запись.чтение только блочные?

Каким образом прочесть/записать файл?

Хлуденьков
Хлуденьков
4 лет назад

Добавить в кубе поддержку FatFS? Или ещё что-то?

Хлуденьков
Хлуденьков
4 лет назад

Да, спасибо. Нашёл у вас на сайте статью про фат.

Александр
Александр
4 лет назад

В новых версиях CubeMX нужно добавить строчку BSP_SD_Init(); чтобы все работало.

Aleksey
Aleksey
4 лет назад

Проект, приведенный в статье выполнил на плате STM32F439NIH 6U.
Не понимаю… FatFS к проекту не подключал, но могу спокойно через проводник Windows открыть диск и прочитать/записать файлы….

Сергей
Сергей
3 лет назад

Добрый день!
Наткнулся на вашу статью и решил попробовать. У меня, увы, вылезает ошибка “Запуск этого устройства невозможен. (Код 10)” при подключении конструкции к USB. STM32F4-DISC + CubeMX + Keil5. Такое ощущение что ошибка в самой инициализации USB, но вот где конкретно.. =\

Сергей
Сергей
Reply to  Aveal
3 лет назад

Да действительно, дело оказалось в Heap_Size. В случае использования Keil’a его нужно в ручную переправить на 0x00000800 или больше. На всякий случай скину ссылку ( https://blog.brichacek.net/wp-content/uploads/2015/10/STM32F4-and-USB.pdf ). “Кардридер” при этом опознался системой, но сам диск при этом так и недоступен для чтения. Windows предлагает форматировать диск а потом ссылается на невозможность этого. Сама по себе карточка вполне жива Trancend MicroSD HC 8gb. Я пробовал несколько вариантов функции STORAGE_GetCapacity_FS(), тот что вы в посте указывали и то что был упомянут в камментах, собственно разницы ни какой не заметил.

Сергей
Сергей
Reply to  Aveal
3 лет назад

Ещё раз спасибо за помощь, я разобрался со всем, на всякий случай для других, если они столкнутся с теми же проблемами:

1) В случае если используется Keil в файле startup_stm32f(вашмк)xx.s Heap_Size EQU 0x00000200 заменить на Heap_Size EQU 0x00000800. Таким образом избавляемся от ошибки с кодом 10 при инициализации USB.

2) В случае если используются длинные проводники напрямую припаянные к SD карте (в моём случае к адаптеру), все выводы SDIO должны быть подтянуты к питанию непосредственно возле самой карточки резисторами от 10 до 100к.

3) Если используется FATFS процедура инициализации в main выглядит следующим образом:

MX_GPIO_Init();
MX_SDIO_SD_Init();
MX_FATFS_Init();

BSP_SD_Init();

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_RESET);

MX_USB_DEVICE_Init();

И всё будет хорошо 😉

Bur
Bur
3 лет назад

Для тех у кого не получилось ни с измененнием делителя частоты карточки, ни с различным порядком инициализации, добавлении резистроров и т.д.
Использую новый хал, там где заменено BLOCK_SIZE на STORAGE_BLK_SIZ. после изменения на 512 – ничего не работает (видит неотформатированный диск), думал если гиговая SD шка то адресация по 1 байту и нужно STORAGE_BLK_SIZ = 1, но нет ни одна из карт не заводится ни 32 Гб ни 1Гб.
После вернул значение которое порекомендовал сам CubeMX, STORAGE_BLK_SIZ = 200, и любая карта начала определяться компом.
Одно смущает скорость ~500kb/s – чтение, 150kb/s – запись. Помоему это не дело, запись через ФатФС и то быстрее идет, нужно как то это решать…

Aleksey
Aleksey
Reply to  Bur
3 лет назад

Bur, вы что-то нибудь придумали по данной проблеме?

Aleksey
Aleksey
3 лет назад

Уважаемый Aveal.

Почему в примере используется #define BLOCK_SIZE 512 , а не SDCardInfo.CardBlockSize ???

Почему именно 512 ?

Aleksey
Aleksey
3 лет назад

Скорость передачи информации на SD карту обычным картридером составляет 10 МБ/сек. Контроллером, прошитым кодом как из данной статьи так и из готовых примеров от STM – 850 КБ/сек (100 MБ передал за 13 сек и 2 минуты соответственно).

Дмитрий
Дмитрий
3 лет назад

Снова здравствуйте, уважаемый Aveal. У меня опять вопрос. Данный пример демонстрирует применение режима Mass Storage Class для USB, однако данное устройство ведь без не будет корректно отображаться без FATFS. Повторю мою задачу. Нужно чтобы STMка по USB определилась как дисковый накопитель и при этом в режиме FATFS. В общем вот мои вопросы:
1) Как я понял, чтобы использовать режим Mass Storage Class для USB Device, устройству нужно объяснить, что за область памяти мы хотим для этих целей использовать (в моем случае внутренняя flash память). Для этого мы открываем файлик usbd_storage_if.c прописываем там все необходимое. Я пока адаптировал только функцию STORAGE_GetCapacity_FS и на компе все равно не стало видно, сколько памяти у моего устройства. Правильно ли я рассуждаю?
2) По идее, после того, как я объяснил USB, с какой памятью надо взяимодействовать, нужно прикрутить FATFS. Как я понял, для этих целей куб с создал файлик user_diskio.c. Что там нужно непосредственно прописать? В ваших примерах все это по отдельности есть, но для проекта из CubeMX и функций режима MSC нету. Подскажите
Заранее спасибо за ответ!

Дмитрий
Дмитрий
Reply to  Aveal
3 лет назад

Спасибо) Ваши статьи по данной тематике на этом сайте я все перечитал.
1) То есть, чтобы моя внутренняя flash память STM32 определилась на ПК как носитель, нужно файл usbd_storage_if.c отредактировать как тут, только как тут у вас?
https://microtechnics.ru/stm32-i-usb-mass-storage-device/
И все?
2) А какой тогда смысл в файловой системе тут, если ПК и так может STMку отформатировать?

Дмитрий
Дмитрий
Reply to  Aveal
3 лет назад

По поводу файловой системы. То есть файловая система мне понадобится только в том случае, если сама STM32 захочет работать с файлами, записанными на каком-то носителе? FLASH или SD карта к примеру. Так?

Дмитрий
Дмитрий
3 лет назад

Да, и вот еще в догонку
3) Как теперь подправленные в файле user_diskio.c фунции применить теперь правильно? Или все же привязано и просто вызываем f_mount и.т.д.

Илья
3 лет назад

Очень бы хотелось подобный пример, только для работы с SDRAM.

Илья
3 лет назад

А то 64Мбита пропадает, а как это реализовать в CubeMX не могу понять. Буду очень рад если подобный пример появится.

Дмитрий
Дмитрий
3 лет назад

Приветствую. Как в режиме MSC задать имя устройства, которое в моем компьютере отображается, по умолчанию?

RusikOk
RusikOk
3 лет назад

не могли бы Вы написать статью по работе с MMC картами через SPI/ очень нужно

Marat
Marat
3 лет назад

А почему адрес высчитывается следующим образом – blk_addr * BLOCK_SIZE?

teager
teager
3 лет назад

Hello 😉

You’re tutorials are great, and I want to very thank you. But in this case, i’ve got a problem, i use STM32F4Discovery and after configure everything and connect USB to PC, i got a messages from windows that “A request for the USB device descriptor failed.”

Can you help me, please 🙂

Nik
Nik
2 лет назад

Где взять проект?

peano
peano
1 год назад

У меня глючила запись пока не добавил проверку состояния карты после записи:
int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
/* USER CODE BEGIN 7 */
HAL_SD_CardStateTypeDef state;
HAL_StatusTypeDef status = HAL_SD_WriteBlocks(&hsd, buf, blk_addr, (uint32_t) blk_len, 10);
if(status != HAL_OK) return (USBD_FAIL);
do{
state = HAL_SD_GetCardState(&hsd);
} while(state == HAL_SD_CARD_PROGRAMMING);
return (USBD_OK);
/* USER CODE END 7 */
}
По хорошему состояние надо проверять и при чтении, но работает и так.
Кроме того, они поменяли структуру SDCardInfo и теперь в STORAGE_GetCapacity_FS надо делать так:
*block_num = SDCardInfo.LogBlockNbr;
Скорость записи получилась 165 кБ/с.
Скорость чтения 310 кБ/с.

peano
peano
Reply to  peano
1 год назад

Небольшое уточнение. Указанные скорости получились в 1-битном режиме. В 4-битном несколько быстрее:
Запись 175 кБ/с.
Чтение 408 кБ/с.

Lim
Lim
1 год назад

Здравствуйте! Я правильно понимаю, после того как прописаны эти функции, и USB подключен к компьютеру, он сам уже определяет устройство? А главная функция кроме инициализации ничего не делает? Объясните пожалуйста хоть примерно как это работает? Генерируется какое-то прерывание, вызывающее функции из usbd_storage_if.c ?

Lim
Lim
Reply to  Aveal
1 год назад

А не могли бы Вы выложить код главной функции?
Делаю все так как у вас, только у меня не существует структуры extern HAL_SD_CardInfoTypedef SDCardInfo; поэтому я ее просто определяю без extern. И еще у меня не FS, а HS, но функции, которые надо прописывать куб сгенерировал аналогичными.
вот моя инициализация, скажите пожалуйста, чего не хватает?
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
//MX_FSMC_Init();
//MX_TIM6_Init();
// MX_I2C1_Init();
MX_SDIO_SD_Init();
MX_FATFS_Init();
BSP_SD_Init();
MX_USB_DEVICE_Init();
//Init_Ext_Periph();

USB_ON; //включение питания usb3320
USB_RES_OFF; //usb3320 работает в нормальном режиме
while (1)
{
}
}

Lim
Lim
Reply to  Aveal
1 год назад

Именно, ничего не происходит.
Смотрю пример от ST там еще какие-то функции
пример 1
int main(void)
{
Set_System();
Set_USBClock();
Led_Config();
USB_Interrupts_Config();
USB_Init();
while (bDeviceState != CONFIGURED);
USB_Configured_LED();
while (1);
}
пример 2 из интеренета
int main(void)
{
HAL_Init();
SystemClock_Config();
USBD_Init(&USBD_Device, &MSC_Desc, 0);
USBD_RegisterClass(&USBD_Device, USBD_MSC_CLASS);
USBD_MSC_RegisterStorage(&USBD_Device, &USBD_DISK_fops);
USBD_Start(&USBD_Device);
while (1)
}
И непонятно пока что и куда. А у вас только MX_USB_DEVICE_Init();?

Lim
Lim
Reply to  Aveal
1 год назад

Судя по поведению платы функции из usbd_storage_if.c вообще не вызываются. А должны при вызове загораться светодиоды.
Плата с STM32F207 на борту, а так же разъем под SD карту(SDIO) и разъем USB с микросхемой USB3320(ULPI). На карту силами контроллера уже пишутся данные. В кубе настраиваю USB_OTG_HS Device only. И подключаю библиотеку USB DEVICE MSC for HS
подключение микросхемы usb https://www.radiokot.ru/forum/download/file.php?id=313259

Igor
Igor
1 год назад

Мучался пару часов все делал как описано в посте, но не чего не получалось переменые
*block_num = SdCard.BlockNbr;
*block_size = SdCard.BlockSize;
не получали значения пока в main не добавил инициализацию SD
HAL_SD_Init(&hsd);
после этого все отлично заработало.

Igor
Igor
1 год назад

Забыл написать автору спасибо реально помогло).

Присоединяйтесь!

Profile Profile Profile Profile Profile
Vkontakte
Twitter

Язык сайта

Июнь 2020
Пн Вт Ср Чт Пт Сб Вс
« Май    
1234567
891011121314
15161718192021
22232425262728
2930  

© 2013-2020 MicroTechnics.ru