Skip to content

概念先知道

  • 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(校准)。

这些信息由芯片出厂时烧录,通常只读,可用于设备识别、安全特性检查等。

操作步骤

1
进入例程目录

本页不需要额外接线,直接读取芯片出厂信息。在终端进入 SDK 的 EFUSE 例程目录(前提:已按快速开始(Linux)Windows搭建好环境):

cd examples/peripherals/efuse/efuse_getinfo
2
编译工程

执行编译命令。Ai-M62(BL616)与 Ai-M61(BL618)同属一个系列,统一填写引脚最少的 bl616 即可:

make CHIP=bl616 BOARD=bl616dk
3
烧录固件

用 USB 线连接开发板,按住 BOOT 键(Ai-M61-32S-Kit 为 IO2)不放、短按 EN/RST 进入下载模式,然后执行烧录(把串口号换成实际值):

make flash CHIP=bl616 COMX=/dev/ttyUSB0
4
运行验证

打开串口助手(波特率 2000000)。例程打印 DEVICE_INFO(封装/PSRAM/Flash/版本)、CHIP_IDSIGNATURE(安全启动)、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_iduint8_t[8] 输出缓冲区

返回值:成功返回 0;失败返回负值错误码

bflb_efuse_read_secure_boot(&sign, &aes)

读取安全启动签名状态与 AES 密钥模式。

参数

  • signuint8_t * 输出签名状态(1=使能)
  • aesuint8_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 完整代码
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

Released under the MIT License. Build Time 2026-09-11 14:52:23