2022-02-14

eddy_em: (Default)
2022-02-14 02:43 pm
Entry tags:

USB на STM32F303

Промучился вчера часов пять с непонятной проблемой: вроде бы периферия USB у F303 такая же убогая, как у F103, т.е. можно 1-в-1 перенести. А не работала, зараза! Уже дошел до скрупулезной проверки тактирования, пока не увидел косяк в своем коде: в отличие от F0x2, здесь нужно инициализировать ноги. И вот, что я нарисовал:
    GPIOA->MODER = (GPIOA->MODER & (~GPIO_MODER_MODER15_Msk | GPIO_MODER_MODER11_Msk | GPIO_MODER_MODER12_Msk)) |
            GPIO_MODER_MODER11_AF | GPIO_MODER_MODER12_AF | GPIO_MODER_MODER15_O;
    // USB - alternate function 14 @ pins PA11/PA12
    GPIOA->AFR[1] = (GPIOA->AFR[1] & ~(GPIO_AFRH_AFRH4_Msk | GPIO_AFRH_AFRH5_Msk)) |
            (14 << (4 * 4)) | (14 << (5 * 4));

Т.е., чтобы вычислить смещение в битах второго байта, я вместо 8 вычел из 11 и 12 семерку! А правильно — так:
    GPIOA->AFR[1] = (GPIOA->AFR[1] & ~(GPIO_AFRH_AFRH3_Msk | GPIO_AFRH_AFRH4_Msk)) |
            (14 << (3 * 4)) | (14 << (4 * 4));

Т.е. инициализировал я только USB_DP, а нога DM оставалась неинициализированной — вот оно дальше USB reset и не шло! Как только поменял — все заработало.
Но мне не нравится эта реализация: довольно-таки тупая, буду делать большой кольцевой буфер с автоотправкой очередных 64 байт после каждого прерывания EP3IN.