STM32 HAL库FLASH模拟U盘FATFS
1. 前期准备
安装好STM32CubeMX
安装好clion
实现功能:
使用SPI FLASH模拟U盘,并在电脑上打开该U盘可以看见通过FATFS创建的文件。
2. 创建项目
在已移植好文件系统的《FATFS》项目基础上,添加USB模拟U盘的功能。
- 配置
USB MSC设备
点击1处,选中后Device(FS),3处选择MSC大容量存储设备,4处改为4096与FLASH扇区大小保持一致,其他参数默认。
- 配置USB 时钟
USB时钟需设置为48MHz。
- 增加堆栈大小,防止溢出
3. 编辑代码
- 更改
USB驱动
找到usbd_storage_if.c文件,添加头文件,并添加全局变量:
#include "bsp_spi_flash.h"
#define STORAGE_LUN_NBR 1
#define STORAGE_BLK_NBR 256*8 //256*8扇区=8MByte
#define STORAGE_BLK_SIZ 4096 //每个扇区4096Byte
#define START_SECTOR 0 //开始扇区
- 修改
USB容量获取函数STORAGE_GetCapacity_FS
int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size)
{
/* USER CODE BEGIN 3 */
*block_num = STORAGE_BLK_NBR;
*block_size = STORAGE_BLK_SIZ;
return (USBD_OK);
/* USER CODE END 3 */
}
- 修改
USB读函数
int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
/* USER CODE BEGIN 6 */
blk_addr+=START_SECTOR;
SPI_FLASH_BufferRead(buf, blk_addr*STORAGE_BLK_SIZ, blk_len*STORAGE_BLK_SIZ);
return (USBD_OK);
/* USER CODE END 6 */
}
- 修改
USB写函数
int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
/* USER CODE BEGIN 7 */
uint32_t write_addr;
blk_addr+=START_SECTOR;
write_addr = blk_addr*STORAGE_BLK_SIZ;
SPI_FLASH_SectorErase(write_addr);
SPI_FLASH_BufferWrite((uint8_t *)buf,write_addr,blk_len*STORAGE_BLK_SIZ);
return (USBD_OK);
/* USER CODE END 7 */
}
4. U盘测试
main.c中保留原来FATFS文件系统测试函数:
FATFS_FLASH_Test();
- 运行代码,
FATFS成功创建RY.txt文件,串口输出如下。
USB插入PC,查看U盘内容,可看到FATFS文件系统创建的RY.txt
5. 小结
本章实现了使用SPI FLASH模拟U盘,并在U盘上创建了文件。