Не могу поднять usb device на stm32f401 с помощью CubeMX.
Сделал в Cube простенький проект. Подключил только JTAG, USB-Device и указал VCP. настроил клоки. На USB 48 МГц, на шину AHB 24 MГц. Vbus - Разрешил.
Сгенерировал проект (IAR) запустил. подключил к ПК. На этом этапе я должен увидеть в диспетчере устройств свой девайс (STM32 Virtual ComPort).
В реале вижу Unknown device. Стал дебажить.
все прерывания от USB вызывают один обработчик в котором ведётся разбор.
void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd);
Код
/**
* @brief Handles PCD interrupt request.
* @param hpcd: PCD handle
* @retval HAL status
*/
void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd)
{
USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
uint32_t i = 0U, ep_intr = 0U, epint = 0U, epnum = 0U;
uint32_t fifoemptymsk = 0U, temp = 0U;
USB_OTG_EPTypeDef *ep;
uint32_t hclk = 180000000;
Первое, что мне не понравилось, это uint32_t hclk = 180000000; это частота hclk на AHB. Почему в коде 180 МГц? Исправил на 24.
Всё равно вижу Unknown device. Что-то идет не так.
поставил точки останова в разборе прерываний от усб. Прерывания поступают в следующем порядке
1) Handle Connection event Interrupt
2) Handle Suspend Interrupt
3) Handle Reset Interrupt
4) Handle Enumeration done Interrupt
всё! в другие ветки обработчика прерывания не попадаю. ПК не может вычитать PID/VID.
В инете полно статей по быстрому запуску USB. Они не рассматривают все внутренние механизмы USB, а только поверхностно настройка в CubeMX. Но чегото пошло не так... Аппаратно плата рабочая. Есть прошивка для этой платы, с которой усб работает.
Кто сталкивался с подобной проблемой? Куда копать?