Приветствую!
История началась с того, что на целевом устройстве на базе STM32F429 через определённое время перестаёт работать BULK OUT.
Раскопки привели к тому, что после программного сброса модуля OTG_FS и его инициализации, содержимое некоторых установленных регистров оказыватся испорченным.
Теперь конкретика. Я взял STM32F429 discovery, IDE IAR. Из STM32Cube_FW_F4_V1.13.0 пример UART_TwoBoards_ComPolling.
В main.c после установки системной частоты SystemClock_Config() я добавил такие строки:
Код
  __HAL_RCC_USB_OTG_FS_CLK_ENABLE();
  
  USB_OTG_FS->GRSTCTL |= USB_OTG_GRSTCTL_CSRST;

  while (USB_OTG_FS->GRSTCTL & USB_OTG_GRSTCTL_CSRST);

  {
    volatile unsigned int i;

    for (i = 0; i < 50000; i++); // ~2.8 ms delay (datasheet: at least 3 PHY clocks delay)
  }

  USB_OTG_FS->DIEPTXF0_HNPTXFSIZ = 0x03FF03FF;

  BSP_LED_On(LED3);

  while (USB_OTG_FS->DIEPTXF0_HNPTXFSIZ == 0x03FF03FF);

  BSP_LED_Off(LED3);

  while (1);


Записываю в Host non-periodic transmit FIFO size register значение 0x03FF03FF
Между BSP_LED_On(LED3); и BSP_LED_Off(LED3); проходит 58.4 мс, регистр оказывается наполовину сброшенным,
т.е. поле RAM start address остаётся 0x3FF, а поле TxFIFO depth сбрасывается в 0x200.

Перечитал 34 главу скудного Reference manual (DM00031020), но не смог найти объяснения такому поведению...