Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32H743 (NUCLEO) USB FS
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
hd44780
Привет всем.

Есть плата 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);

Пробовал разные приоритеты - ничего оно не даёт sad.gif


Битика в самом USB, отвечающего за вкл/выкл прерываний (таковые есть и в SPI, и во всяких там уартах), я вообще не нашёл ... Может плохо искал?
Могу выложить проект под атоллик, хотя там 99% ровно то, что генерит куб.
Оставшийся 1% это включение светодиодиков платы нуклео, чтобы без отладчика можно было хоть как-то понять, что там творится...

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

Заранее благодарен.
Genadi Zawidowski
Чтобы не углубляться - по простому отключите кэш в процессоре и DMA в USB.
А питание USB включаете? PWR_CR3_USB33DEN - HAL_PWREx_EnableUSBVoltageDetector

Прикол в том, что в старых версиях не вставлялось в код, а соотвтствующий бит включается в DFU LOADER и до выклчения питания стоит (reset не сбрасывает).
hd44780
Цитата(Genadi Zawidowski @ Aug 25 2018, 17:30) *
Чтобы не углубляться - по простому отключите кэш в процессоре и DMA в USB.
А питание USB включаете? PWR_CR3_USB33DEN - HAL_PWREx_EnableUSBVoltageDetector

Прикол в том, что в старых версиях не вставлялось в код, а соотвтствующий бит включается в DFU LOADER и до выклчения питания стоит (reset не сбрасывает).


Кэш пока вообще не включал, DMA там вроде нет.
А вот SET_BIT(PWR->CR3, PWR_CR3_USB33DEN); (то самый HAL_PWREx_EnableUSBVoltageDetector) действительно помог, спасибо. Шарманка сразу ожила, спасибо вам большое.
Я добавил его туда же, где пины USB и прерывание USB инитятся.

Пойду USB прикручивать, там в кубе чего-то нахимичено ... Надо на привычный diskio.c переделать, на 439 у меня там 3 накопителя без проблем крутилось (2 флэшки + SDIO).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.