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