所需工具
- CUBEMX5.6
- STM32F103ZET6开发板(正点原子战舰)
- LINK及其他线束
1、CUBEMX初始化
- 设置SYSTEM CORE下的SYS和RCC选项。
- 设置USB时钟
- 设置USB
- 设置USB_DEVICE
基本参数已经介绍过了,在上篇文章中
MSC_MEDIA_PACKET 这个是USB接受到数据后,从端点内取出来存放的一段缓冲区,这个的大小对于USB读写速度会有一些影响。这里为了配合内部flash的大小,选择了2048.如果选用512的话,需要.
- 修改堆栈大小
2、修改usbd_stroge_if.c
- 添加如下代码
#define FLASH_START_ADDR (FLASH_BASE+(100*1024))
- 修改宏定义为如下列表
#define STORAGE_LUN_NBR 1
#define STORAGE_BLK_NBR 48
#define STORAGE_BLK_SIZ FLASH_PAGE_SIZE
STORAGE_BLK_NBR 是扇区个数,U盘实际容量 = 扇区个数 * 扇区大小。
扇区大小取决于所用芯片flash页面的单位,实验所用F103ZET6为一页的大小是2K,所以
STORAGE_BLK_SIZ = FLASH_PAGE_SIZE = 0X800,这个在官方文件中有,所以不必自己定义,扇区个数取决于你想使用多少KB空间作为U盘空间使用,此处使用的是48,大小完全根据自己需求定义
所以这个U盘最终大小应该是48*2K = 96K.
- 修改函数STORAGE_Read_FS为如下所示
int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{/* USER CODE BEGIN 6 *///读U盘函数//将(FLASH_START_ADDR + blk_addr * FLASH_PAGE_SIZE)起始地址处的blk_len * FLASH_PAGE_SIZE大小的数据拷贝到buf里面memcpy(buf, (uint8_t *)(FLASH_START_ADDR + blk_addr * STORAGE_BLK_SIZ), blk_len * STORAGE_BLK_SIZ);return (USBD_OK);/* USER CODE END 6 */
}
- 修改函数STORAGE_Write_FS为如下所示
int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{/* USER CODE BEGIN 7 */uint16_t i;HAL_FLASH_Unlock();FLASH_EraseInitTypeDef flash_erase_handler;flash_erase_handler.TypeErase = FLASH_TYPEERASE_PAGES;flash_erase_handler.PageAddress = FLASH_START_ADDR + blk_addr*STORAGE_BLK_SIZ ;flash_erase_handler.NbPages = blk_len;uint32_t PageError = 0;HAL_FLASHEx_Erase(&flash_erase_handler, &PageError); //页擦除,擦除后才能往这个页面写入东西 for(i=0;i<blk_len*STORAGE_BLK_SIZ;i+=4){HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,FLASH_START_ADDR + blk_addr*STORAGE_BLK_SIZ + i , *(uint32_t *)(&buf[i]));}//开始写入 每次写入一个4字节的大小,直到写完HAL_FLASH_Lock();return (USBD_OK);/* USER CODE END 7 */
}
实验结果
这里的显示空间为72KB,但是U盘容量应该是有96K的,剩下的24K应该与WINDOWS格式化的FAT32的文件表有关,具体的如果有需要后续再去查阅资料。