Есть плата NUCLEO-H743ZI. Пытаюсь запустить на ней USB (хост для флэшки, MSD в терминах ST) на данном чипе. За неимением никаких других примеров в качестве основы взял ST-шный куб.
USB - FS, тот, который разведен на плате (пины проца PA11, PA12).
Добавил куда надо управление питанием разъёма, светодиодик на плате засветился (также как и лампочка на флэшке).
Дальше глухо - проц видит, что что-то подключено (срабатывает юзерский хук), но флэшка не проходит энумерацию (бесконечно крутится в тщетных попытках получения дескрипторов).
Пробовал 2 примера - сгенеренный кубом и готовый FatFs_USBDisk_Standalone для платы STM32H743I-EVAL (естественно подчистив его от особенностей этой платы - ключ питания там управляется не напрямую пинами проца, а через I2C расширитель портов).
Результат примерно одинаковый - висяк на дескрипторах.
Проверял 2 флэшки, которые с полпинка запускаются на F439 и F105 процах. Но там работает старое USB ядро времён SPL. Для H7 этого драйвера просто нет.
Кубовый драйвер на F1/F4 я никогда не пробовал (не было нужды, и без него всё в шоколаде), равно как и не пробовал запускать старый Fx драйвер на H7. Даже не знаю, совместимы ли они.
Стек везде ставил 10 кил. FreeRTOS (и прочих аналогов) нет.
После нескольких дней ковыряний выяснилось следующее:
1. Стек, по крайней мере, на первый взгляд ни при чём - детали ниже (п. 3).
2. Плата питалась от ST-Link-овского USB питания, которое у меня хз почему 4-4.1в. После прохождения всех ключей на плате на USB разъёме получалось порядка 3.7-3.8в, иногда и меньше. Маловато как-то. Подал на плату внешние 5в от компового БП, на разъёме увидел нормальные 5 вольт. Слава Богу, одной проблемой меньше.
3. Самая загадочная на текущий момент вещь. Выяснилось, что прервание USB НИКОГДА не возникает. Никогда от слова "вообще". Доказано отладчиком и точкой останова в обработчике.
Точнее сказать - после шаманского бубна и фиг знает с какого перезапуска оно начинает возникать, и тогда всё чудесным образом начинает работать.
Под "начинает работать" я подразумеваю то, что юзерский callback драйвера с именем USBH_UserProcess вызывается сколько положено раз, в том числе с аргументом равным 2, что, согласно кубового талмуда означает готовность флэшки к работе.
FatFs пока не подключал. Пока дрова не начнут работать стабильно, пихать туда FAT имхо бессмысленно.
Прерывания там включаются так (выдрано с куба и тамошних примеров):
Код:
Код
/* Peripheral clock enable */
__HAL_RCC_USB_OTG_FS_CLK_ENABLE();
/* Peripheral interrupt init */
// HAL_NVIC_SetPriority(OTG_FS_IRQn, 0, 0); // генерит куб
HAL_NVIC_SetPriority(OTG_FS_IRQn, 6, 0); // Так написано в примере к плате STM32H743I_EVAL
// HAL_NVIC_SetPriority(OTG_FS_IRQn, 1, 3); // это используется в F439
HAL_NVIC_EnableIRQ(OTG_FS_IRQn);
__HAL_RCC_USB_OTG_FS_CLK_ENABLE();
/* Peripheral interrupt init */
// HAL_NVIC_SetPriority(OTG_FS_IRQn, 0, 0); // генерит куб
HAL_NVIC_SetPriority(OTG_FS_IRQn, 6, 0); // Так написано в примере к плате STM32H743I_EVAL
// HAL_NVIC_SetPriority(OTG_FS_IRQn, 1, 3); // это используется в F439
HAL_NVIC_EnableIRQ(OTG_FS_IRQn);
Пробовал разные приоритеты - ничего оно не даёт

Битика в самом USB, отвечающего за вкл/выкл прерываний (таковые есть и в SPI, и во всяких там уартах), я вообще не нашёл ... Может плохо искал?
Могу выложить проект под атоллик, хотя там 99% ровно то, что генерит куб.
Оставшийся 1% это включение светодиодиков платы нуклео, чтобы без отладчика можно было хоть как-то понять, что там творится...
Кто-то пользовался USB хостом на H7, может я чего-то где-то не доделываю?
Или может где-то есть какие-то другие примеры? В своё время на Ф4 мне сильно помог пример немца http://mikrocontroller.bplaced.net/wordpress/ (по факту он оказался немного переработанным ST-шным примером, но всё равно), но у него нет ничего для H7.
Заранее благодарен.