概念先知道
- EFUSE:芯片出厂时烧录的“身份证”,记录封装、Flash/PSRAM 配置、芯片 ID、安全启动等只读信息。
- OTP:一次性可编程——正常情况下只能读;特殊流程可写,但写入不可逆,量产操作需谨慎。
- CHIP_ID:每颗芯片唯一的 ID,可做设备注册、防伪与授权绑定。
例程功能简介
本页对应博流官方 SDK 的 efuse_getinfo 例程(examples/peripherals/efuse/efuse_getinfo),演示读取芯片 EFUSE 出厂信息:
- 读取设备信息:封装类型、PSRAM/Flash 配置、芯片版本;
- 读取 64 位 CHIP_ID(芯片唯一 ID);
- 读取安全启动签名状态与 AES 密钥模式(无/128/192/256);
- BL616 额外打印处理器 process corner(工艺角)。
- 同族例程(
examples/peripherals/efuse/):efuse_rw(读写)、efuse_trim(校准)。
这些信息由芯片出厂时烧录,通常只读,可用于设备识别、安全特性检查等。
操作步骤
本页不需要额外接线,直接读取芯片出厂信息。在终端进入 SDK 的 EFUSE 例程目录(前提:已按快速开始(Linux)或Windows搭建好环境):
cd examples/peripherals/efuse/efuse_getinfo执行编译命令。Ai-M62(BL616)与 Ai-M61(BL618)同属一个系列,统一填写引脚最少的 bl616 即可:
make CHIP=bl616 BOARD=bl616dk用 USB 线连接开发板,按住 BOOT 键(Ai-M61-32S-Kit 为 IO2)不放、短按 EN/RST 进入下载模式,然后执行烧录(把串口号换成实际值):
make flash CHIP=bl616 COMX=/dev/ttyUSB0打开串口助手(波特率 2000000)。例程打印 DEVICE_INFO(封装/PSRAM/Flash/版本)、CHIP_ID、SIGNATURE(安全启动)、AES_MODE 以及处理器 corner 信息。
代码执行流程
例程从启动到运行的完整流程如下(图中的循环箭头表示反复执行):
例程调用的 API 介绍
bflb_device_get_by_name("ef_ctrl")
获取 EFUSE 控制外设的设备句柄。
参数:
name:外设名称,固定"ef_ctrl"
返回值:struct bflb_device_s * 设备句柄;驱动未加载时为 NULL
bflb_efuse_get_device_info(&device_info)
读取设备出厂信息到 bflb_efuse_device_info_type,包含封装、PSRAM/Flash、版本等字段。
参数:
info:输出结构体指针
返回值:成功返回 0;失败返回负值错误码
bflb_efuse_get_chipid(chip_id)
读取芯片唯一 ID(8 字节,打印时去掉末尾 2 字节)。
参数:
chip_id:uint8_t[8]输出缓冲区
返回值:成功返回 0;失败返回负值错误码
bflb_efuse_read_secure_boot(&sign, &aes)
读取安全启动签名状态与 AES 密钥模式。
参数:
sign:uint8_t *输出签名状态(1=使能)aes:uint8_t *输出 AES 模式(0=无 / 1=128 / 2=192 / 3=256)
返回值:成功返回 0;失败返回负值错误码
完整代码
以下为 efuse_getinfo/main.c 完整源码,与官方示例(examples/peripherals/efuse/efuse_getinfo)一致;点灯引脚已适配 Ai-M61/62-32S-Kit 板载 RGB 灯,默认折叠,点击展开:
📜 点击展开 efuse_getinfo/main.c 完整代码
#include "bflb_mtimer.h"
#include "board.h"
#include "bflb_efuse.h"
bflb_efuse_device_info_type device_info;
uint8_t chip_id[8];
uint8_t sign;
uint8_t aes;
const char *aes_mode[] = {"AES-NO", "AES-128", "AES-192", "AES-256"};
int main(void)
{
struct bflb_device_s *efuse_dev;
board_init();
efuse_dev = bflb_device_get_by_name("ef_ctrl");
if (NULL == efuse_dev) {
printf("efuse device driver not found!\r\n");
while (1);
}
bflb_efuse_get_device_info(&device_info);
bflb_efuse_get_chipid(chip_id);
bflb_efuse_read_secure_boot(&sign, &aes);
/* printf device_info */
printf("DEVICE_INFO:\r\n");
printf(" PACKAGE: %s\r\n", device_info.package_name);
#if !defined(BL602)
printf(" PSRAM: %s\r\n", device_info.psram_info_name);
#endif
printf(" FLASH: %s\r\n", device_info.flash_info_name);
#if !defined(BL702) && !defined(BL702L)
printf(" VERSION: %d\r\n", device_info.version);
#endif
printf("CHIP_ID:\r\n ");
for (int i = 0; i < sizeof(chip_id) / sizeof(chip_id[0]) - 2; i++) {
printf(" %02X", chip_id[i]);
}
printf("\r\n");
printf("SIGNATURE:\r\n ");
if (sign) {
printf("ENABLE\r\n");
} else {
printf("DISABLE\r\n");
}
printf("AES_MODE:\r\n %s\r\n", aes_mode[aes]);
#if defined(BL616)
/* process corner */
printf("processor corner = %d, %s\n", device_info.process_corner, device_info.process_corner_name);
#endif
while (1) {
bflb_mtimer_delay_ms(1000);
}
}FAQ
提示 efuse device driver not found
说明板级配置没有使能 EFUSE 驱动。检查 board.h/Kconfig 中相关外设是否开启,或确认编译的 CHIP 型号。
CHIP_ID 有什么用途
CHIP_ID 每颗芯片唯一,可用于设备注册、防伪校验、许可证绑定等;打印时注意例程默认去掉末尾 2 字节。
EFUSE 可以写入吗
EFUSE 属于一次性可编程(OTP)存储,写入后不可恢复。本例程只读,量产场景如需写 EFUSE 请参考官方安全文档并谨慎操作。
遇到问题?
如有其他问题,请到统一的提问与讨论区:Ai-Thinker Discussions

