Skip to content

概念先知道

  • Secure Debug(安全调试):给芯片调试口(JTAG)加“锁”,防止未授权调试访问固件与敏感数据。
  • 密码模式:设密码并触发后,JTAG 连接必须提供密码;忘记密码且无备份时调试口可能永久受限。
  • 烧录不受影响:UART/BSP 下载通道与 JTAG 密码保护无关,密码模式下仍可正常烧录固件。

例程功能简介

本页对应博流官方 SDK 的 sec_dbg_password 例程(examples/peripherals/sec_dbg/sec_dbg_password),演示安全调试(Secure Debug)密码保护

  • 启动时读取当前调试状态并打印:open mode(JTAG 可用)/ password mode(需密码)/ close mode(关闭);
  • 延时 10 秒后写入 4 组调试密码并触发(Sec_Dbg_Set_Dbg_Pwd + Sec_Dbg_Set_Dbg_Trigger),等待就绪后状态切换为 password mode
  • 进入 password mode 后,通过 JTAG 调试器连接需要提供密码,防止调试口被未授权访问。

操作步骤

1
进入例程目录

本页不需要额外接线。在终端进入 SDK 的安全调试例程目录(前提:已按快速开始(Linux)Windows搭建好环境):

cd examples/peripherals/sec_dbg/sec_dbg_password
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)。例程先打印当前调试状态(Sec dbg is in open mode,此时 JTAG 可用);10 秒后写入 4 组密码并触发,再次打印状态变为 password mode(JTAG 需要密码才能访问)。

代码执行流程

例程从启动到运行的完整流程如下(图中的循环箭头表示反复执行):

注意

该例程会修改芯片安全调试状态。量产/交付前请按产品安全策略确认密码与状态,误操作可能导致调试口永久受限。

例程调用的 API 介绍

Sec_Dbg_Read_Dbg_State()

读取当前安全调试状态:SEC_DBG_STATE_OPEN_MODE / SEC_DBG_STATE_PASSWORD_MODE / SEC_DBG_STATE_CLOSE_MODE

参数:无

返回值:调试状态枚举值

Sec_Dbg_Set_Dbg_Pwd(pwd)

写入调试密码(4 个 32 位字)。

参数

  • pwduint32_t[4] 密码数组

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

Sec_Dbg_Set_Dbg_Trigger()

触发密码模式生效。

参数:无

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

Sec_Dbg_Wait_Ready()

等待安全调试模块就绪(状态切换完成)。

参数:无

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

完整代码

以下为 sec_dbg_password/main.c 完整源码,与官方示例(examples/peripherals/sec_dbg/sec_dbg_password)一致;点灯引脚已适配 Ai-M61/62-32S-Kit 板载 RGB 灯,默认折叠,点击展开:

📜 点击展开 sec_dbg_password/main.c 完整代码
c
#include "bflb_mtimer.h"
#include "board.h"
#include "bl616_sec_dbg.h"

static void bflb_show_dbg_state(void)
{
    uint32_t state;

    state = Sec_Dbg_Read_Dbg_State();

    if(state == SEC_DBG_STATE_OPEN_MODE){
        printf("Sec dbg is in open mode\r\n");
        printf("JTAG should be available\r\n");
    }else if(state == SEC_DBG_STATE_PASSWORD_MODE){
        printf("Sec dbg is in password mode, need password\r\n");
        printf("JTAG should be unavailable\r\n");
    }else if(state == SEC_DBG_STATE_CLOSE_MODE){
        printf("Sec dbg is in close mode\r\n");
    }else{
        printf("Error! Not support!\r\n");
    }
}

int main(void)
{
    uint32_t pwd[4] = {0x12345678, 0x22345678, 0x32345678, 0x42345678};

    board_init();

    printf("password case:\r\n");

    /* Password mode, JTAG can not be connected */
    bflb_show_dbg_state();

    bflb_mtimer_delay_ms(10000);

    /* Set password */
    Sec_Dbg_Set_Dbg_Pwd(pwd);
    Sec_Dbg_Set_Dbg_Trigger();
    Sec_Dbg_Wait_Ready();

    /* Open mode, JTAG can be connected */
    bflb_show_dbg_state();

    while (1) {
        bflb_mtimer_delay_ms(1000);
    }
}

FAQ

密码模式生效后还能烧录吗

烧录走的是 UART/BSP 下载通道,不受 JTAG 密码保护影响;但 JTAG 调试需要密码。忘记密码且未留存备份时,调试口可能无法恢复,请谨慎操作。

如何回到 open mode

本页例程只演示 open→password 单向切换。恢复 open mode 需按芯片安全规范执行解锁流程(通常需要烧录对应固件/校验密码),具体参考博流安全文档。

状态打印显示 close mode

说明芯片已被配置为调试关闭状态,JTAG 完全不可用;该状态一般由量产工具写入,属预期安全行为。

遇到问题?

如有其他问题,请到统一的提问与讨论区:Ai-Thinker Discussions

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