野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11261|回复: 14

F429IGT6核心板内部flash模拟U盘问题!急急急!!!

[复制链接]
发表于 2018-8-31 15:33:28 | 显示全部楼层 |阅读模式
小弟在用STM32F429IGT6核心板内部flash模拟U盘,在官方例程“USB—外部FLASH模拟U盘”基础上修改,部分修改的代码如下,请各位大神指点下,谢谢!!!代码只是修改了“usbd_storage_msd.c”文件下的部分,是不是其他文件也有要修改的,我没修改啊???
#include "usbd_msc_mem.h"
#include "usb_conf.h"
#include "./bsp/flash/bsp_spi_flash.h"


#define     FLASH_START_ADDR        0x08020000    // Flash start address
#define     FLASH_SIZE              7             //7个扇区
#define     FLASH_PAGE_SIZE         0x20000       // 128Kbytes每个扇区


int8_t STORAGE_Init (uint8_t lun);

int8_t STORAGE_GetCapacity (uint8_t lun,
                           uint32_t *block_num,
                           uint32_t *block_size);

int8_t  STORAGE_IsReady (uint8_t lun);

int8_t  STORAGE_IsWriteProtected (uint8_t lun);

int8_t STORAGE_Read (uint8_t lun,
                        uint8_t *buf,
                        uint32_t blk_addr,
                        uint32_t blk_len);

int8_t STORAGE_Write (uint8_t lun,
                        uint8_t *buf,
                        uint32_t blk_addr,
                        uint32_t blk_len);

int8_t STORAGE_GetMaxLun (void);


int8_t STORAGE_Init (uint8_t lun)
{
  //return SPI_FLASH_Init();
        FLASH_Unlock();
        return 0;
}


int8_t STORAGE_GetCapacity (uint8_t lun, uint32_t *block_num, uint32_t *block_size)
{
  *block_size = 0x20000;    //flashÿ¸öéèÇø128Kbytes
  *block_num = 7;           //×ü127¸öéèÇø
  return (0);
}



int8_t STORAGE_Read (uint8_t lun,
                 uint8_t *buf,
                 uint32_t blk_addr,                       
                 uint32_t blk_len)
{
        uint32_t i;
        if(lun==0)
        {
                for(i=0;i<blk_len;i+=4)
          {
      buf=*((vu32*)(FLASH_START_ADDR + blk_addr));
                  buf[i+1]=(*((vu32*)(FLASH_START_ADDR + blk_addr)))>>8;
                  buf[i+2]=(*((vu32*)(FLASH_START_ADDR + blk_addr)))>>16;
                  buf[i+3]=(*((vu32*)(FLASH_START_ADDR + blk_addr)))>>24;
    }
                return 0;
        }
        return 1;
        //blk_addr+=1536;
  //SPI_FLASH_BufferRead((uint8_t *)buf, blk_addr<<12, blk_len<<12);       
}


int8_t STORAGE_Write (uint8_t lun,
                  uint8_t *buf,
                  uint32_t blk_addr,
                  uint32_t blk_len)
{
        uint32_t i;
        uint32_t pbuff;
        if(lun==0)
        {
                for(i=0; i<blk_len;i+=FLASH_PAGE_SIZE)
          {
      if(FLASH_WaitForLastOperation()==FLASH_COMPLETE)
                  {
        FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR);
      }
                  FLASH_EraseSector(FLASH_START_ADDR + blk_addr + i,VoltageRange_3);
    }
                for(i=0;i<blk_len;i+=4)
          {
      if(FLASH_WaitForLastOperation()==FLASH_COMPLETE)
                  {
        FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR);
      }
                  pbuff=((uint32_t)buf[i+3]<<24)+((uint32_t)buf[i+2]<<16)+((uint32_t)buf[i+1]<<8)+((uint32_t)buf[i+1]);
                  FLASH_ProgramWord(FLASH_START_ADDR + blk_addr + i, pbuff);
    }
                return (0);
        }
        return 1;

        //blk_addr+=1536;
  //SPI_FLASH_SectorErase(blk_addr<<12);
        //SPI_FLASH_BufferWrite((uint8_t *)buf,blk_addr<< 12,blk_len<<12);       

}






回复

使用道具 举报

 楼主| 发表于 2018-8-31 15:35:07 | 显示全部楼层
@flyleaf 帮忙指点下,谢谢!!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-31 15:38:07 | 显示全部楼层
@fire 火哥,劳烦抽时间指点下
回复 支持 反对

使用道具 举报

发表于 2018-8-31 15:51:32 | 显示全部楼层
你对内部flash的操作没有解锁吧
回复 支持 反对

使用道具 举报

发表于 2018-8-31 15:52:26 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-31 16:06:59 | 显示全部楼层
flyleaf 发表于 2018-8-31 15:51
你对内部flash的操作没有解锁吧

初始化的时候解锁了,代码如下:int8_t STORAGE_Init (uint8_t lun)
{
  //return SPI_FLASH_Init();
        FLASH_Unlock();
        return 0;
}
在电脑上插上U盘之后显示"可移动磁盘",但是双击后弹出对话框“请讲磁盘插"可移动磁盘(F"””
image004.jpg
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-31 16:10:13 | 显示全部楼层
flyleaf 发表于 2018-8-31 15:52
参考一下这个帖子:https://blog.csdn.net/u011318735/article/details/17426491

这个帖子我看过了,我在F103VET6上面按照此贴的方法也实现了内部flash模拟U盘,但是现在用F429IGT6不晓得是哪里出错了
回复 支持 反对

使用道具 举报

发表于 2018-8-31 16:18:21 | 显示全部楼层
参考下野火的读写内部FLASH例程来写入数据,感觉你这个地址可能有问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-31 16:21:35 | 显示全部楼层
黎月天 发表于 2018-8-31 16:18
参考下野火的读写内部FLASH例程来写入数据,感觉你这个地址可能有问题

好的,我看看,多谢!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-6 15:14:30 | 显示全部楼层
flyleaf 发表于 2018-8-31 15:51
你对内部flash的操作没有解锁吧

是不是因为我用的429内部flash的扇区太大啊?一个扇区128K呢。
我把程序中的扇区大小改成2K,插上U盘,可以识别USB设备,但是无法格式化,再改成128K扇区,直接提示“请将磁盘插入“可移动磁盘””。是不是因为128K的扇区已经超过了USB驱动程序支持的格式化扇区啊?
修改USB驱动程序的格式化函数是否可行?还请前辈帮忙分析下,谢谢。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-6 16:03:23 | 显示全部楼层
flyleaf 发表于 2018-8-31 15:52
参考一下这个帖子:https://blog.csdn.net/u011318735/article/details/17426491

我刚用429IGT6内部SRAM测试了下,设定了几种扇区大小:(1)扇区512字节,200个扇区;(2)扇区1K,100个扇区;(3)扇区2K,50个扇区;(4)扇区4K,20个扇区;(5)扇区8K,10个扇区。5种情况均下载测试,只有(1)~(4)可以正常模拟U盘功能,第(5)种情况下,跟6楼的图片一样,插入之后双击就是“请将磁盘插入“可移动硬盘(F)””。。。这是不是就可以初步认为是USB设备格式化最大支持4K的扇区操作???
请前辈抽时间指导下
回复 支持 反对

使用道具 举报

发表于 2018-9-6 16:10:28 | 显示全部楼层
chenbao 发表于 2018-9-6 16:03
我刚用429IGT6内部SRAM测试了下,设定了几种扇区大小:(1)扇区512字节,200个扇区;(2)扇区1K,100个 ...

这么说来应该受文件系统中的配置影响,文件系统ff_conf.h文件有个配置是扇区大小的,一般是512~4K,128K确实有点大,SRAM的空间都不太够了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-6 16:36:03 | 显示全部楼层
flyleaf 发表于 2018-9-6 16:10
这么说来应该受文件系统中的配置影响,文件系统ff_conf.h文件有个配置是扇区大小的,一般是512~4K,128K确 ...

那是不是修改下文件系统的配置,就可以勉强实现了?具体要修改哪里啊?我在429例程“USB外部flash模拟U盘”里面没看到ff_conf.h文件啊?
回复 支持 反对

使用道具 举报

发表于 2018-9-6 17:58:16 | 显示全部楼层
chenbao 发表于 2018-9-6 16:36
那是不是修改下文件系统的配置,就可以勉强实现了?具体要修改哪里啊?我在429例程“USB外部flash模拟U盘 ...

哦,我记错了,当usb主设备读取外部U盘才有这个文件。
也不知道是不是windows不支持128kB这么大
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-7 16:51:07 | 显示全部楼层
flyleaf 发表于 2018-9-6 17:58
哦,我记错了,当usb主设备读取外部U盘才有这个文件。
也不知道是不是windows不支持128kB这么大

我在429例程“USB—外部FLASH模拟U盘”中的"usb_conf.h"文件将第70行“#define MSC_MEDIA_PACKET    4096”的4096改大一些,如0x2000、0x4000、0x8000、0x20000等,并修改了与MSC_MEDIA_PACKET相关的一些变量类型,但最终结果还是老样子,只要将U盘扇区大小设置超过4K,就出现无法格式化现象。。。

是不是除了修改“#define MSC_MEDIA_PACKET    4096”外,还需要修改其他与功能函数啊?哎。。。愁死了,快没信心了,,,
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-5 09:42 , Processed in 0.043332 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表