скрытое меню

Нюансы использования HAL

Стандартно генерируем в Кубе проект под 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 нашу флэшку, потому-что размер у нее маленький:

фотка 1

Файлы для скачивания

* STM32F205VGT6_MSD_AT45_FATFS [zip]
сделано под Atiollic True Studio