Skip to main content
Visitor II
December 21, 2020
Question

USB OTG FS

  • December 21, 2020
  • 2 replies
  • 1015 views

We are working on STM32H743BITx customized board for USB OTG FS.

We have configured the MSC but unable to detect the pendrive , nothing is getting filled in

USBDiskPath and appli_state is showing application start when pen drive is connected but its not getting active to create the file.

Thank You

Komala

    This topic has been closed for replies.

    2 replies

    Visitor II
    December 21, 2020

    Hi Komala,

    Please refer to the STM32CubeH7 under Application directory.

    Best Regards,

    Ons.

    Visitor II
    April 9, 2021

    Hi Komala,

    After checking your project, I found different issues that I want to share with you:

    First, I think that the SystemClock_Config is not well configured, try to use this one:

    /**
     * @brief System Clock Configuration
     * @retval None
     */
    void SystemClock_Config(void)
    {
     RCC_ClkInitTypeDef RCC_ClkInitStruct;
     RCC_OscInitTypeDef RCC_OscInitStruct;
     RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
     
     /*!< Supply configuration update enable */
     HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
     
     /* The voltage scaling allows optimizing the power consumption when the device is
     clocked below the maximum system frequency, to update the voltage scaling value
     regarding system frequency refer to product datasheet. */
     __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
     
     while ((PWR->D3CR & (PWR_D3CR_VOSRDY)) != PWR_D3CR_VOSRDY) {}
     
     /* Enable HSE Oscillator and activate PLL with HSE as source */
     RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
     RCC_OscInitStruct.HSEState = RCC_HSE_ON;
     RCC_OscInitStruct.HSIState = RCC_HSI_OFF;
     RCC_OscInitStruct.CSIState = RCC_CSI_OFF;
     RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
     RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
     
     /* PLL1 for System Clock */
     RCC_OscInitStruct.PLL.PLLM = 5;
     RCC_OscInitStruct.PLL.PLLN = 160;
     RCC_OscInitStruct.PLL.PLLFRACN = 0;
     RCC_OscInitStruct.PLL.PLLP = 2;
     RCC_OscInitStruct.PLL.PLLR = 2;
     RCC_OscInitStruct.PLL.PLLQ = 4;
     
     RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
     RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
     HAL_RCC_OscConfig(&RCC_OscInitStruct);
     
     /* PLL3 for USB Clock */
     PeriphClkInitStruct.PLL3.PLL3M = 25;
     PeriphClkInitStruct.PLL3.PLL3N = 336;
     PeriphClkInitStruct.PLL3.PLL3FRACN = 0;
     PeriphClkInitStruct.PLL3.PLL3P = 2;
     PeriphClkInitStruct.PLL3.PLL3Q = 7;
     PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOMEDIUM;
     PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_0;
     
     PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;
     PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_PLL3;
     HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
     
     /* Disable PLL3. */
     __HAL_RCC_PLL3_DISABLE();
     
     /* Select PLL as system clock source and configure bus clocks dividers */
     RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_D1PCLK1 | RCC_CLOCKTYPE_PCLK1 | \
     RCC_CLOCKTYPE_PCLK2 | RCC_CLOCKTYPE_D3PCLK1);
     
     RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
     RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
     RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
     RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
     RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
     RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
     HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);
     
     /* Activate CSI clock is mandatory for I/O Compensation Cell */
     __HAL_RCC_CSI_ENABLE() ;
     
     /* Enable SYSCFG clock is mandatory for I/O Compensation Cell */
     __HAL_RCC_SYSCFG_CLK_ENABLE() ;
     
     /* Enables the I/O Compensation Cell */
     HAL_EnableCompensationCell();
    }

    Second, I think that the USBH_UserProcess () function is missing some code: (usb_host.c file)

    /*
     * user callback definition
     */
    void USBH_UserProcess (USBH_HandleTypeDef *phost, uint8_t id)
    {
     /* USER CODE BEGIN CALL_BACK_1 */
     switch (id)
     {
     case HOST_USER_SELECT_CONFIGURATION:
     break;
     
     case HOST_USER_DISCONNECTION:
     Appli_state = APPLICATION_DISCONNECT;
     if (f_mount(NULL, "", 0) != FR_OK)
     {
     LCD_ErrTrace("ERROR : Cannot DeInitialize FatFs! \n");
     }
     if (FATFS_UnLinkDriver(USBDISKPath) != 0)
     {
     LCD_ErrTrace("ERROR : Cannot UnLink FatFS Driver! \n");
     }
     break;
     
     case HOST_USER_CLASS_ACTIVE:
     Appli_state = APPLICATION_READY;
     break;
     
     case HOST_USER_CONNECTION:
     if (FATFS_LinkDriver(&USBH_Driver, USBDISKPath) == 0)
     {
     if (f_mount(&USBH_fatfs, "", 0) != FR_OK)
     {
     LCD_ErrTrace("ERROR : Cannot Initialize FatFs! \n");
     }
     }
     break;
     
     default:
     break;
     }
     /* USER CODE END CALL_BACK_1 */
    }

    And finally, why did you choose PD3 as VBUS ?

    Best REgards,

    Ons.