想知道官方Nucleo板接电脑变U盘是如何实现的
本帖最后由 奏奏奏 于 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 = *(__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);
}
}
return (USBD_OK);
/* USER CODE END 7 */
}
官方有例子哦。 党国特派员 发表于 2017-2-9 09:44
官方有例子哦。
求给个官方链接地址或者网盘链接地址参考,谢谢! 是不是要建立一个虚拟的FAT文件系统? zoomdy 发表于 2017-2-9 12:49
是不是要建立一个虚拟的FAT文件系统?
是在MCU的片内FLASH建立FAT文件系统
是不是虚拟的我就搞不懂了 党国特派员 发表于 2017-2-9 09:44
官方有例子哦。
鄙视这种不负责任的回答方式,最好给个连接也行啊。
关键是:我也找过,根本没找到。
ST的U盘升级方案可以参考ST-LINK/V2的具体实现,刚好论坛有个帖子,楼主去看下吧:
https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=610416
另外,你也可以参考mbed官方开源项目DAPLINK:
http://github.com/mbedmicro/DAPLink
moyanming2013 发表于 2017-2-9 13:54
鄙视这种不负责任的回答方式,最好给个连接也行啊。
关键是:我也找过,根本没找到。
ST的U盘升级方案可 ...
给的链接粗略看了一下
不是我需要的用USB引脚做MSC的功能
但是感谢帮我找相关的资料,谢谢! HAL库里有例程 dsjsjf 发表于 2017-2-11 17:40
HAL库里有例程
我之前找过,麻烦你指出在哪个目录下
en.stm32cubef1\STM32Cube_FW_F1_V1.4.0\Projects
再下一层的什么路径? 楼主 请问你找到相应的例程了吗? 找到的话可以共享个链接吗? 谢谢!!
页:
[1]
2