Решил
"оптимизировать" USB для STM32, чтобы было более-менее однообразно и для CDC, и для HID, и для составного устройства. Отрефакторил код, пытаюсь запустить. И таки что бы вы думали? До энумерации элементарно не доходит!
Воткнул дебаг в UART на скорости 460800.
Я уже взял и просто копипастой функцию настройки USB и функцию обработчика прерываний USB воткнул в рабочий pl2303. И оно работает! Вот такой лог выдает
USB_setup
usbhw.c (L64): USB ready
usb_lib.c (L500): USB_IRQ
0x0400
usb_lib.c (L503): USB_ISTR_RESET
usb_lib.c (L500): USB_IRQ
0x0900
usb_lib.c (L551): USB_ISTR_SUSP
usb_lib.c (L500): USB_IRQ
0x1000
usb_lib.c (L543): USB_ISTR_WKUP
usb_lib.c (L500): USB_IRQ
0x0400
usb_lib.c (L503): USB_ISTR_RESET
usb_lib.c (L500): USB_IRQ
0x8210
usb_lib.c (L518): USB_ISTR_CTR
usb_lib.c (L528): control EP
usb_lib.c (L530): USB_EPnR_SETUP
... // ну и пошел запрос дескриптора и энумерация
А вот в "отрефакторенном" вот такое:
USB_setup
usb_lib.c (L415): USB ready
usb_lib.c (L308): USB_IRQ
0x0400
usb_lib.c (L311): USB_ISTR_RESET
usb_lib.c (L308): USB_IRQ
0x1000
usb_lib.c (L351): USB_ISTR_WKUP
usb_lib.c (L308): USB_IRQ
0x0400
usb_lib.c (L311): USB_ISTR_RESET
usb_lib.c (L308): USB_IRQ
0x0600
usb_lib.c (L311): USB_ISTR_RESET
usb_lib.c (L308): USB_IRQ
... и еще несколько попыток перезагрузить
Сижу и голову ломаю: как совершенно один и тот же код может выдавать разные результаты?