USB Host на STM32F407VET6 под SEGGER Embedded Studio

Некоторое неудобство 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 взлетел и тут же с клавиатуры начали получать коды нажатых клавиш :

фотка 1

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

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

* UsbHost STM32F407VE attached HID-KeyBoard Embeded Studio [zip]
реализован интерфейс USB HOST для подключения к нему клавиатуры на STM32F407VET6