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

SoC Flash

1 功能概述

本例程演示使用 SoC Flash HAL Driver 操作芯片内部 Flash(读、写、擦)的方法。

重要

出于安全考虑,请勿在中断服务程序(ISR)中调用 Flash 相关接口。

2 环境准备

  • 硬件设备与线材:

    • PAN107X/PAN101X 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 排针相连

  • PC 软件:

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

3 编译和烧录

例程位置:<PAN10XX-NDK>\01_SDK\nimble\samples\peripheral\soc_flash\keil_107x(keil_101x)

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

4 例程演示说明

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

    Try to load HW calibration data.. DONE.
    - Chip Info         : 0x61
    - Chip CP Version   : 3
    - Chip FT Version   : 9
    - Chip MAC Address  : E1A000095833
    - Chip UID          : A56407455338323633
    - Chip Flash UID    : 425032323033371410EE02464702B378
    - Chip Flash Size   : 512 KB (Inc. 4KB Panchip Info Area)
    
    - Current Flash Map :
      +-------------------------+ <- Addr: 0x00000
      |      App Partition      |
      |        (480 KB)         |
      +-------------------------+ <- Addr: 0x78000
      |    KVStore Partition    |
      |        ( 16 KB)         |
      +-------------------------+ <- Addr: 0x7C000
      |  User Custom Partition  |
      |        ( 12 KB)         |
      +-------------------------+ <- Addr: 0x7F000
      |    Panchip Info Area    |
      |     (4 KB, Hidden)      |
      +-------------------------+ <- End : 0x80000 (512 KB)
    
    The RCL clock frequency (after calibrate) is 32003 Hz
    
    [I] App started..
    
    [I] Try to erase user custom flash partition (addr: 0x7c000, size: 12KB)
    [I] Flash erase done
    
    [I] Try to read leading BUF_SIZE Bytes from user custom flash partition
    [I] Read flash success. Start from 0x0007C000, size is 512. The data is:
    
    Offset (h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
    ---------- -----------------------------------------------
    [0007C000] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    [0007C010] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    [0007C020] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    [0007C030] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    [0007C040] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    [0007C050] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    [0007C060] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    [0007C070] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    [0007C080] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    [0007C090] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    [0007C0A0] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    [0007C0B0] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    [0007C0C0] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    [0007C0D0] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    [0007C0E0] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    [0007C0F0] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    [0007C100] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    [0007C110] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    [0007C120] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    [0007C130] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    [0007C140] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    [0007C150] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    [0007C160] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    [0007C170] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    [0007C180] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    [0007C190] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    [0007C1A0] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    [0007C1B0] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    [0007C1C0] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    [0007C1D0] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    [0007C1E0] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    [0007C1F0] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    
    [I] Try to write BUF_SIZE Bytes data to the front of user custom flash partition
    [I] Flash write done
    
    [I] Try to read leading BUF_SIZE Bytes from user custom flash partition
    [I] Read flash success. Start from 0x0007C000, size is 512. The data is:
    
    Offset (h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
    ---------- -----------------------------------------------
    [0007C000] 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
    [0007C010] 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
    [0007C020] 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
    [0007C030] 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
    [0007C040] 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
    [0007C050] 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
    [0007C060] 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F
    [0007C070] 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
    [0007C080] 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
    [0007C090] 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
    [0007C0A0] A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
    [0007C0B0] B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
    [0007C0C0] C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
    [0007C0D0] D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
    [0007C0E0] E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
    [0007C0F0] F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF
    [0007C100] 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
    [0007C110] 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
    [0007C120] 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
    [0007C130] 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
    [0007C140] 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
    [0007C150] 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
    [0007C160] 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F
    [0007C170] 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
    [0007C180] 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
    [0007C190] 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
    [0007C1A0] A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
    [0007C1B0] B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
    [0007C1C0] C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
    [0007C1D0] D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
    [0007C1E0] E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
    [0007C1F0] F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF
    
    [I] Try to check the read flash data
    [I] Flash data check OK
    
  2. 由上述 Log 可知,本例程做了如下 Flash 操作:

    1. 擦除整块 User Custom Flash Partition 分区,起始地址为 0x7c000, 大小为 12KB

    2. 读取此 Flash 分区的前 512 字节数据到 RAM Buffer 中,并打印其内容,发现为全 0xFF

    3. 向此 Flash 分区的前 512 字节写特定值

    4. 再次读取此 Flash 分区的前 512 字节数据到 RAM Buffer 中,并打印其内容

    5. 比较读取的数据与预期写入的数据,发现内容一致

5 开发者说明

SoC Flash HAL Driver(pan_hal_fmc.c/h)是 SoC Flash 底层 Driver(pan_fmc.c/h)的安全封装版本,其简化了 SoC Flash 底层 Driver 的接口,并通过 OS 互斥锁确保在 OS 环境下 Flash 操作的安全性。

SoC Flash HAL Driver 接口极其简洁,仅有 4 个直接面向用户的接口:

  1. SoC Flash 读接口 HAL_FMC_ReadStream(uint32_t addr, void *buf, size_t len)

    • 此接口从 Flash 起始地址 addr 处,读取 len 字节长度的数据,存入 buf 指向的 Buffer 中,若成功则返回 0(HAL_OK),否则返回 HAL_ERROR 错误码

    • 其中:

      • addr 参数可以是 Flash 任意有效地址,无对齐要求

      • len 参数可以是任意值(不超过 buf size),无对齐要求

  2. SoC Flash 写接口 HAL_FMC_WriteStream(uint32_t addr, void *buf, size_t len)

    • 此接口将 buf 指向的 Buffer 中的 len 字节长度的数据,写入 Flash 地址 addr 处,若成功则返回 0(HAL_OK),否则返回 HAL_ERROR 错误码

    • 其中:

      • addr 参数可以是 Flash 任意有效地址;但是,实际项目中建议将 addr 对齐到 256 字节,这样可以大大提升 Flash Write 性能!

      • len 参数可以是任意值(不超过 buf size);但是,实际项目中建议将 len 对齐到 256 字节,这样可以大大提升 Flash Write 性能!

  3. SoC Flash 擦接口 HAL_FMC_EraseStream(uint32_t addr, size_t len)

    • 此接口擦除 Flash 起始地址 addr 处的 len 字节长度的数据,若成功则返回 0(HAL_OK),否则返回 HAL_ERROR 错误码

    • 其中:

      • addr 参数必须对齐到 4KB 边界,否则接口会返回错误码

      • len 参数可以是任意值;但是,由于 Flash 物理上擦除的最小单位是 4KB Sector,因此实际擦除的 Flash 区域大小仍然是 4KB 的倍数,例如,传入的 len 参数值为 5000 (>4KB),则实际擦除的 Flash 大小是 8192 (8KB)

  4. SoC Flash 读 INFO 区接口 HAL_FMC_ReadInfoArea(uint32_t addr, void *buf, size_t len)

    • 芯片内部 Flash 中有一个 4KB 大小的保留区域,用于存放当前芯片的出厂(校准)信息;有些时候用户可能希望读取其中的内容(如芯片 UID 等),因此 SoC Flash HAL Driver 中也提供了访问此区域的接口

    • 此接口从 Flash INFO 区起始地址 addr 处,读取 len 字节长度的数据,存入 buf 指向的 Buffer 中,若成功则返回 0(HAL_OK),否则返回 HAL_ERROR 错误码

    • 其中:

      • addr 参数可以是 Flash INFO 区任意有效地址(0x0 ~ 0xFFF),无对齐要求

      • len 参数可以是任意值(不超过 buf size),无对齐要求

6 RAM/Flash资源使用情况

PAN107x:

Flash Size:  23.62k
RAM Size:  14.88 k