Перейти к содержанию

Почему не работает USB на STM32H743?

Обновлено Редакция GAW

На STM32F1 или F4 USB заработает, как только включена частота 48 МГц и подключены линии. У STM32H743 нужно настроить ещё две вещи: выбрать источник тактового сигнала для USB, который после сброса выключен, и подать питание на приёмопередатчики через отдельный вывод VDD33USB.

Что проверить по RM0433

ГдеЧто записатьПочему
RCC_D2CCIP2R, USBSEL01, 10 или 11после сброса 00 — тактовый сигнал USB выключен
RCC_CR, HSI48ON1, ждать HSI48RDYесли источник — HSI48 (USBSEL = 11)
RCC_APB1HENR, CRSEN + CRSсинхронизация по SOFподстройка HSI48 под хост
PWR_CR3, USB33DEN1детектор VDD33USB включают до работы с USB
PWR_CR3, USBREGEN1, ждать USB33RDYесли 3,3 В на VDD33USB даёт встроенный регулятор
RCC_AHB1ENRUSB2OTGFSEN или USB1OTGHSENтактирование самого контроллера
// USB OTG FS on STM32H743 from HSI48 (RM0433, 6.4.7, RCC_D2CCIP2R)
PWR->CR3 |= PWR_CR3_USB33DEN | PWR_CR3_USBREGEN;
while (!(PWR->CR3 & PWR_CR3_USB33RDY)) { }
RCC->CR |= RCC_CR_HSI48ON;
while (!(RCC->CR & RCC_CR_HSI48RDY)) { }
RCC->D2CCIP2R = (RCC->D2CCIP2R & ~RCC_D2CCIP2R_USBSEL) | RCC_D2CCIP2R_USBSEL;  // 11: HSI48
RCC->APB1HENR |= RCC_APB1HENR_CRSEN;          // then configure CRS to sync on USB SOF
RCC->AHB1ENR |= RCC_AHB1ENR_USB2OTGFSEN;

Если на плате 3,3 В на VDD33USB подаются снаружи, регулятор не включают, а выводы VDD33USB и VDD50USB по RM0433 соединяют вместе — смотрите схему своей платы. Блок подстройки описан в термине «CRS», этапы подключения устройства к хосту — в термине «Энумерация USB».

Если контроллер настроен, а Windows пишет «Устройство USB не опознано», дальше ищут причину в кабеле, дескрипторах и линиях D+ и D−: порядок проверки собран в ответе «Почему компьютер не опознаёт USB-устройство». Про сам интерфейс и разъёмы — страница USB, про линейки STM32H7 — STM32H7.

Похожие вопросы

Нужен ли кварц для USB на STM32H743?

Не обязательно. HSI48 вместе с блоком CRS, который подстраивает генератор по пакетам SOF от хоста, по RM0433 предназначен именно для USB. Без CRS HSI48 работает свободно, и его точности по даташиту может не хватить — поэтому CRS включают и настраивают на синхронизацию по SOF.

Какой из двух USB работает на выводах PA11 и PA12?

Это вопрос распиновки конкретного корпуса — сверяйтесь с таблицей альтернативных функций в даташите. В заголовке CMSIS интерфейс USB_OTG_FS — это USB2_OTG_FS, его тактирование включает бит USB2OTGFSEN в RCC_AHB1ENR, а USB_OTG_HS — это USB1_OTG_HS с битом USB1OTGHSEN.

Почему USB перестаёт работать после выхода из Stop?

HSI48 по RM0433 выключается при входе в Stop и Standby. После пробуждения его снова включают и ждут готовности, а приложение USB должно корректно обработать приостановку и возобновление шины.

Источники

  1. STMicroelectronics. RM0433 Reference manual STM32H742, STM32H743/753 and STM32H750 Value line, Rev 9 — разд. 6.4.7: приёмопередатчики USB питаются от VDD33USB — от встроенного регулятора (USBREGEN) или от внешнего источника, тогда VDD33USB и VDD50USB соединяют; детектор уровня VDD33USB включают битом USB33DEN до использования USB, готовность — USB33RDY; разд. 6.8.4: PWR_CR3 — USB33RDY бит 26, USBREGEN бит 25, USB33DEN бит 24; RCC_D2CCIP2R: USBSEL[1:0] (биты 21:20) — 00 тактовый сигнал выключен (после сброса), 01 pll1_q_ck, 10 pll3_q_ck, 11 hsi48_ck; разд. 8.5.2: HSI48 предназначен для USB, подстраивается блоком CRS по SOF, LSE или внешнему сигналу, выключается в Stop и Standby; рис. 56: тактирование блоков USB1OTG и USB2OTG через мультиплексор USBSEL; таблица межблочных соединений: SOF USB1 и USB2 — входы синхронизации CRS crs_sync2 и crs_sync3
  2. STMicroelectronics. cmsis-device-h7, Include/stm32h743xx.h (commit 81db1ec) — PWR_CR3_USB33DEN = 0x01000000, PWR_CR3_USBREGEN = 0x02000000, PWR_CR3_USB33RDY = 0x04000000; RCC_D2CCIP2R_USBSEL — биты 21:20; RCC_CR_HSI48ON — бит 12; RCC_APB1HENR_CRSEN — бит 1; RCC_AHB1ENR_USB2OTGFSEN — бит 27, RCC_AHB1ENR_USB1OTGHSEN — бит 25; USB_OTG_FS — это USB2_OTG_FS (0x4008 0000)

Нашли ошибку?