cancel
Showing results for 
Search instead for 
Did you mean: 

STM32F070RB USB MSC on internal Flash can not format

Greeting_to_you
Associate II

Hello,everybody Nice to meet you,My trouble is "STM32F070RB USB MSC on internal Flash can not format " ..I have try some idea in community but did not help,so I decided to ask for help,Here are my code on usbd_storage_if.c.

Thank you so much !

#define STORAGE_LUN_NBR                  1
#define STORAGE_BLK_NBR                  128
#define STORAGE_BLK_SIZ                  0x200
 
/* USER CODE BEGIN PRIVATE_DEFINES */
#define     FLASH_START_ADDR        0x08010000   
#define     FLASH_PAGE_NBR               32
uint8_t cache[STORAGE_BLK_SIZ];
FLASH_EraseInitTypeDef USB_ZONE;
 
/* USER CODE END PRIVATE_DEFINES */
 
/**
  * @}
  */
 
/** @defgroup USBD_STORAGE_Private_Macros
  * @brief Private macros.
  * @{
  */
 
/* USER CODE BEGIN PRIVATE_MACRO */
 
/* USER CODE END PRIVATE_MACRO */
 
/**
  * @}
  */
 
/** @defgroup USBD_STORAGE_Private_Variables
  * @brief Private variables.
  * @{
  */
 
/* USER CODE BEGIN INQUIRY_DATA_FS */
/** USB Mass storage Standard Inquiry Data. */
const int8_t STORAGE_Inquirydata_FS[] = {/* 36 */
  
  /* LUN 0 */
  0x00,
  0x80,
  0x02,
  0x02,
  (STANDARD_INQUIRY_DATA_LEN - 5),
  0x00,
  0x00,	
  0x00,
  'S', 'T', 'M', ' ', ' ', ' ', ' ', ' ', /* Manufacturer : 8 bytes */
  'P', 'r', 'o', 'd', 'u', 'c', 't', ' ', /* Product      : 16 Bytes */
  ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
  '0', '.', '0' ,'1'                      /* Version      : 4 Bytes */
}; 
/* USER CODE END INQUIRY_DATA_FS */
 
/* USER CODE BEGIN PRIVATE_VARIABLES */
 
/* USER CODE END PRIVATE_VARIABLES */
 
/**
  * @}
  */
 
/** @defgroup USBD_STORAGE_Exported_Variables
  * @brief Public variables.
  * @{
  */
 
extern USBD_HandleTypeDef hUsbDeviceFS;
 
/* USER CODE BEGIN EXPORTED_VARIABLES */
 
/* USER CODE END EXPORTED_VARIABLES */
 
/**
  * @}
  */
 
/** @defgroup USBD_STORAGE_Private_FunctionPrototypes
  * @brief Private functions declaration.
  * @{
  */
 
static int8_t STORAGE_Init_FS(uint8_t lun);
static int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size);
static int8_t STORAGE_IsReady_FS(uint8_t lun);
static int8_t STORAGE_IsWriteProtected_FS(uint8_t lun);
static int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
static int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
static int8_t STORAGE_GetMaxLun_FS(void);
 
/* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION */
 
/* USER CODE END PRIVATE_FUNCTIONS_DECLARATION */
 
/**
  * @}
  */
 
USBD_StorageTypeDef USBD_Storage_Interface_fops_FS =
{
  STORAGE_Init_FS,
  STORAGE_GetCapacity_FS,
  STORAGE_IsReady_FS,
  STORAGE_IsWriteProtected_FS,
  STORAGE_Read_FS,
  STORAGE_Write_FS,
  STORAGE_GetMaxLun_FS,
  (int8_t *)STORAGE_Inquirydata_FS
};
 
/* Private functions ---------------------------------------------------------*/
/**
  * @brief  Initializes over USB FS IP
  * @param  lun:
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_Init_FS(uint8_t lun)
{
  /* USER CODE BEGIN 2 */
  HAL_FLASH_Unlock();
  USB_ZONE.TypeErase        =     FLASH_TYPEERASE_PAGES;
  USB_ZONE.PageAddress   =     FLASH_START_ADDR  ;
  USB_ZONE.NbPages           =     FLASH_PAGE_NBR;
   uint32_t PageError = 0;
	HAL_FLASHEx_Erase(&USB_ZONE, &PageError);
  printf("---------------------Earse Flash Finish------------------------\n");
  HAL_FLASH_Lock(); 
  return (USBD_OK);
  /* USER CODE END 2 */
}
 
/**
  * @brief  .
  * @param  lun: .
  * @param  block_num: .
  * @param  block_size: .
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size)
{
  
  /* USER CODE BEGIN 3 */
 
  *block_num  =   STORAGE_BLK_NBR;
  *block_size    =   STORAGE_BLK_SIZ;
  return (USBD_OK);
  /* USER CODE END 3 */
}
 
/**
  * @brief  .
  * @param  lun: .
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_IsReady_FS(uint8_t lun)
{
  /* USER CODE BEGIN 4 */
  return (USBD_OK);
  /* USER CODE END 4 */
}
 
/**
  * @brief  .
  * @param  lun: .
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_IsWriteProtected_FS(uint8_t lun)
{
  /* USER CODE BEGIN 5 */
  return (USBD_OK);
  /* USER CODE END 5 */
}
 
/**
  * @brief  .
  * @param  lun: .
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
  /* USER CODE BEGIN 6 */
  uint32_t n,i,ADDRESS;
  ADDRESS = FLASH_START_ADDR+(blk_addr*STORAGE_BLK_SIZ);
  memcpy(buf,(uint8_t*)ADDRESS,blk_len*STORAGE_BLK_SIZ);
  return (USBD_OK);
  /* USER CODE END 6 */
}
 
/**
  * @brief  .
  * @param  lun: .
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
  /* USER CODE BEGIN 7 */
  
  HAL_FLASH_Unlock();
 
uint32_t n,i,ADDRESS,addr;
uint16_t data;
ADDRESS = FLASH_START_ADDR+(blk_addr*STORAGE_BLK_SIZ);
  
  for(i = 0;i<blk_len*STORAGE_BLK_SIZ;i+=2){
    data = buf[i]<<8 | buf[i+1];
    HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,
                      ADDRESS+i, 
                      data);
 }
  HAL_FLASH_Lock();
  return (USBD_OK);
 
  /* USER CODE END 7 */
}
 
/**
  * @brief  .
  * @param  None
  * @retval .
  */
int8_t STORAGE_GetMaxLun_FS(void)
{
  /* USER CODE BEGIN 8 */
  return (STORAGE_LUN_NBR - 1);
  /* USER CODE END 8 */
}

 my CubeMX configuration

0690X00000888T9QAI.png

10 REPLIES 10
Imen.D
ST Employee

Hello,

You can test the working application with STM32CubeF0, shows how to use the USB device application based on the Mass Storage Class (MSC) and perform format operation:

STM32Cube_FW_F0_V1.9.0\Projects\STM32072B_EVAL\Applications\USB_Device\MSC_Standalone

Kind Regards,

Imen.

When your question is answered, please close this topic by clicking "Accept as Solution".
Thanks
Imen

Your write code must manage the block erase and write functionality. If the erase block size is greater than the transfer, or spans, you must manage the data replacement too. You must erase memory before you can write to it. The PC expects to be able to read/write any block and get back exactly what it wrote. If this fails your system will fail.

Test your block read/write functionality outside of the MSC construct first. Instrument your code so you understand the interactions in real-time, your not going to be able to break point or single step an USB MSC.

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..

OK,Thank you for your help 🙂

Thank you �?:)

I understand,It means I have to Manage my Flash ‘s erase and write. So I might be want to make a data structures and algorithms to help me manage my Flash, because F070RB doesn't have sector erase, and I don't want to waste 2kb memory of SRAM for USB MSC.

how do you solve it?

I think one of the tricks here is to start with some HW/SW that actually works, and then understand HOW it works, and apply that knowledge to your own non-working situation. Figure if the shortest path is to take the working code to your platform, or fix the code your already have.

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..

we are using the internal flash, STORAGE_BLK_SIZ must >=512 right?

the flash page size is 256

we are using the internal flash, STORAGE_BLK_SIZ must >=512 right?

I'm not sure it is a requirement, but it will simplify things significantly if you pair them.

Also as previously suggest in the original thread I'd recommend that you TEST the block storage system outside the MSC context, and validate it works properly.

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..