Skip to content

概念先知道

  • 软件复位:程序主动调用复位接口让芯片重新启动,常用于“配置生效后重启”“OTA 升级完成后重启”等场景。
  • 两种复位 APIbl_sys_reset_system()(软件复位,立即重启系统)与 bl_sys_reset_por()(模拟上电复位,复位程度更深,可清除更多外设状态)。
  • 复位计数:复位后程序重新从 main 运行,内存中的计数会清零,所以看到计数从头开始就说明复位成功。
  • 注意循环复位:无条件在 main 开头调用复位 API 会让芯片无限重启(“复位循环”),示例用计数控制复位时机。

例程功能简介

本页为自编示例(SDK 无独立软件重启例程),基于芯片系统驱动 bl_sys_reset_por() / bl_sys_reset_system() 编写:

  • main 里用静态计数模拟“工作一段时间”;
  • 计数到 3 时打印提示,调用 bl_sys_reset_system() 软件复位;
  • 串口可观察到“计数 0→3 → 复位 → 计数 0→3 → 复位”的循环;
  • 示例代码中 bl_sys_reset_por() 已被注释,取消注释即可对比更彻底的“模拟上电复位”。

提示

自编示例仅作为学习参考:API 名称与 SDK 头文件(bl616_sys.h)一致,但官方 SDK 仓库中没有同名例程。实际项目中“OTA 后重启”等场景还要配合分区切换、标志位保存,避免无限重启。

操作步骤

1
新建工程目录

SDK 没有独立的软件重启例程,本页示例为自编示例。在 SDK 的 examples 下新建工程目录,并创建 main.cMakefile

cd examples
mkdir soft_reboot_demo
cd soft_reboot_demo
2
编写代码

用编辑器把本页「完整代码」中的 main.c 保存到 soft_reboot_demo/main.c,再创建 Makefile(内容见下方「编译工程」提示):

vim main.c
3
编译工程

自编工程需要仿照其他例程提供 MakefileFreeRTOSConfig.h(本示例未用到 FreeRTOS,FreeRTOSConfig.h 可省略)。最小 Makefile 可参考:

# Makefile(放在 soft_reboot_demo 目录,位于 examples 下一层)
SDK_DEMO_PATH ?= $(abspath .)
BL_SDK_BASE ?= $(abspath ./../..)
export BL_SDK_BASE

include $(BL_SDK_BASE)/project.build

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

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

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

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

打开串口助手(波特率 2000000)。程序启动后打印计数,计数到 3 时打印 soft reset by bl_sys_reset_system 并复位;重启后计数从 0 重新开始,到 3 时再次复位,如此循环。把代码中的 bl_sys_reset_system() 换成 bl_sys_reset_por() 重新编译烧录,可对比两种复位方式。

代码执行流程

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

例程调用的 API 介绍

bl_sys_reset_system()

软件复位:触发系统复位,程序从头执行。复位后 main 中的局部/全局变量重新初始化。

参数:无

返回值void(复位发生后不会返回)

bl_sys_reset_por()

模拟上电复位(Power-On Reset):复位程度比软件复位更深,外设与电源域状态恢复得更彻底。

参数:无

返回值int(复位成功不会返回)

bl_sys_rstinfo_get()

读取本次复位原因(如软件复位、看门狗复位、掉电复位等),返回 BL_RST_REASON_E 枚举。实际项目中常在启动时读取,判断“为什么重启了”。

参数:无

返回值BL_RST_REASON_E 复位原因枚举

完整代码

以下为自编示例 soft_reboot_demo/main.c 完整代码(SDK 无同名官方例程,API 与 bl616_sys.h 一致),默认折叠,点击展开:

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

int main(void)
{
    static uint32_t count = 0;

    board_init();

    while (1) {
        count++;
        printf("reboot count = %lu\r\n", count);

        if (count >= 3) {
            printf("soft reset by bl_sys_reset_system\r\n");
            bflb_mtimer_delay_ms(100);

            /* 软件复位:立即重启系统 */
            bl_sys_reset_system();

            /* 更彻底的“模拟上电复位”,可取消注释对比效果 */
            // bl_sys_reset_por();
        }

        bflb_mtimer_delay_ms(1000);
    }
}

FAQ

调用复位 API 后程序卡住不重启

确认 API 所在的头文件已包含(bl616_sys.h),且编译链接到了系统驱动。若自定义工程缺少驱动,可先复制 examples/helloworld 工程,在其基础上替换 main.c

程序无限循环复位

复位后程序从头执行,如果代码无条件调用复位 API 就会死循环重启。示例用计数控制;实际项目可在 Flash 保存“需要重启”的标志位,重启后先清除标志再决定是否继续复位。

bl_sys_reset_system 与 bl_sys_reset_por 怎么选

一般软件复位用 bl_sys_reset_system();需要更彻底恢复外设/电源状态时用 bl_sys_reset_por()。两者都会清空运行内存,区别主要在复位深度。

遇到问题?

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

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