我最近收到了一块用于评估的SF32LB52-DevKit-LCD-V1.2.1,上面搭载了SF32LB32-MOD-1 (N16R8)模组。
我目前不打算使用SiFli SDK/构建系统,而是计划自己编写链接脚本进行编译和链接,然后直接用sftool进行烧录。经过一些尝试和错误后,我成功烧录了一个能运行的闪烁程序。但由于我没有使用SDK进行构建,我有点担心会擦除闪存并且无法恢复原始固件。为了安全起见,我已经转储了前131072字节(0x12000000到0x12020000),但不清楚剩余部分的情况。我在这里找到了ptab.yaml定义,但NOR闪存的定义似乎有误:
memory:
- mpi: mpi2
type: nor
size: 8388608 # 8MB
以下是分区表中定义的分区:
- name: hcpu_flash_code
type: app
subtype: factory
region: mpi2
offset: 0x20000
size: 7MB
core: HCPU
# DFU application (XIP 执行)
- name: dfu_flash_code
type: app
subtype: dfu
region: mpi2
offset: 0x720000
size: 384KB
core: HCPU
# DFU download region
- name: dfu_download_region
type: data
subtype: raw
region: mpi2
offset: 0x780000
size: 1152KB
# Filesystem region
- name: fs_region
type: data
subtype: filesystem
region: mpi2
offset: 0x8A0000
size: 4MB
# KVDB for DFU
- name: dfu
type: data
subtype: flashdb_kv
region: mpi2
offset: 0xCA0000
size: 16KB
# KVDB for BLE
- name: ble
type: data
subtype: flashdb_kv
region: mpi2
offset: 0xCA4000
size: 16KB
# PSRAM data region (on SiP mpi1)
- name: psram_data
type: data
subtype: ram
region: mpi1
offset: 0
size: 8MB
- 你能确认分区表的其余部分是否正确,这样我就能知道我在备份什么?
- 分区表除了在SDK源代码中,还有其他地方有文档吗?
- 即使我不使用SDK,分区表中的哪些部分我也不应该碰?我猜BLE分区可能被小核使用?
- 如果我决定编写自己的引导加载程序,是否可以擦除所有内容?(除了可能的BLE分区)
- 是否有详细文档说明引导加载程序的作用?我特别想知道它是否处理了一些硬件上的怪异之处,或者我只需阅读SF32LB52文档就可以了。但我也想知道第一引导加载程序已经完成了哪些启动工作,哪些需要由第二引导加载程序完成。
还有一个不相关的问题:
- 我在这个板上没有看到任何SWD或JTAG引脚,除了通过UART打印串行数据之外,是否有其他方法可以进行运行时调试?
如果SiFli的人能看到这个:还有一个完全跑题的问题——既然你们通过淘宝销售,你们知道通过淘宝销售到瑞典/欧洲是如何操作的吗?我很难搞清楚这一点。我是从AliExpress上某个商店买的这个开发套件。
此致敬礼,
Oscar
- 没有英文版的模块数据手册
- 你说得对,nor flash 大小是 16MB,这个部分的 size 字段实际上没有被使用
memory:
- mpi: mpi2
type: nor
size: 8388608 # 8MB
- ptab.yaml 中定义的所有分区都不被 bootrom(即第一级引导加载程序)使用,它们都与应用程序相关。BLE 分区不被小核使用,如果基于我们的 SDK 开发,它被运行在大核上的 BLE 主机代码使用。
- 如果你编写自己的引导加载程序(称为第二级引导加载程序),只需保留前 16KB,因为这是 bootrom 使用的闪存表,或者像 Zephyr 那样替换为你自己的 ftab.bin。下面是用于
hello_world 的 N16R8 模块的闪存表内容。ftab 从地址 0x12000000 开始。Bootrom 读取此表,知道第二级引导加载程序代码位于 0x12010000,需要复制到 0x20020000(XIP 基址)并在那里运行。
main 代表主应用程序,由我们的第二级引导加载程序加载。
bootrom(第一级引导加载程序)和第二级引导加载程序的功能记录在此处
PS > sdk.py ftab-dump -p .\build_sf32lb52-lcd_n16r8_hcpu\ftab.bin
Flash Table (ftab.bin)
Magic: 0x53454346 (FCES)
File Size: 11280 bytes
1. Partition Table Entries
┏━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━┓
┃ Index ┃ Name ┃ Base Address ┃ Size ┃ Size (Hex) ┃ XIP Base ┃ Flags ┃
┡━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━┩
│ 0 │ ftab │ 0x12000000 │ 32.0KB │ 0x00008000 │ - │ - │
│ 3 │ bootloader │ 0x12010000 │ 128.0KB │ 0x00020000 │ 0x20020000 │ - │
│ 4 │ main │ 0x12020000 │ 7.0MB │ 0x00700000 │ 0x12020000 │ - │
│ 7 │ bootloader_pong │ 0x12010000 │ 128.0KB │ 0x00020000 │ 0x20020000 │ - │
│ 8 │ main_pong │ 0x12020000 │ 7.0MB │ 0x00700000 │ 0x12020000 │ - │
└───────┴─────────────────┴──────────────┴─────────┴────────────┴────────────┴───────┘
开发板上默认没有 SWD 引脚,但仍可通过 UART 进行调试。Windows 用户请参考此 文档。
Linux 和 macOS 用户可使用我们的 VSCode 插件 SiFli-SDK-CodeKit。它已内置 probe-rs,可通过 UART 调试 SF32LB52,相关中文 调试文档
关于ftab.bin(闪存表,C结构体类型为 struct sec_configuration,定义在dfu.h中)的结构,你可以阅读这段代码来大致了解,尽管有些信息已经过时。SF32LB52使用的正确索引定义如下,第二个引导加载程序的索引为3
Flash Table (ftab.bin)
Magic: 0x53454346 (FCES)
File Size: 11280 bytes
1. 分区表条目
┏━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━┓
┃ 索引 ┃ 名称 ┃ 基地址 ┃ 大小 ┃ 大小(十六进制)┃ XIP基地址 ┃ 标志 ┃
┡━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━┩
│ 0 │ ftab │ 0x12000000 │ 32.0KB │ 0x00008000 │ - │ - │
│ 3 │ bootloader │ 0x12010000 │ 128.0KB │ 0x00020000 │ 0x20020000 │ - │
│ 4 │ main │ 0x12020000 │ 7.0MB │ 0x00700000 │ 0x12020000 │ - │
│ 7 │ bootloader_pong │ 0x12010000 │ 128.0KB │ 0x00020000 │ 0x20020000 │ - │
│ 8 │ main_pong │ 0x12020000 │ 7.0MB │ 0x00700000 │ 0x12020000 │ - │
└───────┴─────────────────┴──────────────┴─────────┴────────────┴────────────┴───────┘
有效条目: 5/16
2. 映像描述表
┏━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━┓
┃ Idx ┃ FlashID ┃ 名称 ┃ 长度 ┃ 长度(十六进制)┃ 块大小 ┃ 标志 ┃ 状态 ┃
┡━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━┩
│ 0 │ 2 │ LCPU │ - │ - │ - │ - │ 空 │
│ 1 │ 3 │ Bootloader │ 64.0KB │ 0x00010000 │ 512 │ AUTO │ 有效 │
│ 2 │ 4 │ HCPU │ 7.0MB │ 0x00700000 │ 512 │ AUTO │ 有效 │
│ 3 │ 5 │ Boot │ - │ - │ - │ - │ 空 │
│ 4 │ 6 │ LCPU2 │ - │ - │ - │ - │ 空 │
│ 5 │ 7 │ BCPU2 │ - │ - │ - │ - │ 空 │
│ 6 │ 8 │ HCPU2 │ 7.0MB │ 0x00700000 │ 512 │ AUTO │ 有效 │
│ 7 │ 9 │ Boot2 │ - │ - │ - │ - │ 空 │
│ 8 │ 10 │ HCPU_EXT1 │ - │ - │ - │ - │ 空 │
│ 9 │ 11 │ HCPU_EXT2 │ - │ - │ - │ - │ 空 │
│ 10 │ 12 │ LCPU_EXT1 │ - │ - │ - │ - │ 空 │
│ 11 │ 13 │ LCPU_EXT2 │ - │ - │ - │ - │ 空 │
│ 12 │ 14 │ Reserved │ - │ - │ - │ - │ 空 │
│ 13 │ 15 │ SINGLE │ - │ - │ - │ - │ 空 │
└─────┴─────────┴────────────┴────────┴──────────────┴────────────┴───────┴────────┘
有效条目: 3/14
3. 映像索引表
┏━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━┓
┃ 索引 ┃ 名称 ┃ 地址 ┃ 状态 ┃
┡━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━┩
│ 0 │ LCPU │ - │ 空 │
│ 1 │ Bootloader │ 0x12001200 │ 有效 │
│ 2 │ HCPU │ 0x12001400 │ 有效 │
│ 3 │ Boot │ - │ 空 │
└───────┴────────────┴────────────┴────────┘
这是个好主意。我们把文件系统区域放在DFU区域之后的原因很简单,就是为了利用剩余的闪存空间。