Некоторое неудобство Embedded Studio связано с малым количеством примеров под разные контроллеры
Вот пример типичной ситуации :
У нас плата с STM32F407VET6
У Segger есть только похожий пример для их платы на контроллере STM32F746
Что нам остается копировать их пример и переделывать под свои нужды , но бесплатность среды разработки (для некоммерческое использования) того стоит.
еще есть примеры на Keil5 + STM32CubeMX USB HOST для контроллера STM32F407VET6 ( Keyborad взлетел сразу)
На основе его переходим к проекту на Embedded Studio. И надло признаться примеры Keil нам очень помогли впоследствии.
Как всегда аббревиатуры для понимания
Чтобы понять где не работает код пришлось копаться в настройках регистров и т.д.
OHCI - Open Host Controller Interface
OTG - On-The-Go
SAI - Serial audio interface
MODER определяет режим работы вывода
AFRH - Alternate Function Register (High часть)
BSSR - Bit Set Reset Registers
Пытаемся переделать проект в Embedded Studio из STM32F746 примера для нашего STM32F407VET6
Как обычно выкидываем код поддержки STM32F746 , подключаем поддержку STM32F407 . Все файлы, что генерит нам STM32CubeMx для нашего контроллера STM32F407 настроенным под USB-Host кидаем в новый проект (если там уже есть такие файлы заменяем).
Первый затык возник с настройкой частот контроллера RCC
Сразу сталкиваемся с неправильной настройкой RCC регистров (это видно в SystemCoreClockUpdate()), там почему-то код использует HSI источник .
Начинаем вспоминать аббревиатуры :
RCC - Reset and clock control
HSI - High Speed Internal (16MHz)
HSE - High Speed External (8MHz)
MCO - Microcontroller clock output
SWS - System clock switch status (bits)
Вопрос решается через добавление штатной функции SystemClock_Config() в начало нашего main.c . Как и где Embedded Studio в коде из примера настраивает частоты я так и не нашел. поэтому SystemClock_Config() пришлось заимствовать из примера на Keil.
Второй затык возник с настройкой порта GPIOA
Почему-то их код из примера Segger не менял значение GPIOA_MODER (режимы порта) , хотя в коде прописано менять (но не менял).
Пришлось заимствовать из пример Keil HAL_GPIO_Init(..
И далее о чудо все заработало как по маслу!
USB Host взлетел и тут же с клавиатуры начали получать коды нажатых клавиш :

И это все работает в многозадачном режиме и вам за это не надо платить ни копейки (если вы приняли лицензию для не коммерческого использования).
Файлы для скачивания
*
реализован интерфейс USB HOST для подключения к нему клавиатуры на STM32F407VET6