数码之家

 找回密码
 立即注册
搜索
查看: 6309|回复: 46

[ARM] 一直想把STM32的内部FLASH做成个小U盘,参考了不少,一直不成功

[复制链接]
发表于 2020-4-21 01:49:24 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一直想把STM32的内部FLASH做成个小U盘,参考了不少,一直不成功
参考的例程是
发现
1.F103ZET6可以,但64K的C8T6不行,不知道要修改哪个头文件里的东西?块?扇区?
2.我只想要内置FLASH的U盘,程序里是可以外置卡的,关掉所有的SD-SPI后居然内置U盘都出不来
#define     FLASH_START_ADDR        0x08016000    // Flash start address
#define     FLASH_SIZE              0x64000            // 400K ?U?
#define     FLASH_PAGE_SIZE         0x800         // 2k Bytes per page,??2K?????
#define     FLASH_WAIT_TIMEOUT      100000

3.看代码,里面都没有相关STM32FLASH的调用,是不是外置中断
USB_Interrupts_Config这个调用帮我们去完成读写,真看不懂,如果真是这样,如何控制读写动作和数量

本帖被以下淘专辑推荐:

  • · MCU|主题: 24, 订阅: 19
发表于 2020-4-21 09:40:36 来自手机浏览器 | 显示全部楼层
插眼同问,最近也在研究STM32的USB。等大神回答了学习学习
回复 支持 反对

使用道具 举报

发表于 2020-4-21 13:30:08 | 显示全部楼层
本帖最后由 bg4uvr 于 2020-4-21 16:09 编辑

#define FLASH_START_ADDR    0x08018000 // U盘存在的FLASH中的起始地址,请注意下面的说明
#define FLASH_SIZE             0x8000           // 32K 的U盘 #define FLASH_PAGE_SIZE     0x400           // 1k Bytes per page,  如果是stm32f103c8t6,那么只有设置成1KB才能格式化
#define FLASH_WAIT_TIMEOUT  100000



刚才忘记说了,现在特别提醒注意一下:早期的stm32f103c8t6,内部实际是有128KB的FLASH的,
所以这个起始地址我设置成了96KB处开始(0x08018000),共32KB,格式化后fat系统自已占
用了20KB,所有实际只剩12KB可用。


新版的stm32f103c8t6,已经显示为64KB的容量了,但我以前测试过,内部实际还是有后64KB的,
可以被U盘使用,但程序的代码是无法下载到后64KB的。


由于版本不同,也许会出现不同的情况,请注意区别对待,修改起始地址为合理的区间。

回复 支持 1 反对 0

使用道具 举报

发表于 2020-4-21 13:32:59 | 显示全部楼层
我是看这个帖子在stm32f103c8t6上测试成功的

https://blog.csdn.net/u011318735/article/details/17426491
回复 支持 反对

使用道具 举报

发表于 2020-4-21 14:26:09 | 显示全部楼层
原作者那个代码排版乱了,我重排了一下:

  1. #include "mass_mal.h"

  2. #define FLASH_START_ADDR 0x08016000                // Flash start address
  3. #define FLASH_SIZE 0x64000                                // 400K 的U盘
  4. #define FLASH_PAGE_SIZE 0x800                        // 2k Bytes per page,只有2K才能格式化
  5. #define FLASH_WAIT_TIMEOUT 100000

  6. /* Private typedef -----------------------------------------------------------*/
  7. /* Private define ------------------------------------------------------------*/
  8. /* Private macro -------------------------------------------------------------*/
  9. /* Private variables ---------------------------------------------------------*/

  10. uint32_t Mass_Memory_Size[2];
  11. uint32_t Mass_Block_Size[2];
  12. uint32_t Mass_Block_Count[2];
  13. __IO uint32_t Status = 0;

  14. /* Private function prototypes -----------------------------------------------*/
  15. /* Private functions ---------------------------------------------------------*/

  16. /*******************************************************************************
  17. * Function Name : MAL_Init * Description : 初始化STM32的媒体设备
  18. * Input : lun
  19. * Output : None
  20. * Return : None
  21. *******************************************************************************/
  22. uint16_t MAL_Init(uint8_t lun)
  23. {
  24.         u16 status = MAL_OK;
  25.         switch (lun)
  26.         {
  27.         case 0:
  28.                 FLASH_Unlock();
  29.                 break;
  30.         default:
  31.                 return MAL_FAIL;
  32.         }
  33.         return status;
  34. }

  35. /*******************************************************************************
  36. * Function Name : MAL_Write * Description : 写扇区 * Input : None * Output : None
  37. * Return : None
  38. *******************************************************************************/
  39. uint16_t MAL_Write(uint8_t lun, uint32_t Memory_Offset, uint32_t *Writebuff, uint16_t Transfer_Length)
  40. {
  41.         uint16_t i;
  42.         switch (lun)
  43.         {
  44.         case 0:
  45.                 for(i=0; i<Transfer_Length; i+=FLASH_PAGE_SIZE)
  46.                 {
  47.                         if(FLASH_WaitForLastOperation(FLASH_WAIT_TIMEOUT)!=FLASH_TIMEOUT)
  48.                         {
  49.                                 FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);
  50.                         }
  51.                         FLASH_ErasePage(FLASH_START_ADDR + Memory_Offset + i);
  52.                 }
  53.                 for(i=0; i<Transfer_Length; i+=4)
  54.                 {
  55.                         if(FLASH_WaitForLastOperation(FLASH_WAIT_TIMEOUT)!=FLASH_TIMEOUT)
  56.                         {
  57.                                 FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_PGERR| FLASH_FLAG_WRPRTERR);
  58.                         }
  59.                         FLASH_ProgramWord(FLASH_START_ADDR + Memory_Offset + i , Writebuff[i>>2]);
  60.                 }
  61.                 break;
  62.         default:
  63.                 return MAL_FAIL;
  64.         }
  65.         return MAL_OK;
  66. }

  67. /*******************************************************************************
  68. * Function Name : MAL_Read
  69. * Description : 读取扇区
  70. * Input : None
  71. * Output : None
  72. * Return : Buffer pointer
  73. *******************************************************************************/
  74. uint16_t MAL_Read(uint8_t lun, uint32_t Memory_Offset, uint32_t *Readbuff, uint16_t Transfer_Length)
  75. {
  76.         uint16_t i;
  77.         switch (lun)
  78.         {
  79.         case 0:
  80.                 for(i=0; i<Transfer_Length; i+=4)
  81.                 {
  82.                         Readbuff[i>>2] = ((vu32*)(FLASH_START_ADDR + Memory_Offset))[i>>2];
  83.                 }
  84.                 break;
  85.         default:
  86.                 return MAL_FAIL;
  87.         }
  88.         return MAL_OK;
  89. }

  90. /*******************************************************************************
  91. * Function Name : MAL_GetStatus
  92. * Description : 获取状态
  93. * Input : None * Output : None
  94. * Return : None
  95. *******************************************************************************/
  96. uint16_t MAL_GetStatus (uint8_t lun)
  97. {
  98.         if (lun == 0)
  99.         {
  100.                 Mass_Block_Count[0] = FLASH_SIZE/FLASH_PAGE_SIZE;
  101.                 Mass_Block_Size[0] = FLASH_PAGE_SIZE;
  102.                 Mass_Memory_Size[0] = FLASH_SIZE;
  103.                 LED2_ON();
  104.                 return MAL_OK;
  105.         }
  106.         LED2_OFF();

  107.         return MAL_FAIL;
  108. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2020-4-21 16:31:11 | 显示全部楼层
本帖最后由 bg4uvr 于 2020-4-22 15:33 编辑

我原来的代码是embitz环境的,现在电脑上只有stm32cubeIDE环境,说可能说不清楚,我干脆给你现做了一个例子,请参考:lol:

https://gitee.com/bg4uvr/stm32_usb_mass_hal
把工程直接上传了吧,方便没有gitee账号的朋友。(但以后版本更新只在gitee上更新,这里不会同步更新)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

发表于 2020-4-22 10:38:43 | 显示全部楼层
枚举成功了吗,再就是zet6是大容量,和c8t6的扇区大小是不一样的,这块肯定要改,具体区别看手册吧,我也忘了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-26 00:38:46 | 显示全部楼层
谢谢,我看不懂CLUB的,hal的,初学者:lol:
回复 支持 反对

使用道具 举报

发表于 2020-4-26 12:52:29 来自手机浏览器 | 显示全部楼层
13580445117 发表于 2020-4-26 00:38
谢谢,我看不懂CLUB的,hal的,初学者

初学者更建议用HAL库学,移植性比较好。至于cube mx,其实更简单,有学std库的精力,用来学hal和MX的使用足够了,这些并没有更难。std库官方已经不更新了,官方现在力推hal库,还有stm32cubeIDE是免费的,不需要D版的MDK,心里也舒服很多
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-26 15:47:33 | 显示全部楼层
bg4uvr 发表于 2020-4-26 12:52
初学者更建议用HAL库学,移植性比较好。至于cube mx,其实更简单,有学std库的精力,用来学hal和MX的使用 ...

现在有点急用,我的MDK也是两分水,不到半桶:titter:,还望多指教
回复 支持 反对

使用道具 举报

发表于 2020-4-26 16:31:12 来自手机浏览器 | 显示全部楼层
13580445117 发表于 2020-4-26 15:47
现在有点急用,我的MDK也是两分水,不到半桶,还望多指教

用MDK,你照我前面的帖子把参数改了就行
回复 支持 反对

使用道具 举报

发表于 2020-4-26 16:38:35 来自手机浏览器 | 显示全部楼层
13580445117 发表于 2020-4-26 15:47
现在有点急用,我的MDK也是两分水,不到半桶,还望多指教

#define FLASH_START_ADDR    0x08010000
#define FLASH_SIZE             0x10000
#define FLASH_PAGE_SIZE     0x400
#define FLASH_WAIT_TIMEOUT  100000

这样是用后64KB做一个64KB的U盘,格式化后大约有42KB可用。那个0x400必须是这个值,不能改。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-26 22:40:07 | 显示全部楼层
我是64KFLASH,
#define FLASH_START_ADDR    0x08010000
不应该在这,0x08004000   从16k开始吧,创建一个40K的?然后FAT表要占20K?剩下20k?
回复 支持 反对

使用道具 举报

发表于 2020-4-27 13:03:39 | 显示全部楼层
13580445117 发表于 2020-4-26 22:40
我是64KFLASH,
#define FLASH_START_ADDR    0x08010000
不应该在这,0x08004000   从16k开始吧,创建一个 ...

stm32f103c8t6,实际是有128KB的:lol:

如果从16KB开始,那么你的代码长度要小于16KB才可以哟
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-27 17:38:30 | 显示全部楼层
是的,我的代码比较小,看了BIN,只有十几K,然后我查了FAT文件表,只有1-2K吧,所以,我U盘设置为40K,应该还有三十多K可以用吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-27 17:39:54 | 显示全部楼层
bg4uvr 发表于 2020-4-21 13:30
#define FLASH_START_ADDR    0x08018000 // U盘存在的FLASH中的起始地址,请注意下面的说明
#define FLASH ...

FAT系统不应该占这么大吧,就就一两K
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-27 17:42:24 | 显示全部楼层
还有,这是虚拟的U盘,我刚看了网上的一些高手说,这个可以自己设置多大都行,用的是PC机的内存,只是在写入的时候就要确定写入的准确位置和文件大小
回复 支持 反对

使用道具 举报

发表于 2020-4-27 19:28:41 来自手机浏览器 | 显示全部楼层
13580445117 发表于 2020-4-27 17:42
还有,这是虚拟的U盘,我刚看了网上的一些高手说,这个可以自己设置多大都行,用的是PC机的内存,只是在写 ...

分区表、FAT表、根目录都会占用空间,20KB是是我实际测试的结果(这应该还只是FAT12的情况下,如果FAT16或FAT32应该消耗更多)。
如果不打算正确写入和读出数据,参数当然可以随便写,但好像没啥意义了哈~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-28 22:13:52 | 显示全部楼层
bg4uvr 发表于 2020-4-27 19:28
分区表、FAT表、根目录都会占用空间,20KB是是我实际测试的结果(这应该还只是FAT12的情况下,如果FAT16 ...

#define     FLASH_START_ADDR        0x0800800    // 从2K 开始   Flash start address
#define     FLASH_SIZE              0xa000            // 40K
#define     FLASH_PAGE_SIZE         0x400         // 2k Bytes per page,??2K?????
#define     FLASH_WAIT_TIMEOUT      100000
我修改成上面的,但显示末知USB设备
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-28 22:23:56 | 显示全部楼层
#define     FLASH_START_ADDR        0x0800800    // Flash start address
#define     FLASH_SIZE              0xa000            // 400K ?U?
#define     FLASH_PAGE_SIZE         0x400         // 2k Bytes per page,??2K?????
#define     FLASH_WAIT_TIMEOUT      100000

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
uint32_t Mass_Memory_Size[1];//-------修改为2不行
uint32_t Mass_Block_Size[1];//-------修改为2不行
uint32_t Mass_Block_Count[1];//-------修改为2不行
__IO uint32_t Status = 0;
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-5 19:27 , Processed in 0.156001 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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