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

想知道官方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的功能
但是感谢帮我找相关的资料,谢谢!
dsjsjf 回答时间:2017-2-11 17:40:48
HAL库里有例程
奏奏奏 回答时间:2017-2-12 07:50:48

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

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版