Вы путаете состояние ресета контрооллера USB и прерывание по состоянию ресета в линии. Правильная последовательность включения:
- сконфигурировать ноги USBDP и USBDM
- настроить тактирование USB на 48 МГц и включить его;
- настроить домены питания и источники опорного напряжения (в контроллерах где они есть);
- снять PowerDown *
- снять ресет с контроллера USB и включить нужные прерывания
Код: Выделить всё
USB->CNTR = USB_CNTR_CTRM | USB_CNTR_RESETM | USB_CNTR_SUSPM | USB_CNTR_WKUPM;
- заполнить таблицу дескрипторов буферов;
- разрешить прерывания;
Код: Выделить всё
USB USB->ISTR = 0;
NVIC_EnableIRQ(USB_IRQn);
- подключить PullUp резистор в линию.
Вот только теперь прилетит прерывание Reset из линии и в нём надо делать остальные настройки (сбросить адрес в 0 и настроить конечные точки) и дальше действовать по протоколу энумерации.
------------------------------------
* - при включении питания в регистре USB->CNTR взведено два бита USB_CNTR_FRES и USB_CNTR_PDWN. То есть, контроллер USB находится в состоянии Power Down c нажатой линией Reset. То есть, ваша
фактически ничего не делает, бит и так взведён. Вместо этого надо написать
Этим вы сбросите бит USB_CNTR_PDWN. Затем надо сбросить и бит USB_CNTR_FRES. Можно сделать
А затем включить нужные прерывания
Код: Выделить всё
USB->CNTR = USB_CNTR_CTRM | USB_CNTR_RESETM | USB_CNTR_SUSPM | USB_CNTR_WKUPM;
Последнее действие автоматом делает и предпоследнее. Так что,
USB->CNTR = 0; можно опустить. И никаких "|=" и "&=" тут не надо. Отучайтесь их применять просто так. Есть же простой оператор присваивания - пользуйтесь.