• 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

  • 相关阅读:
    shell脚本编程练习
    linux中()、[]、{}、(())、[[]]等各种括号的使用
    Linux Shell 变量自加
    while read line [linux] shell 学习
    踢出某正在访问的用户||永久禁止某IP访问
    linux设置 自定义脚本开机启动
    syntax error: unexpected end of file完美解决方案
    Linux利用nc命令脚本批量检测服务器指定端口是否开放
    41-贪心算法
    38-动态规划
  • 原文地址:https://www.cnblogs.com/wenhao-Web/p/13845465.html
Copyright © 2020-2023  润新知