4.2、CUBEMX USB之MSC(基于内部FLASH)

所需工具
  • CUBEMX5.6
  • STM32F103ZET6开发板(正点原子战舰)
  • LINK及其他线束
1、CUBEMX初始化
  • 设置SYSTEM CORE下的SYS和RCC选项。
  • 设置USB时钟
  • 设置USB
    USB设置- 设置USB_DEVICE
    USBD_MSC

基本参数已经介绍过了,在上篇文章中
MSC_MEDIA_PACKET 这个是USB接受到数据后,从端点内取出来存放的一段缓冲区,这个的大小对于USB读写速度会有一些影响。这里为了配合内部flash的大小,选择了2048.

  • 修改堆栈大小
2、修改usbd_stroge_if.c
  • 添加如下代码
#define     FLASH_START_ADDR        (FLASH_BASE+(100*1024))  
  • 修改宏定义为如下列表
#define STORAGE_LUN_NBR                  1
#define STORAGE_BLK_NBR                  48
#define STORAGE_BLK_SIZ                  FLASH_PAGE_SIZE

STORAGE_BLK_NBR 是扇区个数,U盘实际容量 = 扇区个数 * 扇区大小。
扇区大小取决于所用芯片flash页面的单位,实验所用F103ZET6为一页的大小是2K,所以
STORAGE_BLK_SIZ = FLASH_PAGE_SIZE = 0X800,这个在官方文件中有,所以不必自己定义,扇区个数取决于你想使用多少KB空间作为U盘空间使用,此处使用的是48,大小完全根据自己需求定义
所以这个U盘最终大小应该是48*2K = 96K.

  • STORAGE_GetCapacity_FS函数
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                  ;
  return (USBD_OK);
  /* USER CODE END 3 */
}

block_size 的大小不能大于MSC_MEDIA_PACKET,否则将出现请插入U盘或者无法读写U盘的情况。

  • 修改函数STORAGE_Read_FS为如下所示
int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
    /* USER CODE BEGIN 6 */
    //读U盘函数
    //将(FLASH_START_ADDR + blk_addr * FLASH_PAGE_SIZE)起始地址处的blk_len * FLASH_PAGE_SIZE大小的数据拷贝到buf里面
    memcpy(buf, (uint8_t *)(FLASH_START_ADDR + blk_addr * STORAGE_BLK_SIZ), blk_len * 	STORAGE_BLK_SIZ);
    return (USBD_OK);
    /* USER CODE END 6 */
}
  • 修改函数STORAGE_Write_FS为如下所示
int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
  /* USER CODE BEGIN 7 */
    uint16_t i;
   	HAL_FLASH_Unlock();
   	FLASH_EraseInitTypeDef flash_erase_handler;
   	flash_erase_handler.TypeErase = FLASH_TYPEERASE_PAGES;
   	flash_erase_handler.PageAddress = FLASH_START_ADDR + blk_addr*STORAGE_BLK_SIZ ;
	flash_erase_handler.NbPages = blk_len;
	uint32_t PageError = 0;
	HAL_FLASHEx_Erase(&flash_erase_handler, &PageError);   //页擦除,擦除后才能往这个页面写入东西        
 
    for(i=0;i<blk_len*STORAGE_BLK_SIZ;i+=4)
    {
        HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,FLASH_START_ADDR + blk_addr*STORAGE_BLK_SIZ + i , *(uint32_t *)(&buf[i]));
    }
     //开始写入 每次写入一个4字节的大小,直到写完
	HAL_FLASH_Lock();
  return (USBD_OK);
  /* USER CODE END 7 */
}
实验结果

USB_MSC_ENUMFLASH_SIZE 这里的显示空间为72KB,但是U盘容量应该是有96K的,剩下的24K应该与WINDOWS格式化的FAT32的文件表有关,具体的如果有需要后续再去查阅资料。

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值