STM32-外部FLASH(W25Q64)模拟U盘

一、工具

  1、硬件:STM32F103VET6单片机(HAL库)

  2、编译环境:Atollic TrueSTUDIO for STM32 9.3.0

  3、辅助工具:STM32CubeMX

二、工程创建

  1、打开调试接口

   2、选择时钟源

  3、打开USB功能

   4、选择USB中间件,配置USB为大容量存储类型,数据包的大小为4K(使用的的外部Flash一个扇区的大小为4Kbyte),其它默认

   5、根据原理图,需要配置PD6引脚输出为低电平

 

   6、配置系统时钟

   7、生成工程,注意要将堆改大一些

   从工程目录中可以可以看到多了一些关于USB的内容

 三、在USB文件中添加相关读写操作

  1、工程创建后,再添加外部Flash的初始化和读写程序,用于USB调用

   2、修改usbd_storage_if.c文件

  使用到的一些宏定义

/** @defgroup USBD_STORAGE_Private_Defines
  * @brief Private defines.
  * @{
  */

#define STORAGE_LUN_NBR                  1               /* 逻辑单元号,只有一个外部flash,设置为1 */
#define STORAGE_BLK_NBR                  2048            /* 扇区的数量,外部flash的大小是8Mbyte,有128块,每块16个扇区,故128*16=2048个扇区  */
#define STORAGE_BLK_SIZ                  4096            /* 每个扇区的大小,外部flash扇区的大小为4096byte */

   初始化

/* 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 */
    bsp_spi1_init();
  return (USBD_OK);
  /* USER CODE END 2 */
}

  状态函数

/**
  * @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 */
    if(spi_flash_read_ID() == FLASH_ID)
    {
        return (USBD_OK);
    }
    else
    {
        return USBD_FAIL;
    }
  /* USER CODE END 4 */
}

  读函数

/**
  * @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 */
    /* 因为传进来的参数是扇区的地址和扇区的大小,在进行读的时候要转换成字节地址和字节大小 */
    spi1_flash_read(blk_addr*STORAGE_BLK_SIZ, buf, blk_len*STORAGE_BLK_SIZ);
  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 */
    /* 因为传进来的参数是扇区的地址和扇区的大小,在进行写的时候要转换成字节地址和字节大小,flash写之前要擦除 */
    spi1_flash_sector_erase(blk_addr*STORAGE_BLK_SIZ);
    spi1_flash_write(blk_addr*STORAGE_BLK_SIZ, buf, blk_len*STORAGE_BLK_SIZ);
  return (USBD_OK);
  /* USER CODE END 7 */
}

四、运行程序

  1、第一次运行需要格式化虚拟出来的优盘

   

   2、格式化完成后就可以在自己的电脑上看到优盘

   4、创建一个文件测试读写是否正常,然后弹出优盘重新上电复位,查看文件是否还在

#endif

原文地址:https://www.cnblogs.com/wenhao-Web/p/13845465.html