OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8542|回复: 7

STM32F411内部flash做U盘,能够看到设备,但无法格式化

[复制链接]

1

主题

6

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2019-8-14
在线时间
7 小时
发表于 2019-8-14 11:42:36 | 显示全部楼层 |阅读模式
需求是通过串口获取数据,存入Flash,然后连接usb,通过电脑可以看到对应的文件。我想着分为两步实现:
1、插上usb,可以看到U盘,暂定100kb吧。
2、针对内部Flash挂载Fatfs。
工程通过CubeMX来生成。

选择晶振

选择晶振
2.jpg
3.jpg
4.jpg
5.jpg

配置基本按照网上的资料来做的,生成代码。

下面就是在usbd_storage_if.c修改。
下面贴出主要代码。
1、一些宏定义,STORAGE_BLK_NBR 这个修改为了200,其他都是官方例子里面截取的。
  1. #define STORAGE_LUN_NBR 1
  2. //#define STORAGE_BLK_NBR 0x10000
  3. #define STORAGE_BLK_NBR 200
  4. #define STORAGE_BLK_SIZ 0x200

  5. /* USER CODE BEGIN PRIVATE_DEFINES */
  6. #define ADDR_FLASH_SECTOR_0     ((uint32_t)0x08000000) /* Base [url=home.php?mod=space&uid=95564]@[/url] of Sector 0, 16 Kbytes */
  7. #define ADDR_FLASH_SECTOR_1     ((uint32_t)0x08004000) /* Base @ of Sector 1, 16 Kbytes */
  8. #define ADDR_FLASH_SECTOR_2     ((uint32_t)0x08008000) /* Base @ of Sector 2, 16 Kbytes */
  9. #define ADDR_FLASH_SECTOR_3     ((uint32_t)0x0800C000) /* Base @ of Sector 3, 16 Kbytes */
  10. #define ADDR_FLASH_SECTOR_4     ((uint32_t)0x08010000) /* Base @ of Sector 4, 64 Kbytes */
  11. #define ADDR_FLASH_SECTOR_5     ((uint32_t)0x08020000) /* Base @ of Sector 5, 128 Kbytes */
  12. #define ADDR_FLASH_SECTOR_6     ((uint32_t)0x08040000) /* Base @ of Sector 6, 128 Kbytes */
  13. #define ADDR_FLASH_SECTOR_7     ((uint32_t)0x08060000) /* Base @ of Sector 7, 128 Kbytes */
  14. #define FLASH_USER_START_ADDR   ADDR_FLASH_SECTOR_7   /* Start @ of user Flash area */
复制代码
2、添加一个函数,来自官方例子。
  1. /**
  2.   * @brief  Gets the sector of a given address
  3.   * @param  None
  4.   * @retval The sector of a given address
  5.   */
  6. static uint32_t GetSector(uint32_t Address)
  7. {
  8.   uint32_t sector = 0;
  9.   
  10.   if((Address < ADDR_FLASH_SECTOR_1) && (Address >= ADDR_FLASH_SECTOR_0))
  11.   {
  12.     sector = FLASH_SECTOR_0;  
  13.   }
  14.   else if((Address < ADDR_FLASH_SECTOR_2) && (Address >= ADDR_FLASH_SECTOR_1))
  15.   {
  16.     sector = FLASH_SECTOR_1;  
  17.   }
  18.   else if((Address < ADDR_FLASH_SECTOR_3) && (Address >= ADDR_FLASH_SECTOR_2))
  19.   {
  20.     sector = FLASH_SECTOR_2;  
  21.   }
  22.   else if((Address < ADDR_FLASH_SECTOR_4) && (Address >= ADDR_FLASH_SECTOR_3))
  23.   {
  24.     sector = FLASH_SECTOR_3;  
  25.   }
  26.   else if((Address < ADDR_FLASH_SECTOR_5) && (Address >= ADDR_FLASH_SECTOR_4))
  27.   {
  28.     sector = FLASH_SECTOR_4;  
  29.   }
  30.   else if((Address < ADDR_FLASH_SECTOR_6) && (Address >= ADDR_FLASH_SECTOR_5))
  31.   {
  32.     sector = FLASH_SECTOR_5;  
  33.   }
  34.   else if((Address < ADDR_FLASH_SECTOR_7) && (Address >= ADDR_FLASH_SECTOR_6))
  35.   {
  36.     sector = FLASH_SECTOR_6;  
  37.   }
  38.   else/*(Address < FLASH_END_ADDR) && (Address >= ADDR_FLASH_SECTOR_7))*/
  39.   {
  40.     sector = FLASH_SECTOR_7;
  41.   }
  42.   return sector;
  43. }
复制代码
3、修改STORAGE_Read_FS函数。
  1. int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
  2. {
  3.   /* USER CODE BEGIN 6 */
  4. if(lun == 0)
  5. {
  6.     memcpy(buf,(uint8_t *)(FLASH_USER_START_ADDR + blk_addr), blk_len * STORAGE_BLK_SIZ);
  7.     return USBD_OK;
  8.   }
  9.   return USBD_FAIL;
  10.   /* USER CODE END 6 */
  11. }
复制代码
4、修改STORAGE_Write_FS函数。

  1. int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
  2. {
  3.   /* USER CODE BEGIN 7 */
  4.     if(lun == 0)
  5.     {
  6.         uint16_t i;
  7.         uint32_t FirstSector = 0, NbOfSectors = 0;
  8.         HAL_FLASH_Unlock();
  9.         /* Get the 1st sector to erase */
  10.         FirstSector = GetSector(FLASH_USER_START_ADDR + blk_addr);
  11.         /* Get the number of sector to erase from 1st sector*/
  12.         NbOfSectors = GetSector(FLASH_USER_START_ADDR + blk_addr + blk_len*FLASH_PAGE_SIZE) - FirstSector + 1;

  13.         FLASH_EraseInitTypeDef f;
  14.         f.TypeErase = FLASH_TYPEERASE_SECTORS;
  15.         f.VoltageRange = FLASH_VOLTAGE_RANGE_3;
  16.         f.Sector = FirstSector;
  17.         f.NbSectors = NbOfSectors;
  18.         
  19.         uint32_t PageError = 0;
  20.         HAL_FLASHEx_Erase(&f, &PageError);

  21.         for(i=0;  i< blk_len*FLASH_PAGE_SIZE; i+=4)
  22.         {
  23.             //HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, FLASH_USER_START_ADDR + blk_addr + i, *(uint32_t *)(&buf[i]));
  24.             HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, FLASH_USER_START_ADDR + blk_addr + i, *(uint32_t *)(buf+i));
  25.         }

  26.         HAL_FLASH_Lock();
  27.         return USBD_OK;
  28.     }
  29.     return USBD_FAIL;
  30.   /* USER CODE END 7 */
  31. }
复制代码
5、下载 到板子,插上usb,果然出现了新设备,还有提示格式化。
6.jpg
6、默认参数进行格式化。
7.jpg
8.jpg
7、果然失败了,好无奈。
9.jpg

第一次做flash、usb的东西,挂载fatfs应该也会遇到不少麻烦。
请各位前辈不吝赐教,问题到底出在哪里。
是配置错了,还是函数用错了,还是参数传错了,还是地址写错了。
多谢各位大神帮忙。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2019-8-14
在线时间
7 小时
 楼主| 发表于 2019-8-14 16:34:43 | 显示全部楼层
没人遇到过吗?搞了两天了,一点头绪都没有
回复 支持 反对

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7462
金钱
7462
注册时间
2015-1-15
在线时间
1367 小时
发表于 2019-8-14 19:49:56 | 显示全部楼层
可以先确认读写数据是否没有问题
一分耕耘一分收获。
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2019-8-14
在线时间
7 小时
 楼主| 发表于 2019-8-15 09:44:26 | 显示全部楼层
yklstudent 发表于 2019-8-14 19:49
可以先确认读写数据是否没有问题

感谢回复,单独的flash读写都有试过,擦除再写入也没有问题的。
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2019-8-14
在线时间
7 小时
 楼主| 发表于 2019-8-15 13:46:53 | 显示全部楼层
自己顶一下,感觉要沉了,可能这个做法太冷门了吧
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2019-8-14
在线时间
7 小时
 楼主| 发表于 2019-8-19 10:05:56 | 显示全部楼层
有没有大神来看看啊
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2019-7-22
在线时间
7 小时
发表于 2020-2-17 17:20:56 | 显示全部楼层
我也遇到这个问题 楼主解决可以分享一下吗
回复 支持 反对

使用道具 举报

5

主题

133

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1782
金钱
1782
注册时间
2015-3-13
在线时间
271 小时
发表于 2022-12-12 16:11:30 | 显示全部楼层
楼主的问题解决了没? 我也是USB读卡器提示需要格式化
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 23:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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