Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/dsyx/docs.silabs.com_zh/llms.txt

Use this file to discover all available pages before exploring further.

在无法连接 J-Link 调试器的场景下,固件更新需要依赖 Bootloader 机制。Silicon Labs Connect v3.x 支持两种主要方式:通过 UART/SPI 连接进行的 Standalone Bootloading,以及无需物理连接的 OTA(Over-the-Air)引导加载。OTA 过程依赖 Application Bootloader 从板载存储(SPI Flash 或内部 Flash)更新固件,而 OTA 映像传输本身则由主应用程序负责。

Gecko Bootloader

Silicon Labs Connect 仅支持 Gecko Bootloader,适用于 Wireless Gecko(EFR32™)产品系列。

Standalone Bootloader

推荐使用 UART XMODEM Bootloader 示例。通过 UART 或 SPI 连接更新固件,支持 GPIO 激活进入 bootloader 模式(默认启用)。

Application Bootloader(OTA)

推荐使用 SPI Flash Storage Bootloader(EFR32 连接 SPI Flash 时)或 Internal Storage Bootloader注意:Connect OTA 协议仅支持 single image bootloader。
编译好 Bootloader 后,请确保在刷写主固件之前先将 <projectname>-combined.s37 文件刷写到设备上。Gecko Bootloader 是 two-stage bootloader,只有 -combined.s37 文件包含完整的 first stage;其他二进制文件仅含 second stage,无法单独运行。

配置 Connect 应用程序以支持 Bootloading

1

创建 Connect 示例项目

在 Simplicity Studio 中创建新的 Connect 示例应用程序。
2

安装 Bootloader Application Interface 组件

安装该组件后将自动完成:
  • 修改 EFR32xG1 上的内存分配(Bootloader 使用 Flash 前 16 kB)
  • 添加 bootloader 相关代码的编译时定义
  • 提供可与 Bootloader 交互的 C 函数(如切换到 bootloader 模式)
3

(可选)安装 OTA 相关组件

若需要 OTA 功能,还需根据广播/单播场景安装对应的 OTA 组件(见下文)。

使用 Standalone Bootloader(SoC 应用)

若在 Gecko Bootloader 中启用了 GPIO 激活功能(默认启用),可在按住激活按钮的同时重置 MCU 进入 bootloader 模式。也可在应用程序中通过代码切换:
// 通过代码进入 standalone bootloader 模式
halLaunchStandaloneBootloader(STANDALONE_BOOTLOADER_NORMAL_MODE);
相关 API 参见文件:
platform/base/hal/micro/bootloader-interface-standalone.h

OTA 无线固件更新

广播 OTA vs. 单播 OTA

映像广播给所有设备(设备可忽略,相当于多播)。优点:
  • 可同时更新多个设备,效率高
  • 网络负担较小
限制:
  • 仅支持 single-hop 范围(Coordinator 无法更新 Range Extender 后面的端点)
  • 无法用于 Sleepy End Device
  • Broadcast Plugin 最大支持 50 个客户端
两种 OTA 方法均不适用于 MAC Mode,且均支持安全消息。

所需 OTA 组件

场景所需组件
广播和单播 OTA(通用)OTA Bootloader Interface、OTA Bootloader Test Common
广播 OTAOTA Broadcast Bootloader Client、OTA Broadcast Bootloader Server、OTA Broadcast Bootloader Test
单播 OTAOTA Unicast Bootloader Client、OTA Unicast Bootloader Server、OTA Unicast Bootloader Test
所有 OTA 组件均为开源。

广播 OTA 工作原理

1

客户端设置映像标签

需要接收同一映像的客户端设置相同的标签(Tag)。标签用于版本控制,确保已有相同映像的设备不参与 OTA 流程。
2

服务端广播映像段

服务端开始广播带标签的映像段(适合 Connect 数据帧的固件分片,含存储器地址)。
3

客户端存储映像段

客户端存储收到的映像段,并根据地址识别丢失的段。
4

服务端查询缺失段

每广播 512 个段后,服务端向每个客户端(单播)询问缺失的段,收集信息后重新广播。
5

循环直到完成

循环查询和补充广播,直到所有客户端均拥有完整映像为止。

单播 OTA 工作原理

1

客户端设置标签

客户端设置用于版本控制的标签(Tag)。
2

握手

服务端向客户端发送握手,告知映像大小和标签;客户端回复确认。
3

逐段传输

服务端发送映像段,客户端以段响应确认。若服务端未收到响应则重发,直到整个映像传输完毕。
4

断点续传

若连接中断,客户端记录已接收的段数。服务端重新发起下载时,客户端在握手时通知服务端仅发送剩余部分(标签未变且未执行 Flash 擦除的情况下)。

远程引导加载请求

广播和单播 OTA 组件均支持远程引导加载请求:OTA 服务端可请求客户端执行引导加载操作,客户端收到命令后将下载的映像加载到主存储器并引导启动。

实战演示:在 Sensor-Sink 中使用 OTA

以下以广播 OTA 为例,完整演示 OTA 流程(Sink 作为 OTA 服务端,Sensor 作为 OTA 客户端)。

创建项目

1

创建 Single Image Bootloader 项目

选择适合设备的 single image bootloader 示例,无需修改。
2

创建 Sink(OTA 服务端)项目

安装以下组件(除 Bootloader Application Interface 外):
  • OTA Bootloader Interface
  • OTA Bootloader Test Common
  • OTA Broadcast Bootloader Server
  • OTA Broadcast Bootloader Test
3

创建两个 Sensor(OTA 客户端)项目

两个项目间做出区分(如不同的启动打印信息或 LED 行为)。安装以下组件:
  • OTA Bootloader Interface
  • OTA Bootloader Test Common
  • OTA Broadcast Bootloader Client
  • OTA Broadcast Bootloader Test
4

生成并构建所有项目

生成并构建:bootloader、sink、两个 sensor 项目。

刷写应用程序

# 使用 Simplicity Commander 刷写 bootloader(必须先于主固件)
# 确保使用 -combined.s37 文件(包含 first stage)
commander flash <bootloader>-combined.s37
刷写应用程序前不要擦除 Flash,以保留已刷写的 Bootloader。不要使用 .bin 文件,因为它不包含地址信息,可能覆盖 Bootloader。

生成 GBL 文件

# 设置 Simplicity Commander 路径(Windows)
setx PATH_SCMD C:\SiliconLabs\SimplicityStudio\v5\developer\adapter_packs\commander

# 在项目目录中运行脚本生成 GBL 文件
# Windows:
connect_create_gbl_image.bat
# UNIX:
./connect_create_gbl_image.sh

加载映像到 OTA 服务端

commander extflash write <application image>.gbl

准备设备并执行 OTA

# OTA 服务端(Sink)CLI 命令
bootloader_init
bootloader_validate_image    # 验证映像有效性

# OTA 客户端(Sensor)CLI 命令
bootloader_init
bootloader_flash_erase       # 擦除 Flash 槽,为接收映像做准备
# 建立 Connect 网络
# Sink 上:
form 0
pjoin 120

# Sensor 上:
join 0
set_report_period 10000
bootloader_set_tag 0xaa      # 设置映像标签

# 获取 Sensor 的 Node ID
info
# 输出示例:Node id: 0x0001
广播 OTA 流程:
# OTA 服务端(Sink)上执行:
bootloader_broadcast_set_target 0 0x0001          # 设置目标(支持多个,逐个添加)
bootloader_broadcast_distribute <size> 0xaa 1     # 启动映像分发
bootloader_broadcast_request_bootload 1000 0xaa 1 # 请求引导加载(1000ms 超时)
单播 OTA 流程:
# OTA 服务端(Sink)上执行:
bootloader_unicast_set_target 0x0001
bootloader_unicast_distribute <size> 0xaa
bootloader_unicast_request_bootload 1000 0xaa
引导加载完成后,Sensor 将重新加入网络(网络信息存储在 NVM 中),但此时应可看到 OTA 映像中设置的差异(如不同的 LED 行为或启动打印信息)。

Build docs developers (and LLMs) love