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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM