你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

想知道官方Nucleo板接电脑变U盘是如何实现的

[复制链接]
奏奏奏 提问时间:2017-2-9 09:24 /
本帖最后由 奏奏奏 于 2017-2-9 09:28 编辑

之前求助的结果
就是用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 */
}

USB在电脑上显示盘符

USB在电脑上显示盘符

对比Nucleo板接USB在电脑上显示盘符

对比Nucleo板接USB在电脑上显示盘符
收藏 3 评论10 发布时间:2017-2-9 09:24

举报

10个回答
党国特派员 回答时间:2017-2-9 09:44:39
官方有例子哦。
奏奏奏 回答时间:2017-2-9 10:25:41

求给个官方链接地址或者网盘链接地址参考,谢谢!
zoomdy 回答时间:2017-2-9 12:49:43
是不是要建立一个虚拟的FAT文件系统?
奏奏奏 回答时间:2017-2-9 13:35:56
zoomdy 发表于 2017-2-9 12:49
是不是要建立一个虚拟的FAT文件系统?

是在MCU的片内FLASH建立FAT文件系统
是不是虚拟的我就搞不懂了
moyanming2013 回答时间:2017-2-9 13:54:06

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

评分

参与人数 1ST金币 +5 收起 理由
zero99 + 5

查看全部评分

奏奏奏 回答时间:2017-2-9 16:57:39
moyanming2013 发表于 2017-2-9 13:54
鄙视这种不负责任的回答方式,最好给个连接也行啊。
关键是:我也找过,根本没找到。
ST的U盘升级方案可 ...

给的链接粗略看了一下
不是我需要的用USB引脚做MSC的功能
但是感谢帮我找相关的资料,谢谢!
埃斯提爱慕 回答时间:2017-2-11 17:40:48
提示: 作者被禁止或删除 内容自动屏蔽
奏奏奏 回答时间:2017-2-12 07:50:48

我之前找过,麻烦你指出在哪个目录下
en.stm32cubef1\STM32Cube_FW_F1_V1.4.0\Projects
再下一层的什么路径?
tianqiyixian 回答时间:2017-3-2 15:05:21
楼主 请问你找到相应的例程了吗? 找到的话可以共享个链接吗? 谢谢!!
奏奏奏 回答时间:2017-3-2 17:17:42
tianqiyixian 发表于 2017-3-2 15:05
楼主 请问你找到相应的例程了吗? 找到的话可以共享个链接吗? 谢谢!!

并没有找到

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版