当前位置: 首页 > news >正文

STM32F103C8T6 HAL库 U盘模式(MSC)

前言

简简单单,将手中的单品集模拟成U盘,中间经历过很多坑,也算是摸索透了,记录一下开发,防止发生相同的问题。

正文

1.选择芯片

2.正常配置调试和外部时钟(sys->serial wirte,  rcc->hse->crystal)

3.打开usb

4.选择USB模式,packet = 1024,

5.配置时钟(打开USB会报错,关掉重新手动配置就好了)

6.生成工程

7.添加代码,只需要修改这一个文件就可以了,

8.参数含义

//这三个参数需要根据flash分配,整个flash除了程序外就是U盘大小

程序在0x08000000地址,但是存储不能从这个地址开始,需要后移0x5000(根据程序大小配置,不不能出现半个block的情况,整数就行了)

9.设置识别的参数,我重新定义了2个参数,也可以修改原来的大小。FLASH_PAGE_SIZE直接用就行

10.读取方法,这个让电脑可以读取U盘的相关信息,这个时候可以识别到U盘。用memcpy的方法,将目标内容复制到buf内

11.写入方法,网上都是直接使用memcpy复制的方法直接反向复制,但是我这会出现问题,在最后格式化U盘的时候会出现无法格式化U盘(怀疑是flash锁造成的);我这里使用对内部flash的读写的方法

12.直接编译,下载到STM内,如果识别不到则重新插入电脑。

13.格式化U盘,然后就可以正常使用

代码

直接全部复制过来,不想自己手动敲(累),就上面那几个地方,其他没变。

/* USER CODE BEGIN Header */
/********************************************************************************* @file           : usbd_storage_if.c* @version        : v2.0_Cube* @brief          : Memory management layer.******************************************************************************* @attention** <h2><center>&copy; Copyright (c) 2025 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under Ultimate Liberty license* SLA0044, the "License"; You may not use this file except in compliance with* the License. You may obtain a copy of the License at:*                             www.st.com/SLA0044********************************************************************************/
/* USER CODE END Header *//* Includes ------------------------------------------------------------------*/
#include "usbd_storage_if.h"/* USER CODE BEGIN INCLUDE *//* USER CODE END INCLUDE *//* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*//* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*//* USER CODE END PV *//** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY* @brief Usb device.* @{*//** @defgroup USBD_STORAGE* @brief Usb mass storage device module* @{*//** @defgroup USBD_STORAGE_Private_TypesDefinitions* @brief Private types.* @{*//* USER CODE BEGIN PRIVATE_TYPES *//* USER CODE END PRIVATE_TYPES *//*** @}*//** @defgroup USBD_STORAGE_Private_Defines* @brief Private defines.* @{*/#define STORAGE_LUN_NBR                  1
#define STORAGE_BLK_NBR                  0x10000
#define STORAGE_BLK_SIZ                  0x200/* USER CODE BEGIN PRIVATE_DEFINES */
#define  FLASH_START_ADDR                0x08005000
#define  FLASH_PAGE_NBR                  48/* USER CODE END PRIVATE_DEFINES *//*** @}*//** @defgroup USBD_STORAGE_Private_Macros* @brief Private macros.* @{*//* USER CODE BEGIN PRIVATE_MACRO *//* USER CODE END PRIVATE_MACRO *//*** @}*//** @defgroup USBD_STORAGE_Private_Variables* @brief Private variables.* @{*//* USER CODE BEGIN INQUIRY_DATA_FS */
/** USB Mass storage Standard Inquiry Data. */
const int8_t STORAGE_Inquirydata_FS[] = {/* 36 *//* LUN 0 */0x00,0x80,0x02,0x02,(STANDARD_INQUIRY_DATA_LEN - 5),0x00,0x00,0x00,'S', 'T', 'M', ' ', ' ', ' ', ' ', ' ', /* Manufacturer : 8 bytes */'P', 'r', 'o', 'd', 'u', 'c', 't', ' ', /* Product      : 16 Bytes */' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ','0', '.', '0' ,'1'                      /* Version      : 4 Bytes */
};
/* USER CODE END INQUIRY_DATA_FS *//* USER CODE BEGIN PRIVATE_VARIABLES *//* USER CODE END PRIVATE_VARIABLES *//*** @}*//** @defgroup USBD_STORAGE_Exported_Variables* @brief Public variables.* @{*/extern USBD_HandleTypeDef hUsbDeviceFS;/* USER CODE BEGIN EXPORTED_VARIABLES *//* USER CODE END EXPORTED_VARIABLES *//*** @}*//** @defgroup USBD_STORAGE_Private_FunctionPrototypes* @brief Private functions declaration.* @{*/static int8_t STORAGE_Init_FS(uint8_t lun);
static int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size);
static int8_t STORAGE_IsReady_FS(uint8_t lun);
static int8_t STORAGE_IsWriteProtected_FS(uint8_t lun);
static int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
static int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
static int8_t STORAGE_GetMaxLun_FS(void);/* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION *//* USER CODE END PRIVATE_FUNCTIONS_DECLARATION *//*** @}*/USBD_StorageTypeDef USBD_Storage_Interface_fops_FS =
{STORAGE_Init_FS,STORAGE_GetCapacity_FS,STORAGE_IsReady_FS,STORAGE_IsWriteProtected_FS,STORAGE_Read_FS,STORAGE_Write_FS,STORAGE_GetMaxLun_FS,(int8_t *)STORAGE_Inquirydata_FS
};/* Private functions ---------------------------------------------------------*/
/*** @brief  Initializes over USB FS IP* @param  lun:* @retval USBD_OK if all operations are OK else USBD_FAIL*/
int8_t STORAGE_Init_FS(uint8_t lun)
{/* USER CODE BEGIN 2 */return (USBD_OK);/* USER CODE END 2 */
}/*** @brief  .* @param  lun: .* @param  block_num: .* @param  block_size: .* @retval USBD_OK if all operations are OK else USBD_FAIL*/
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  = FLASH_PAGE_NBR;*block_size = FLASH_PAGE_SIZE;return (USBD_OK);/* USER CODE END 3 */
}/*** @brief  .* @param  lun: .* @retval USBD_OK if all operations are OK else USBD_FAIL*/
int8_t STORAGE_IsReady_FS(uint8_t lun)
{/* USER CODE BEGIN 4 */return (USBD_OK);/* USER CODE END 4 */
}/*** @brief  .* @param  lun: .* @retval USBD_OK if all operations are OK else USBD_FAIL*/
int8_t STORAGE_IsWriteProtected_FS(uint8_t lun)
{/* USER CODE BEGIN 5 */return (USBD_OK);/* USER CODE END 5 */
}/*** @brief  .* @param  lun: .* @retval USBD_OK if all operations are OK else USBD_FAIL*/
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){memcpy(buf,(uint8_t *)(FLASH_START_ADDR +blk_addr*FLASH_PAGE_SIZE),blk_len*FLASH_PAGE_SIZE);return (USBD_OK);}return (USBD_OK);/* USER CODE END 6 */
}/*** @brief  .* @param  lun: .* @retval USBD_OK if all operations are OK else USBD_FAIL*/
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){uint16_t i;HAL_FLASH_Unlock();FLASH_EraseInitTypeDef f;f.TypeErase = FLASH_TYPEERASE_PAGES;f.PageAddress = FLASH_START_ADDR + blk_addr*FLASH_PAGE_SIZE;f.NbPages = blk_len;uint32_t pageError = 0;HAL_FLASHEx_Erase(&f,&pageError);for(i=0;i<blk_len*FLASH_PAGE_SIZE;i+=4)HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,FLASH_START_ADDR+blk_addr*FLASH_PAGE_SIZE+i,*(uint32_t *)(&buf[i]));HAL_FLASH_Lock();return USBD_OK;}return (USBD_OK);/* USER CODE END 7 */
}/*** @brief  .* @param  None* @retval .*/
int8_t STORAGE_GetMaxLun_FS(void)
{/* USER CODE BEGIN 8 */return (STORAGE_LUN_NBR - 1);/* USER CODE END 8 */
}/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION *//* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION *//*** @}*//*** @}*//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

问题

1.插入识别U盘,但是打开或者读写文件异常慢:packet值不合理,导致变慢,可以修改成512 1024 4096尝试。正常就是page size

2.程序没反应,没有reset,或者重新插入。

3.格式化后出现无法格式化,或者等待好久没有反应,一直在转圈圈

这个是个大问题,卡了我好几天,主要是write方法有问题,像原来使用memcpy就会这样;

或者没有偏移地址,导致格式化的代码直接覆盖了U盘代码(我就是这个问题),U盘直接没了。

结尾

        这只是内部flash模拟U盘,可以添加fatfs文件系统模拟bootloader,进行程序拖拽跟新操作,不需要自己开发上位机,但是内存太小,不能存储大文件。

        可以考虑外接SPI FLASH,如果是2/8M的话,操作空间比较大,下次更新SPI FLASH的方法。

相关文章:

  • Pycharm(十五)面向对象程序设计基础
  • Linux 内核中 cgroup 子系统 cpuset 是什么?
  • 【专题刷题】滑动窗口(三)
  • 【系统架构设计师】嵌入式微处理器
  • 2025-04-22| Docker: --privileged参数详解
  • Ansys Zemax | 在 MATLAB 中使用 ZOS-API 的技巧
  • 最美丽的区间
  • Trino分布式 SQL 查询引擎
  • [Java · 铢积寸累] 数据结构 — 数组类型 - 概念引入
  • 【数据结构和算法】5. 堆栈和队列
  • 算法基础_数据结构【KMP + Trie 树 + 并查集 】
  • postgreSQL 如何使用 dblink
  • 微信小程序拖拽排序有效果图
  • 机器人进阶---视觉算法(六)傅里叶变换在图像处理中怎么用
  • 【Pytorch 中的扩散模型】去噪扩散概率模型(DDPM)的实现
  • Facebook商城开通全攻略:如何解决所在地区不可使用问题?
  • IPoIB驱动接收路径深度解析:从数据包到协议栈
  • 在Pytorch中使用Tensorboard可视化训练过程
  • 晨控CK-FR12与欧姆龙NX系列PLC配置EtherNet/IP通讯连接操作手册
  • Spring Boot多环境配置详解
  • 马上评丨冒名顶替上中专,为何一瞒就是30多年?
  • 富力地产:广州富力空港假日酒店第一次拍卖流拍,起拍价约2.77亿元
  • 5旬辅警30余年前被人顶替上中专?河南沁阳:基本属实,将依法处理
  • 艺术家会怎么造机器人?
  • 抖音:卤鸭店老板账号视频多为虚构演绎,禁言30天
  • 哈佛大学就联邦经费遭冻结起诉特朗普政府