Skip to main content
Visitor II
July 30, 2025
Question

USBX Device MSC in Standalone mode in STM32u083

  • July 30, 2025
  • 2 replies
  • 427 views

I am trying to get USBX Device MSC to work in Standalone mode (without RTOS) on Stm32u083mc microcontroller. However, I am interested in configuring an external Flash as a mass storage device. i am using the same clock frequency of HID standalone example which i referred from official STM32U0 Work shop tutorial from youtube. Now i am planning for mass storage class, i am defining pool_size and stack_size is from app_usbx_device.h file 

#define UX_DEVICE_APP_MEM_POOL_SIZE (10*1024)

#define USBX_DEVICE_MEMORY_STACK_SIZE (10*1024).
from MX_USBX_Device_Init() function i am getting usbd_ok. before returing i am calling these function USBX_APP_Device_Init();

VOID USBX_APP_Device_Init(VOID)

{

MX_USB_PCD_Init();

 

// Endpoint 0 (Control)

HAL_PCDEx_PMAConfig(&hpcd_USB_DRD_FS, 0x00, PCD_SNG_BUF, 0x00); // EP0 OUT at PMA offset 0x00

HAL_PCDEx_PMAConfig(&hpcd_USB_DRD_FS, 0x80, PCD_SNG_BUF, 0x40); // EP0 IN at PMA offset 0x40

 

// Endpoint 1 (MSC Bulk)

HAL_PCDEx_PMAConfig(&hpcd_USB_DRD_FS, 0x01, PCD_SNG_BUF, 0x80); // EP1 OUT at PMA offset 0x80

HAL_PCDEx_PMAConfig(&hpcd_USB_DRD_FS, 0x81, PCD_SNG_BUF, 0xC0); // EP1 IN at PMA offset 0xC0

 

ux_dcd_stm32_initialize((ULONG)&hpcd_USB_DRD_FS, (ULONG)&hpcd_USB_DRD_FS);

 

HAL_PCD_Start(&hpcd_USB_DRD_FS);

}

UINT MX_USBX_Device_Init(VOID)

{

UINT ret = UX_SUCCESS;

UCHAR *device_framework_high_speed;

UCHAR *device_framework_full_speed;

ULONG device_framework_hs_length;

ULONG device_framework_fs_length;

ULONG string_framework_length;

ULONG language_id_framework_length;

UCHAR *string_framework;

UCHAR *language_id_framework;

 

UCHAR *pointer;

 

/* USER CODE BEGIN MX_USBX_Device_Init0 */

 

/* USER CODE END MX_USBX_Device_Init0 */

pointer = ux_device_byte_pool_buffer;

 

/* Initialize USBX Memory */

if (ux_system_initialize(pointer, USBX_DEVICE_MEMORY_STACK_SIZE, UX_NULL, 0) != UX_SUCCESS)

{

/* USER CODE BEGIN USBX_SYSTEM_INITIALIZE_ERROR */

 

return UX_ERROR;

/* USER CODE END USBX_SYSTEM_INITIALIZE_ERROR */

}

 

/* Get Device Framework High Speed and get the length */

device_framework_high_speed = USBD_Get_Device_Framework_Speed(USBD_HIGH_SPEED,

&device_framework_hs_length);

 

/* Get Device Framework Full Speed and get the length */

device_framework_full_speed = USBD_Get_Device_Framework_Speed(USBD_FULL_SPEED,

&device_framework_fs_length);

 

/* Get String Framework and get the length */

string_framework = USBD_Get_String_Framework(&string_framework_length);

 

/* Get Language Id Framework and get the length */

language_id_framework = USBD_Get_Language_Id_Framework(&language_id_framework_length);

 

/* Install the device portion of USBX */

if (ux_device_stack_initialize(device_framework_high_speed,

device_framework_hs_length,

device_framework_full_speed,

device_framework_fs_length,

string_framework,

string_framework_length,

language_id_framework,

language_id_framework_length,

USBD_ChangeFunction) != UX_SUCCESS)

{

/* USER CODE BEGIN USBX_DEVICE_INITIALIZE_ERROR */

 

return UX_ERROR;

/* USER CODE END USBX_DEVICE_INITIALIZE_ERROR */

}

 

/* Initialize the storage class parameters for the device */

storage_parameter.ux_slave_class_storage_instance_activate = USBD_STORAGE_Activate;

storage_parameter.ux_slave_class_storage_instance_deactivate = USBD_STORAGE_Deactivate;

 

/* Store the number of LUN in this device storage instance */

storage_parameter.ux_slave_class_storage_parameter_number_lun = STORAGE_NUMBER_LUN;

 

/* Initialize the storage class parameters for reading/writing to the Flash Disk */

storage_parameter.ux_slave_class_storage_parameter_lun[0].

ux_slave_class_storage_media_last_lba = USBD_STORAGE_GetMediaLastLba();

 

storage_parameter.ux_slave_class_storage_parameter_lun[0].

ux_slave_class_storage_media_block_length = USBD_STORAGE_GetMediaBlocklength();

 

storage_parameter.ux_slave_class_storage_parameter_lun[0].

ux_slave_class_storage_media_type = 0;

 

storage_parameter.ux_slave_class_storage_parameter_lun[0].

ux_slave_class_storage_media_removable_flag = STORAGE_REMOVABLE_FLAG;

 

storage_parameter.ux_slave_class_storage_parameter_lun[0].

ux_slave_class_storage_media_read_only_flag = STORAGE_READ_ONLY;

 

storage_parameter.ux_slave_class_storage_parameter_lun[0].

ux_slave_class_storage_media_read = USBD_STORAGE_Read;

 

storage_parameter.ux_slave_class_storage_parameter_lun[0].

ux_slave_class_storage_media_write = USBD_STORAGE_Write;

 

storage_parameter.ux_slave_class_storage_parameter_lun[0].

ux_slave_class_storage_media_flush = USBD_STORAGE_Flush;

 

storage_parameter.ux_slave_class_storage_parameter_lun[0].

ux_slave_class_storage_media_status = USBD_STORAGE_Status;

 

storage_parameter.ux_slave_class_storage_parameter_lun[0].

ux_slave_class_storage_media_notification = USBD_STORAGE_Notification;

 

/* USER CODE BEGIN STORAGE_PARAMETER */

 

/* USER CODE END STORAGE_PARAMETER */

 

/* Get storage configuration number */

storage_configuration_number = USBD_Get_Configuration_Number(CLASS_TYPE_MSC, 0);

 

/* Find storage interface number */

storage_interface_number = USBD_Get_Interface_Number(CLASS_TYPE_MSC, 0);

 

/* Initialize the device storage class */

if (ux_device_stack_class_register(_ux_system_slave_class_storage_name,

ux_device_class_storage_entry,

storage_configuration_number,

storage_interface_number,

&storage_parameter) != UX_SUCCESS)

{

/* USER CODE BEGIN USBX_DEVICE_STORAGE_REGISTER_ERROR */

 

 

return UX_ERROR;

/* USER CODE END USBX_DEVICE_STORAGE_REGISTER_ERROR */

}

 

/* USER CODE BEGIN MX_USBX_Device_Init1 */

 

 

USBX_APP_Device_Init();

/* USER CODE END MX_USBX_Device_Init1 */

 

return ret;

}

i am using heap and stack is

_Min_Heap_Size = 0x200; /* required amount of heap */

_Min_Stack_Size = 0x400; /* required amount of stack */

 

I am not sure what might be the issue, but i tried calling ux_device_stacks_run(); in while at the time it was enetring into Hardfault error

 

but even though i am getting popup like USB Device is not recognized.

    This topic has been closed for replies.

    2 replies

    Technical Moderator
    July 30, 2025
    Visitor II
    July 31, 2025

    Hi @Saket_Om @FBL I already referred above example, but i am trying for External flash memory(w25q64jv) or i am trying to implement some ram portion as mass storage is that possible?. If possible can i get applications notes for usbx. i am facing the issue like device is not recognized.

    Technical Moderator
    July 30, 2025

    Hi @naveenkumar-192 

    First, are you using a reference board? U083 DK?

    I recommend increasing your stack and heap sizes. 

    Visitor II
    July 31, 2025

    Hii @FBL yeah i am using STM32U083C-DK, i am using heap size and stack size _Min_Heap_Size = 0x200; _Min_Stack_Size = 0x400;  and i am using clock source for usb is HSI 48MHz, in RCC configuration i am using CRS SYNC Source USB for main clock i am not using HSE, HSI, i am using MSI 48000KHz. I am trying  Mass storage class in Standalone.