【嵌入式】STM32使用内部FLASH模拟U盘

【PeidzzZ原创,转载请说明出处:https://www.jianshu.com/p/96cff6b9ce42】

准备工作

  1. 带有芯片STM32F103RCT6最小系统板一块
  2. Windows 系统(本例为WIN7)
  3. STM32cubeMX软件
  4. MDK-ARM软件

开始配置

  • 选择芯片型号


    芯片选择界面
  • 设置Debug工具,不选择的话将无法直接使用stlink烧写程序。


    选择Serial Wire
  • 选择外部晶振


    外部晶振
  • 配置USB引脚


    配置USB引脚
  • 开启USB device


    选择Mass Storage Class
  • 配置时钟,必须要设置USB设备时钟为48MHz


    时钟树配置
  • 工程选项和堆栈配置,堆栈要修改,不然无法启动


    工程配置
  • 点击GENERATE CODE,生成代码。
  • 打开MDK-ARM中的工程文件。
  • 打开Application/User目录下的usbd_storage_if.c文件,修改及添加:
/** @defgroup USBD_STORAGE_Private_Defines
  * @brief Private defines.
  * @{
  */

#define STORAGE_LUN_NBR  1
#define STORAGE_BLK_NBR  80    // 模拟80个扇区
#define STORAGE_BLK_SIZ  0x200 // 每个扇区512B

/* USER CODE BEGIN PRIVATE_DEFINES */
uint8_t msc_data[STORAGE_BLK_NBR][STORAGE_BLK_SIZ] = {0};   // 总容量为40KB
/* USER CODE END PRIVATE_DEFINES */

/**
  * @}
  */
  • 为STORAGE_Read_FS()及STORAGE_Write_FS()添加代码,它们是对msc_data数组的读写,且规则和SD卡一样,按照512字节为一扇区进行读写:
int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
  /* USER CODE BEGIN 6 */
  uint32_t n, i;
  for (n = 0;n < blk_len;n++) {
    for (i = 0;i < STORAGE_BLK_SIZ;i++) {
      buf[n * STORAGE_BLK_SIZ + i] = msc_data[blk_addr + n][i];
    }
  }
  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 */
  uint32_t n, i;
  for (n = 0;n < blk_len;n++) {
    for (i = 0;i < STORAGE_BLK_SIZ;i++) {
      msc_data[blk_addr + n][i] = buf[n * STORAGE_BLK_SIZ + i];
    }
  }
  return (USBD_OK);
  /* USER CODE END 7 */
}
  • 编译后下载,通过USB直接连接电脑。在“我的电脑”中可以看到“可移动磁盘”,但无法使用,提示需要进行格式化。格式化前需要勾选快速格式化。成功后,即可看到有容量的“可移动磁盘”:


    可移动磁盘
  • 注意事项

  1. 设置STORAGE_BLK_NBR时,需要合理规划内存大小,如设置过大,则会出现编译错误。


    超出容量报错

你可能感兴趣的:(【嵌入式】STM32使用内部FLASH模拟U盘)