一、工具
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