Стандартно генерируем в Кубе проект под STM32F205VGT6 без FreeRTOS.
USBD у нас FullSpeed.
Нюансы
Никаких прерываний для работы по SPI
Для работы с памятью AT45DB512E (а это и будет наша флэш) будем использотвать только функции HAL_SPI_Receive | HAL_SPI_TransmitReceive | HAL_SPI_Transmit (никаких прерываний). Т.к. так все операции чтения/стирания/завписи SPI ATЕ45 будут сами вызываться из USB прерывания!
Никаких HAL_Delay()
В прерывании по USB они будут подвешивать систему.
Так работает USB Device с HAL.
Error_Handler несколько раз при инициализации USBD
Во-первых сначала проект на заработал почему-то : USB не определялся на ПК от слова вообще.
Вот здесь в функции void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd):
условие hpcd->Init.speed == PCD_SPEED_FULL не срабатывало (hpcd->Init.speed было 3) и выполнение программы уходило в Error_Handler().
Как все решилось:
Из непонятого : просто начал добавлять printf во всех USB функциях (где-то файлы изменил, перекомпилировался) и вдруг все заработало как надо. Почему?
На самом деле примерно такое поведение :
USBD_LL_Init
HAL_PCD_Init
HAL_PCD_MspInit
USB_CoreInit
HAL_PCD_ResetCallback
HAL_PCD_ResetCallback speed Unknown?
Error_Handler
USBD_LL_SetSpeed
USBD_LL_Reset
MX_USB_DEVICE_Init OK
main
HAL_PCD_ResetCallback
HAL_PCD_ResetCallback speed Unknown?
Error_Handler
USBD_LL_SetSpeed
USBD_LL_Reset
HAL_PCD_ResetCallback
HAL_PCD_ResetCallback speed Unknown?
Error_Handler
USBD_LL_SetSpeed
USBD_LL_Reset
Похоже USBD_LL_Reset делается несколько раз пока где-то что-то не защелкнится.
Да и результате Windows форматирует в FAT12 нашу флэшку, потому-что размер у нее маленький:

Файлы для скачивания
*
сделано под Atiollic True Studio