2019-03-18 02:41 AM
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
2019-03-18 08:30 AM
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.
2019-03-18 09:01 AM
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.
2019-03-19 06:19 AM
OK,Thank you for your help :)
2019-03-19 06:30 AM
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.
2019-10-30 08:07 PM
how do you solve it?
2019-10-30 09:37 PM
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.
2019-10-30 09:57 PM
we are using the internal flash, STORAGE_BLK_SIZ must >=512 right?
the flash page size is 256
2019-10-30 09:58 PM
we are using the internal flash, STORAGE_BLK_SIZ must >=512 right?
2019-10-30 10:43 PM
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.