eddy_em: (Default)
eddy_em ([personal profile] eddy_em) wrote2022-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.

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org