STM32·

STM32篇——SPI_FLASH模拟U盘FATFS

ronger

ronger

8878 0

STM32 HAL库FLASH模拟U盘FATFS

1. 前期准备

安装好STM32CubeMX

安装好clion

实现功能:

使用SPI FLASH模拟U盘,并在电脑上打开该U盘可以看见通过FATFS创建的文件。

2. 创建项目

在已移植好文件系统的《FATFS》项目基础上,添加USB模拟U盘的功能。

  1. 配置USB MSC设备

点击1处,选中后Device(FS)3处选择MSC大容量存储设备,4处改为4096FLASH扇区大小保持一致,其他参数默认。

  1. 配置USB 时钟

USB时钟需设置为48MHz

  1. 增加堆栈大小,防止溢出

3. 编辑代码

  1. 更改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     //开始扇区
  1. 修改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 */
}
  1. 修改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 */
}
  1. 修改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();
  1. 运行代码, FATFS成功创建RY.txt文件,串口输出如下。

  1. USB插入PC,查看U盘内容,可看到FATFS文件系统创建的RY.txt

5. 小结

本章实现了使用SPI FLASH模拟U盘,并在U盘上创建了文件。

所属系列

从当前文章继续阅读它所在合集中的前后内容。

关于我和 Hugh 学嵌入式开发这件事 —— STM32 篇 第 16 / 17 篇
查看合集

> 本作品集内教程基于 [Hugh](https://rymcu.com/user/hugh) 的创作基础上进行修订发布 关于我和 Hugh 学嵌入式开发这件事

相关文章

优先推荐同专题、同标签和同作者内容,补足热门文章。

评论 0

登录 后参与评论

评论

成为第一个评论的人