请问官方Nucleo板接电脑变U盘是如何实现的

2019-07-14 15:40发布



之前求助的结果
就是用MCU的片内FLASH做文件系统存放数据
我就想到官方的Nucleo板不就是这样的吗?!

我目前只能做到显示出有U盘的盘符(因为用CubeMX配置的USB_device_Only MSC),但是接入电脑后马上提示要格式化才能用
官方的Nucleo板插入后能正常显示U盘,而且能够像U盘一样往里面放文件(但是下次插入电脑时自动清除)

了解到现在要改的关键部分代码或函数有以下这几个(求教怎么修改带能正常,MCU:STM32F107VCT6,FLASH是256K,每页2K):

usbd_storage_if.c文件中的
int8_t STORAGE_Init_FS (uint8_t lun)
{
  /* USER CODE BEGIN 2 */
        HAL_FLASH_Unlock();
  /* Fill EraseInit structure*/
  EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
  EraseInitStruct.PageAddress = FLASH_USER_START_ADDR;
  EraseInitStruct.NbPages     = (FLASH_USER_END_ADDR - FLASH_USER_START_ADDR) / FLASH_PAGE_SIZE;
  return (USBD_OK);
  /* USER CODE END 2 */
}


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;
  *block_num  = 0x20;
  *block_size = 0x800;
  return (USBD_OK);
  /* USER CODE END 3 */
}


int8_t STORAGE_Read_FS (uint8_t lun,
                        uint8_t *buf,
                        uint32_t blk_addr,                       
                        uint16_t blk_len)
{
  /* USER CODE BEGIN 6 */
  if(lun == 0)
        {
    for(uint16_t i=0;i<blk_len;i+=4)
                {
                        buf[i>>2] = *(__IO uint32_t *)(FLASH_START_ADDR + blk_addr);
//       buf = *(vu32*)(FLASH_START_ADDR + blk_addr);
    }        
        }
        
  return (USBD_OK);
  /* USER CODE END 6 */
}


int8_t STORAGE_Write_FS (uint8_t lun,
                         uint8_t *buf,
                         uint32_t blk_addr,
                         uint16_t blk_len)
{
  /* USER CODE BEGIN 7 */
   if(lun == 0)
         {
     for(uint16_t i=0; i<blk_len;i+=FLASH_PAGE_SIZE)
                 {
//                         FLASH_tiMEOUT_VALUE
       if(FLASH_WaitForLastOperation(FLASH_WAIT_TIMEOUT)!=FLASH_TIMEOUT_VALUE)
                         {
                                        __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPERR);
                         }
       FLASH_PageErase(FLASH_START_ADDR + blk_addr + i);
     }
     for(uint16_t i=0;i<blk_len;i+=4)
                 {
       if(FLASH_WaitForLastOperation(FLASH_WAIT_TIMEOUT)!=FLASH_TIMEOUT_VALUE)
                         {
         __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPERR);
       }
       HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,FLASH_START_ADDR + blk_addr + i , buf[i>>2]);
     }        
         }
        
  return (USBD_OK);
  /* USER CODE END 7 */
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
UserMen
1楼-- · 2019-07-14 21:35
你我然后 发表于 2018-11-28 06:27
官方有例子哦。

求给个官方链接地址或者 {MOD}链接地址参考,谢谢!
60user58
2楼-- · 2019-07-14 23:09
是不是要建立一个虚拟的FAT文件系统?
UserMen
3楼-- · 2019-07-15 04:24
 精彩回答 2  元偷偷看……
7762642422d
4楼-- · 2019-07-15 09:44
你我然后 发表于 2018-11-28 06:27
官方有例子哦。

鄙视这种不负责任的回答方式,最好给个连接也行啊。
关键是:我也找过,根本没找到。
ST的U盘升级方案可以参考ST-LINK/V2的具体实现,刚好论坛有个帖子,楼主去看下吧:
http://www.stmcu.org/module/foru ... read&tid=610416
另外,你也可以参考mbed官方开源项目DAPLINK:
https://github.com/mbedmicro/DAPLink
UserMen
5楼-- · 2019-07-15 10:39
7762642422d 发表于 2018-11-28 07:21
鄙视这种不负责任的回答方式,最好给个连接也行啊。
关键是:我也找过,根本没找到。
ST的U盘升级方案可以参考ST-LINK/V2的具体实现,刚好论坛有个帖子,楼主去看下吧:

给的链接粗略看了一下
不是我需要的用USB引脚做MSC的功能
但是感谢帮我找相关的资料,谢谢!
tianyou15
6楼-- · 2019-07-15 16:22
HAL库里有例程

一周热门 更多>