HiSpark编程指南

- 调测资料
  - SDK Sample使用指南
    - 前言
    - 概述
    - Sample框架
    - 外设 Sample
    - SLE UART Sample
    - SLE UART DMA Sample
    - SLE Mouse Sample
    - SLE amic vdt with dongle
    - SLE microphone
    - SLE measure dis
    - BLE Lowpower Sample
    - BLE UART Sample
    - BLE Keyboard Sample
    - BLE SLE TAG Sample
    - BLE Mouse Sample
    - USB Keyboard Sample
    - USB Mouse Sample
    - USB AMIC VDT Sample
    - RCU
    - 多连接
    - air mouse
    - SLE MOUSE with Dongle
    - SLE OTA dongle
    - game mouse
    - BLE UUID
    - 缩略语
  - SDK二次开发网络安全注意事项
    - 前言
    - 产品安全解决方案
    - 结论
  - SDK开发环境搭建用户指南
    - 前言
    - 开发环境搭建
    - 编译SDK
    - 新建APP
  - 内存维测指导书
    - 前言
    - 简介
    - 内存维测功能
  - 射频AT测试指南
    - 前言
    - 射频测试AT指令
    - AT指令组包示例
    - 注意事项
  - 维测指导书
    - 前言
    - 概述
    - 日志说明
    - 日志分析
    - 问题定位
    - 典型案例
    - 常见问题FAQ
- 软件资料
  - AT命令使用指南
    - 前言
    - 指令说明
    - 通用AT指令
    - BT业务AT指令
    - 新增AT指令方法
  - DFU升级APK开发指南
    - 前言
    - 功能特性
    - 系统框架
    - 工程文件部署
    - 界面实现
    - 升级界面Fragment实现
    - 关于界面Fragment实现
    - 应用清单AndroidManifest
  - DFX软件开发指南
    - 前言
    - DIAG维测功能
    - 死机诊断
    - Dump解析
  - EFUSE使用指南
    - 前言
    - 概述
    - 使用软件接口读写EFUSE
    - 使用BurnTool烧写EFUSE
  - NFC TAG软件开发指导书
    - 前言
    - 概述
    - 开发指导
  - NV存储用户指南
    - 前言
    - NV简介
    - NV编译预置
    - NV API指南
    - 定制化NV结构使用介绍
    - 通过NV自定义传输数据最大长度
  - Release notes
    - 1.0.18版本描述文件
    - 1.0.17版本描述文件
    - 1.0.16版本描述文件
  - SDK开发指南
    - 前言
    - 概述
    - 系统接口
  - SDK接口变更说明书
    - 前言
    - BLE SDK接口变更说明
  - SP31 SLP使用指南
    - 开源版本
  - USB HID复合设备开发指南
    - 前言
    - 概述
    - 实现方式
  - 代码框架说明
    - 前言
    - SDK模块框架
    - SDK目录结构
    - SDK目录说明
  - 低功耗FAQ
    - 前言
    - 系统无法睡眠
    - IO无法唤醒系统
    - 唤醒后外设异常
    - 低功耗导致OTA升级异常
    - 功耗比预期高
    - 锁中断导致BT业务阻塞
    - 概率性狗超时
    - 供电模式&软件配置
    - 提前唤醒时间问题
  - 低功耗sample使用指南
    - 前言
    - 编译&测试
    - 系统状态管理
    - 用户指南
  - 低功耗开发指南
    - 前言
    - 低功耗概述
    - 低功耗方案
    - 开发指引
    - 功耗优化
    - 常见问题
  - 功率配置说明书
    - 前言
    - 射频功率配置说明
  - 升级方案使用指南
    - 前言
    - 概述
    - 升级包制作
    - 升级包传输
    - 升级包保存
    - 升级包本地升级
    - FAQ
  - 快速入门指南
    - 前言
    - 文档目录
    - 环境搭建
    - 基础功能开发
    - 调优
    - 特性开发
    - 测试报告
  - 星闪应用层SLE-Link协议
    - 前言
    - 概述
    - SLE Frame格式定义
    - 服务接口定义
    - 交互流程示例
  - 星闪软件开发指导书
    - 前言
    - 概述
    - Device Discovery接口
    - Connection Manager接口
    - SSAP Server接口
    - SSAP client接口
    - Low Latency接口
    - Transmission Manager接口
    - SLE Passkey接口
    - SLE Channel Map 接口
  - 红外学习使用指南
    - 前言
    - 红外学习方式
    - 通过比较器进行红外学习
    - 使用指南
  - 蓝牙软件开发指导书
    - 前言
    - 概述
    - GAP接口
    - GATT server接口
    - GATT client接口
  - 设备驱动开发指南
    - 前言
    - Pinctrl
    - GPIO
    - UART
    - SPI
    - I2C
    - ADC
    - DMA
    - PWM
    - WDT
    - Timer
    - Systick
    - TCXO
    - Flash
    - SFC
    - QDEC
    - KEYSCAN
    - PDM
    - USB_HID
    - USB_DFU
    - I2S
    - TRNG
    - 附：MIDDLEWARE
  - 音频编解码开发指导书
    - 前言
    - 概述
    - Audio Encoder
    - Audio Decoder
    - 调试与功能
- 工具资料
  - BurnTool工具使用指导书
    - 前言
    - BurnTool工具简介
    - 操作指南
    - FAQ
  - HiSpark Studio使用指南
    - 前言
    - 工具简介
    - 开发环境搭建
    - 工程管理
    - 工程配置
    - 编译运行
    - 软件包烧录
    - 栈分析和镜像分析
    - 工程调试
    - 串口控制台工具
    - Kconfig配置
    - GUI工程创建与使用
    - 高阶分析功能使用
    - 常见错误

### 该页内容

- 前言
- 概述
- 使用软件接口读写EFUSE
- 使用BurnTool烧写EFUSE
  - 生成efuse_cfg.bin
  - 烧录流程

# 前言

概述

本文档主要描述了BS2XV100的客户预留EFUSE位域的使用方法。

产品版本

与本文档对应的产品版本如下。

产品名称 | 产品版本
--- | ---
BS2X | V100

读者对象

本文档主要适用于以下人员：

- 技术支持工程师

- 软件开发工程师

符号约定

在本文中可能出现下列标志，它们所代表的含义如下。

符号 | 说明
--- | ---
| 表示如不避免则将会导致死亡或严重伤害的具有高等级风险的危害。
| 表示如不避免则可能导致死亡或严重伤害的具有中等级风险的危害。
| 表示如不避免则可能导致轻微或中度伤害的具有低等级风险的危害。
| 用于传递设备或环境安全警示信息。如不避免则可能会导致设备损坏、数据丢失、设备性能降低或其它不可预知的结果。 “须知”不涉及人身伤害。
| 对正文中重点信息的补充说明。 “说明”不是安全警示信息，不涉及人身、设备及环境伤害信息。

修改记录

文档版本 | 发布日期 | 修改说明
--- | --- | ---
04 | 2025-08-07 | 更新“烧录流程”章节内容。
03 | 2025-05-30 | 更新“概述”章节内容。 更新“使用软件接口读写EFUSE”章节内容。
02 | 2025-01-24 | 更新“使用软件接口读写EFUSE”章节内容。
01 | 2024-05-15 | 第一次正式版本发布。

# 概述

EFUSE是一种可编程的存储单元，由于其只可编程一次的特征，多用于芯片保存Chip ID、密钥或其他一次性存储数据。当前BS2x芯片上总共128Bytes，用户可使用的EFUSE总共18Byte。如果用户不需要使用安全启动功能，其中Boot Hash Value部分的32字节也可以由用户自定义使用。在地址0x5702_8894中Bit15~Bit8可以给客户使用。

> 须知： EFUSE地址遵循32位对齐，每个地址包含16Bit的有效EFUSE位域。

BS2X提供了两种使用方式：

- 通过软件驱动接口直接读写为用户预留的EFUSE空间。

- 通过烧写工具操作为用户预留的EFUSE空间。

- 通过JLink读写为用户预留的EFUSE空间。

# 使用软件接口读写EFUSE

EFUSE模块提供的接口及功能如下：

头文件路径: include\driver\efuseh

- uapi_efuse_read_bit：读取EFUSE中的指定Bit位。uapi_efuse_read_buffer：读取EFUSE中多个字节，进入提供的缓冲区。

- uapi_efuse_write_bit：写EFUSE中的指定Bit位。

- uapi_efuse_write_buffer：从提供的缓冲区向EFUSE写入多个字节。

> 须知：

> - 调用API写EFUSE之前需要先执行LDO上电，写完成之后关闭即可，具体执行过程则是如下示例调用pm_efuse_ldo_power接口执行上下电。读EFUSE则不需要单独执行上电。

> - 如果要进行位操作，首先需要打开EFUSE_BIT_OPERATION宏，将其添加到config.py中的宏列表即可。

示例：

1. 按照buffer写EFUSE值。

       uint8_t efuse_data[8] = {0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88};
       uint32_t byte_number = 1;
       uint16_t length = 8;
       uint32_t ret;
       // 第1byte开始写入8个字节
       ret = uapi_efuse_write_buffer(byte_number, efuse_data, length);
       if (ret != 0) {
           // 异常处理
       }

2. 按照buffer读取EFUSE值。

       uint8_t efuse_data[8] = {0};
       uint32_t byte_number = 1;
       uint16_t length = 8;
       uint32_t ret;
       // 第1byte开始读取8个字节
       ret = uapi_efuse_read_bit(byte_number, efuse_data, length);
       if (ret != 0) {
           // 异常处理
       }

3. 按照bit读取EFUSE值。

       uint8_t bit_pos = 1;
       uint8_t value;
       uint32_t byte_number = 1;
       uint32_t ret;
       // 读取第一个byte的bit1的值，存入value中（0 or 1）
       ret = uapi_efuse_read_bit(byte_number, bit_pos, &value);
       if (ret != 0) {
           // 异常处理
       }

4. 按照bit写入EFUSE值。

       uint8_t value;
       uint32_t byte_number = 1;
       uint32_t ret;
       // 向第一个byte的bit1写入1
       ret = uapi_efuse_write_bit(byte_number, bit_pos);
       if (ret != 0) {
           // 异常处理
       }

# 使用BurnTool烧写EFUSE

## 生成efuse_cfg.bin

1. 数据准备（路径：build\config\target_config\bs21\efuse\efuse.csv）

   图 1 efuse.csv配置

   如图1所示，字段说明：

   - burn：

     0：当前位域不烧写；

     1：当前位域烧写。

   - name：当前EFUSE位域名字。

   - start_bit：位域起始bit位。

   - bit_width：当前位域bit长度。

   - values：烧写值。

   - lock：锁定位。

   示例：

   0,DIE_ID,0,32,0x00000000,PG0：die_id 从bit0开始，长度是32bit，不烧写；

   1,USER_EFUSE,864,8,0x000000FF,PG1：USER_EFUSE从bit864开始，长度为8bit，烧写值为0xFF。

2. 烧写文件生成

3. 调用脚本efuse_cfg_gen.py，生成efuse_cfg.bin，路径：build\config\target_config\bs21\efuse\efuse_cfg_gen.py。

4. 编译对应的application.bin，编译成功后，会将efuse_cfg.bin单独打包成fwpkg，如图2。

图 2 EFUSE烧录版本

> 说明： BS2X中，用户可配置的efuse number为108~125，长度为18Byte，即从bit864开始，长度为144bit。

## 烧录流程

准备烧写工具“BurnTool”通过BurnTool工具烧写镜像。具体步骤如下：

1. 在BurnTool界面中，单击“Option”按钮，选择“Change chip”，从“Chip List”下拉菜单中选择“BS21”，并单击“OK”即可，如图1所示。

   图 1 BurnTool更换芯片示例

2. 在BurnTool界面中，单击“COM”按钮选择PC机串口（串口选择，请参考开发板使用指南）；单击“Select file”按钮，选择各产品编译生成的固件包，并单击“OK”，如图2所示。efuse_cfg.bin为待烧录数据，烧录类型为3。

   图 2 烧录文件选择示例

3. 勾选“Auto burn”以及“Auto disconnect”选项；

   选择“Setting”→“Settings”，配置串口参数，默认配置如图3所示，baud配置为921600。

   > 说明： Force Read Time：定时读取的时间，以毫秒为单位。勾选时为定时读取串口，不勾选时为事件触发读取串口。适用于不勾选该选项无法正常烧录的场景。

   图 3 串口设置示例

   选择目标串口号并单击“Connect”按钮（单击后“Connect”变为“Disconnect”），复位单板。自动烧录效果如图4所示。

   图 4 自动烧录示意图

   等待传输完成后结束烧写，烧写完成会出现“All images burn successfully”。烧写完成效果如图5所示。

   图 5 烧写完成示意图