(1)CubexMax生成FAT16文件系統和USB MSC的代碼
首先配置USB MSC將USB配置成Device模式
然後在將Device配置成MSC
這個時候會出現如下圖所示的界面
這個時候需要配置RCC
然後在配置FAT
(2)設計思想
在這個過程用RAM的256K空間模擬磁盤空間
(3)關鍵代碼
#define STORAGE_LUN_NBR 1
#define DEVICE_FLASH_SECTOR_COUNT 256 // set secrot count.
#define DEVICE_SPI_FLASH_SECTOR_SIZE 512 //define sector size.
#define STORAGE_BLK_NBR DEVICE_FLASH_SECTOR_COUNT
#define STORAGE_BLK_SIZ DEVICE_SPI_FLASH_SECTOR_SIZE
#define FAT_SIZE (DEVICE_FLASH_SECTOR_COUNT * DEVICE_SPI_FLASH_SECTOR_SIZE)
extern uint8_t fat_buffer[FAT_SIZE];
uint32_t Device_Init();
uint32_t _ReadSector(uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
uint32_t _WriteSector(const uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
uint8_t fat_buffer[FAT_SIZE];
__weak uint32_t Device_Init()
{
//init device SPI_DEVICE device.
}
__weak uint32_t _ReadSector(uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
memcpy(buf,fat_buffer + blk_addr,blk_len);
return 0;
}
__weak uint32_t _WriteSector(const uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
memcpy(fat_buffer + blk_addr,buf,blk_len);
return 0;
}
以上兩段代碼是MSC和FAT訪問內存的關鍵部分,由於我是使用內存模擬的磁盤,如果需要使用flash作爲磁盤,值需要將init、write、read替換對應flashAPI即可
(4)源碼路徑:
[email protected]:panuniverse/STM32_USB_MSC_DEVICE_FAT.git
工程項目使用的編譯器是IAR