当前页面为 开发中 版本,查看特定版本的文档,请在页面左下角的下拉菜单中进行选择。

USBD MSC Flash Disk

1 功能概述

本例程演示 CherryUSB 组件的 MSC Flash Disk Device(大容量存储设备 - Flash 虚拟 U 盘)的基本功能与使用方法。

2 环境准备

  • 硬件设备与线材:

    • PAN107X EVB 核心板底板各一块

    • JLink 仿真器(用于烧录例程程序)

    • USB-TypeC 线一条(用于底板供电和查看串口打印 Log)

    • 杜邦线数根或跳线帽数个(用于连接各个硬件设备)

  • 硬件接线:

    • 将 EVB 核心板插到底板上

    • 使用 USB-TypeC 线,将 PC USB 插口与 EVB 底板 USB->UART 插口相连

    • 使用杜邦线将 EVB 底板上的 TX 引脚接至核心板 P16,RX 引脚接至核心板 P17

    • 使用杜邦线将 JLink 仿真器的:

      • SWD_CLK 引脚与 EVB 底板的 P00 排针相连

      • SWD_DAT 引脚与 EVB 底板的 P01 排针相连

      • SWD_GND 引脚与 EVB 底板的 GND 排针相连

    • 使用跳线帽将 EVB 底板的:

      • USB+ 排针与 P14 排针相连

      • USB- 排针与 P13 排针相连

  • PC 软件:

    • 串口调试助手(UartAssist)或终端工具(SecureCRT),波特率 921600(用于接收串口打印 Log)

3 编译和烧录

例程位置:<PAN10XX-NDK>\01_SDK\nimble\samples\component\usbd_msc_flash_disk\keil_107x

双击 Keil Project 文件打开工程进行编译烧录。

4 例程演示说明

  1. 烧录完成后,芯片会通过串口打印例程初始化 Log:

    Try to load HW calibration data.. DONE.
    - Chip Info         : 0x61
    - Chip CP Version   : 255
    - Chip FT Version   : 7
    - Chip MAC Address  : E11000014DE5
    - Chip UID          : B90801465454455354
    - Chip Flash UID    : 4250315A3538380B01FD8B435603EF78
    - Chip Flash Size   : 512 KB (Inc. 4KB Panchip Info Area)
    
    - Current Flash Map :
      +-------------------------+ <- Addr: 0x00000
      |      App Partition      |
      |        (220 KB)         |
      +-------------------------+ <- Addr: 0x37000
      |    KVStore Partition    |
      |        ( 16 KB)         |
      +-------------------------+ <- Addr: 0x3B000
      |  User Custom Partition  |
      |        (272 KB)         |
      +-------------------------+ <- Addr: 0x7F000
      |    Panchip Info Area    |
      |     (4 KB, Hidden)      |
      +-------------------------+ <- End : 0x80000 (512 KB)
    
    [I] App started..
    
    [I] Try to mount file system..
    [W] File system does not exist, formatting..
    [I] File system formatting completed, remounting file system..
    [I] Try to open file..
    [W] File does not exist, try to create one..
    [I] Try to write data to the created file..
    [I] Close the opened file..
    [I] Try to open the created file again..
    [I] Try to read data from the opened file..
    [I] File reading successfully, content: Hello Panchip World!
    
    [I] Close the opened file..
    [I] Try to unmount file system..
    [I] USBD_EVENT_INIT
    

    由 Log 可知,App 初始化阶段:

    1. 先在 Flash 中初始化了一个 FAT 文件系统,并在其中创建了一个文本文件,写入了一个字符串 Hello Panchip World!

    2. 然后初始化了 USB Device,但因为当前 USB 未插入,因此 PC 还未识别 U 盘

  2. 使用 USB-TypeC 线,将 PC USB 插口与 EVB 底板的 USB 插口相连

  3. 可以看到 PC 文件资源管理器中多了一个U盘盘符,点击进入后可看到其中已经有一个名为 file.txt 的文件,文件内容与预先写入的字符串一致:

    image

    打开 Flash 虚拟 U 盘中预先保存的文件

  4. file.txt 文件中新增一行字符串,然后保存并关闭此文件:

    image

    修改 Flash 虚拟 U 盘中预先保存的文件内容

  5. 按 EVB 板的 Reset 键复位芯片,观察 USB 重新枚举成功,重新打开 file.txt,可以看到芯片复位前保存到 Flash 中的内容仍然存在:

    image

    检查 Flash 虚拟 U 盘修改后的文件内容是否丢失

5 开发者说明

  1. 本例程用到了 2 个 SDK Component 组件:

    • CherryUSB:开源的用于嵌入式系统的高性能 USB 主从协议栈

    • FatFs:开源的用于嵌入式系统的 FAT 文件系统,支持 FAT12、FAT16、FAT32 及 exFAT

  2. 本例程中将 SoC 的 User Custom Flash 分区扩大为 272KB,并将其用作默认的虚拟 U 盘数据存储区(从前一小节系统初始化 Log 中的 Flash Map 图中也可看出此分区大小)

    此区域在使用 Keil 烧录程序的时候是不会碰到的,若希望擦除此区域,则应使用 Keil 的 Flash - Erase 菜单进行 SoC Flash 全擦操作。

  3. 本例程在初始化 USB 之前,先初始化了 FatFs 文件系统,因此当 USB 插入 PC 后,不会再提示需要格式化,原因是 PC 识别到当前 U 盘存储区中已经存在可用的文件系统

  4. 本例程还提供了使用外部 SPI Flash 作为 U 盘存储区域的功能,若希望测试此功能,则需:

    • 将本例程 sdk_config.h 中的 Component Config : FatFs Enable : Flash Disk Config 配置选项由 SoC Flash (Internal) 切换到 SPI Flash (External)

    • 此功能会使用到 SFUD 组件,请参考 Serial Flash Universal Driver 例程说明,确认此例程可以执行成功(注意 EVB 底板上有对应的 Flash 跳线帽需要接)

    然后编译烧录修改后的本例程,即可看到 U 盘数据存储区变为了 EVB 底板上的外部 SPI Flash。

5.1 CherryUSB 组件

开发者可通过如下步骤使能 CherryUSB 组件(MSC 功能):

  1. 将 CherryUSB 源码和相关头文件目录加入 Keil 工程:

    • usbd_core.c(位于 <PAN10xx-NDK>/nimble/component/usb_device/CherryUSB/core/ 目录)

    • usb_dc_panchip.c(位于 <PAN10xx-NDK>/nimble/component/usb_device/CherryUSB/port/ 目录)

    • usbd_msc.c(位于 <PAN10xx-NDK>/nimble/component/usb_device/CherryUSB/class/msc/ 目录)

    • usb_osal_freertos.c(位于 <PAN10xx-NDK>/nimble/component/usb_device/CherryUSB/osal/ 目录)

    • 头文件目录

      • <PAN10xx-NDK>/nimble/component/usb_device/CherryUSB/common/

      • <PAN10xx-NDK>/nimble/component/usb_device/CherryUSB/core/

      • <PAN10xx-NDK>/nimble/component/usb_device/CherryUSB/class/msc/

  2. 在 Keil 工程中配置 CherryUSB 组件:

    • 打开工程配置 sdk_config.h 文件

    • 勾选 Component Config : CherryUSB Enable 以使能 CherryUSB 组件

    • 根据需要修改 CherryUSB 相关配置子项,如 USB 中断优先级、使能 USB 插拔中断、使能 MSC 功能等

当前例程的 CherryUSB 组件 config 配置如下:

image

CherryUSB component config

关于 CherryUSB config 配置的详细介绍请参考 NDK Configuration 配置指南 文档中的相关章节。

5.2 FatFs 组件

开发者可通过如下步骤使能 FatFs 组件:

  1. 将 FatFs 源码和相关头文件目录加入 Keil 工程:

    • diskio_soc_flash.c(位于 <PAN10xx-NDK>/nimble/component/fs/fatfs-0.14/source/port/ 目录)

    • diskio_spi_flash.c(位于 <PAN10xx-NDK>/nimble/component/fs/fatfs-0.14/source/port/ 目录)

    • diskio.c(位于 <PAN10xx-NDK>/nimble/component/fs/fatfs-0.14/source/ 目录)

    • ff.c(位于 <PAN10xx-NDK>/nimble/component/fs/fatfs-0.14/source/ 目录)

    • ffsystem.c(位于 <PAN10xx-NDK>/nimble/component/fs/fatfs-0.14/source/ 目录)

    • ffunicode.c(位于 <PAN10xx-NDK>/nimble/component/fs/fatfs-0.14/source/ 目录)

    • 头文件目录<PAN10xx-NDK>/nimble/component/fs/fatfs-0.14/source/

  2. 在 Keil 工程中配置 FatFs 组件:

    • 打开工程配置 sdk_config.h 文件

    • 勾选 Component Config : FatFs Enable 以使能 FatFs 组件

    • 根据需要修改 FatFs 相关配置子项,如选择文件系统存储设备是内部 SoC Flash 还是外部 SPI Flash、设置文件系统是否为只允许读操作等

当前例程的 FatFs 组件 config 配置如下:

image

FatFs component config

关于 FatFs config 配置的详细介绍请参考 NDK Configuration 配置指南 文档中的相关章节。

5.3 SFUD 组件

FatFs 组件还支持使用外部 SPI Flash 作为存储区域,此功能基于 SFUD 实现,因此需要额外使能 SFUD 组件。

开发者可通过如下步骤使能 SFUD 组件:

  1. 将 SFUD 源码和头文件目录加入 Keil 工程:

    • sfud.c(位于 <PAN10xx-NDK>/nimble/component/SFUD/sfud/src/ 目录)

    • sfud_port.c(位于 <PAN10xx-NDK>/nimble/component/SFUD/port/ 目录)

    • 头文件目录<PAN10xx-NDK>/nimble/component/SFUD/inc/

  2. 在 Keil 工程中配置 SFUD 组件:

    • 打开工程配置 sdk_config.h 文件

    • 勾选 Component Config : SFUD Enable 以使能 SFUD 组件

    • 根据需要修改 SFUD 相关配置子项,包括 SPI 配置、SPI Flash 的型号和 JDID 等

当前例程的 SFUD 组件 config 配置如下:

image

SFUD component config

关于 SFUD config 配置的详细介绍请参考 NDK Configuration 配置指南 文档中的相关章节。

6 RAM/Flash资源使用情况

PAN107x:

Flash Size:  45.72k
RAM Size:  18.60 k