烧录与固件升级
本文档介绍 fw-AD16N_GP-MCU_SDK 的固件烧录(Flashing)与固件升级(Upgrade/OTA)机制,涵盖首次烧录、编程模式、USB 升级工具、生产烧写、OTA 升级路径以及相关配置,帮助开发者将编译产物安全地写入 AD16N 系列芯片并在产品生命周期内完成固件更新。
Purpose and Scope
本页面聚焦于"把固件放进芯片"的完整链路:编译产物(固件文件)→ 烧录工具 → 目标板(编程模式),以及量产场景的生产烧写和产品端的 OTA 升级方式。
以下相关主题属于其他目录页,不在本页展开:
- 环境搭建与工具链安装(交叉编译工具链、
clang、Code::Blocks):见"环境搭建"页 - 编译流程与固件产物生成(
make、.cbp工程、post_build/产物):见"编译指南"页 - 应用功能配置(
app_config.h功能开关):见"配置说明"页
Overview
AD16N 系列是杰理科技面向语音玩具、小音箱、通用 MCU 的音频 SoC。与普通 MCU 不同,AD16N 的存储形态分为内置系统 Flash(如 AD162A4/AD165A4 等带 4 后缀型号内置 4Mbit Flash)与外挂系统 Flash(AD16xA0 等型号通过 SPI Flash 控制器访问外置 Flash),详见 doc/README.md 选型表。这意味着烧录路径的选择(USB 直连、USB 升级工具、生产烧写器)与目标型号的 Flash 形态密切相关。
烧录与升级在 AD16N 生态中分为三个层次:
| 层次 | 场景 | 工具/方式 | 说明 |
|---|---|---|---|
| 首次烧录 | 开发调试 | USB 升级工具 | 目标板进入编程模式后由上位机写入固件 |
| 生产烧写 | 量产 | 一拖二 / 一拖八烧写器 | 支持裸片烧写,由代理商提供 |
| OTA 升级 | 产品在用户手中 | U 盘 / SD 卡 / 串口 | 自定义双备份固件升级机制 |
SDK 中固件升级(update)相关代码以预编译库 + 头文件形式提供,位于 sdk/apps/include_lib/update/ 目录,分为 code_v1(升级协议 v1)与 code_v2(升级协议 v2,含 update.ld 链接脚本)两套接口。
烧录与升级总体架构
flowchart TD
subgraph sg_Build["编译阶段"]
CBP["AD16N_mbox_flash.cbp<br/>(Code::Blocks / Makefile)"]
OUT["固件产物<br/>(post_build/ 目录)"]
CBP -->|"make / Build"| OUT
end
subgraph sg_Dev["开发烧录"]
TOOL["USB 升级工具<br/>(上位机)"]
USB["USB 连接"]
MODE["目标板编程模式<br/>(按键+复位 / 工具强制进入)"]
CHIP["AD16N 芯片<br/>(内置/外置 Flash)"]
OUT -->|"选择固件"| TOOL
TOOL -->|"USB"| USB
USB --> MODE
MODE --> CHIP
end
subgraph sg_Prod["量产烧写"]
BURNER["一拖二 / 一拖八烧写器"]
BARE["裸片/空片"]
OUT --> BURNER
BURNER --> BARE
end
subgraph sg_OTA["OTA 升级"]
MEDIA["U 盘 / SD 卡 / 串口"]
DUAL["双备份固件区<br/>(备份A/备份B)"]
MEDIA -->|"升级包"| DUAL
DUAL --> CHIP
end
CHIP -->|"运行期"| sg_OTA
架构说明: 编译阶段产生固件产物后,开发阶段通过 USB 升级工具 + 编程模式写入芯片;量产阶段通过专用烧写器批量写入(可裸片烧写);产品运行期则通过 U 盘/SD 卡/串口将升级包写入双备份固件区,实现 OTA 升级。双备份机制的意义在于:即使升级过程中断电或写入失败,芯片仍可从另一备份区启动,避免产品变砖——这是 README 中"自定义双备份固件升级"的设计意图。
首次烧录(开发调试)
首次烧录是开发阶段最常用的操作,README 第八节给出了标准流程(README.md#L282-L303):
- 连接硬件:将开发板通过 USB 或 USB 升级工具 连接到 PC
- 进入编程模式:
- 方式一(USB):按住开发板上的烧录按键,然后复位或重新上电
- 方式二(USB/UART):通过 USB 升级工具进入编程模式
- 打开 USB 升级工具:启动烧录上位机
- 选择固件:选择编译生成的固件文件
- 开始烧录:点击下载按钮,等待烧录完成
编程模式(Program Mode)
编程模式是烧录的前提。AD16N 支持两种进入方式:
- 按键 + 复位:按住烧录按键的同时复位或重新上电,芯片上电引导(Boot ROM)检测到烧录请求后停留在编程模式,等待上位机写入
- 工具强制进入:USB 升级工具通过 USB/UART 通道强制目标进入编程模式,适合没有物理按键的开发板
设计意图:芯片出厂时 Flash 为空或仅含引导代码,因此必须由芯片内部 Boot ROM 支持最低限度的烧录协议;进入编程模式后用户程序尚未运行,USB/串口通道由引导代码接管,保证"空片可烧、坏片可救"。
USB 升级工具
USB 升级工具(上位机软件)是开发阶段的标准烧录入口,其获取与使用方式:
| 项目 | 说明 |
|---|---|
| 工具名称 | USB 升级工具(强制升级工具) |
| 获取方式 | 官方淘宝链接 |
| 使用文档 | 强制升级工具文档 |
| 配套配置 | ISD_CONFIG.INI(INI 配置说明) |
注意:烧录前请确保 USB 升级工具正确连接且目标板已进入编程模式。
ISD_CONFIG.INI中可配置烧录相关的 Flash 分区、升级协议版本等参数,详见杰理在线文档。
首次烧录时序
sequenceDiagram
participant PC as PC 上位机
participant TOOL as USB 升级工具
participant CHIP as AD16N 芯片
participant FLASH as Flash (内置/外置)
PC->>TOOL: 启动工具、选择固件
CHIP->>CHIP: 上电/复位,检测烧录按键或工具握手
Note over CHIP: Boot ROM 进入编程模式
TOOL->>CHIP: USB 握手,建立烧录会话
TOOL->>CHIP: 发送固件数据
CHIP->>FLASH: 擦除并写入目标分区
FLASH-->>CHIP: 校验完成
CHIP-->>TOOL: 烧录成功应答
TOOL-->>PC: 显示烧录完成
CHIP->>CHIP: 复位,跳转用户程序
时序说明:整个烧录由芯片引导代码主导而非用户程序,因此无论用户固件是否可用,烧录通道始终可用。固件写入后通常包含校验步骤(应答机制),失败时上位机会报错并允许重试。
生产烧写(量产)
量产场景不适用于逐台 USB 烧录,README 明确要求使用杰理生产烧写工具:
量产场景请使用杰理生产烧写工具(一拖二 / 一拖八),支持裸片烧写。详见 一拖二烧写器使用说明 · 一拖八烧写器使用说明
要点:
- 裸片烧写:烧写器可在芯片贴片前对空片写入固件,无需目标板供电与按键
- 一拖多:同时烧写多片,提升产线效率
- 工具获取:烧写器及配套软件由代理商提供,而非公共下载渠道
- 烧录源:生产烧写与开发烧录使用同一份编译产物(
post_build/下生成的固件)
设计意图:量产工具链与开发工具链分离,是为了在保证烧录一致性的同时,把"进入编程模式"的硬件交互(按键、复位时序)交由产线治具自动处理,减少人工操作导致的良率损失。
OTA 升级
产品交付到用户手中后,固件更新通过 OTA 完成。README 对 OTA 的定位是:
支持自定义双备份固件升级,常见方式包括 U 盘升级、SD 卡升级、串口升级等。
双备份升级机制
flowchart TD
START([运行中的固件]) --> CHECK{"检测到升级包?"}
CHECK -->|"U盘 / SD卡 / 串口"| BACKUP["写入非活动备份区"]
CHECK -->|"未检测到"| RUN["正常运行"]
BACKUP --> VERIFY{"校验通过?"}
VERIFY -->|"是"| SWITCH["切换启动标志<br/>指向新固件"]
VERIFY -->|"否"| KEEP["保留旧固件<br/>继续运行"]
SWITCH --> REBOOT([复位启动新固件])
KEEP --> RUN
双备份的设计意图:Flash 中划分两个固件区(备份 A / 备份 B)。升级时只写非当前运行的备份区,写完校验后再切换启动标志。这样:
- 升级包写入过程中断电 → 当前固件区未受影响,产品仍可启动
- 新固件校验失败 → 启动标志不切换,回退到旧固件
- 新固件启动异常 → 引导代码可回滚到上一备份区
这是"自定义"的含义——分区布局、切换策略均由 SDK 的 update 库与 ISD_CONFIG.INI 配置决定,开发者可根据 Flash 容量(内置 2Mbit/4Mbit 或外挂 Flash)灵活调整。
OTA 传输介质
| 介质 | 适用场景 | 特点 |
|---|---|---|
| U 盘(USB MSD) | 带 USB 口的音箱、故事机 | 用户拷贝升级文件到 U 盘插入即升级 |
| SD 卡 | 插卡类产品 | 升级包随音乐文件一起拷贝 |
| 串口(UART) | 带调试口的设备 | 由上位机通过串口下发升级包 |
SDK 中的升级库结构
SDK 以"头文件 + 预编译库"形式提供升级能力,目录结构如下(sdk/apps/include_lib/update/):
| 文件 | 版本 | 作用(依据文件命名) |
|---|---|---|
code_v1/update_v1.h | 升级协议 v1 | v1 版升级 API 头文件 |
code_v2/update.h | 升级协议 v2 | v2 版升级主 API 头文件 |
code_v2/dev_update.h | 升级协议 v2 | 设备端升级接口头文件 |
code_v2/update.ld | 升级协议 v2 | 升级代码段的链接脚本(指定升级代码的 Flash 布局) |
说明:
include_lib/中的库以预编译.a形式提供,头文件定义了调用接口;具体 API 签名与调用示例见随 SDK 发布的《AD16N_开源SDK手册_V1.2.pdf》(doc/目录)。本仓库未包含升级引擎的源码实现,升级协议细节由预编译库封装。
update.ld 的存在说明 v2 升级代码在链接期被放置在专门的 Flash 段中——这是双备份机制在链接层面的落地:升级代码本身需要固定地址,才能在不同固件版本间保持兼容。
固件产物与烧录源
编译成功后固件生成在 post_build/ 目录(README.md#L252-L257):
编译成功后在 post_build/ 目录下生成固件
该固件是烧录与升级的唯一"源":开发烧录、生产烧写、OTA 升级包均基于它生成。因此先编译、后烧录是固定顺序;烧录前确认固件生成时间戳与源码版本一致,可避免"烧了旧固件"的常见问题。
固件类型与 Flash 适配
AD16N 芯片分内置 Flash 与外挂 Flash 两种形态(doc/README.md):
- 内置 Flash 型号(如 AD162A4、AD165A4、AD160A4、AD166A4,内置 2Mbit/4Mbit):烧录目标为芯片内置 Flash,无需外接存储
- 外挂 Flash 型号(如 AD162A0、AD165A0 等
0后缀):通过 SPI Flash 控制器访问外置 Flash,烧录时需保证外挂 Flash 已焊接且型号受支持
选择芯片型号通过 Makefile target 或 app_config.h 配置完成,烧录工具读取固件头中的型号信息决定烧录算法,因此编译时选错芯片型号会导致烧录失败或运行异常。
配置选项
烧录与升级涉及两类配置:编译期配置(决定固件内容)与烧录工具配置(决定写入行为)。
编译期配置
| 配置项 | 位置 | 说明 |
|---|---|---|
| 芯片型号 | Makefile target / sdk/apps/app/src/mbox_flash/app_config.h | 决定固件头与 Flash 布局,选错会导致烧录失败 |
| 功能开关 | app_config.h | 影响固件大小,进而影响能否装入目标 Flash 分区 |
| Flash 类型(内置/外置) | app_config.h | 外置 Flash 通过 SPI Flash 控制器访问(README.md#L319-L320) |
| 升级协议版本 | 链接 update 库版本(v1/v2) | 通过 include_lib/update/code_v1 或 code_v2 选择 |
烧录工具配置
| 配置项 | 类型 | 说明 |
|---|---|---|
ISD_CONFIG.INI | 烧录工具配置文件 | 配置 Flash 分区、烧录参数等,见 INI 配置说明 |
ISD_CONFIG.INI由 USB 升级工具/生产烧写器读取,决定了固件写入芯片的物理分区布局;双备份升级的分区规划同样与之相关。该文件不属于本仓库源码,具体字段请查阅杰理在线文档。
使用示例
环境验证(烧录前检查)
# 验证工具链是否安装成功
clang --version
Source: README.md#L102-L105
烧录前先确认编译工具链可用——工具链缺失时无法产出固件,烧录自然无从谈起。
获取源码并编译固件
git clone https://gitee.com/Jieli-Tech/fw-AD16N.git
cd fw-AD16N/sdk
Source: README.md#L126-L129
# Windows 用户
双击 sdk/make_prompt.bat 打开命令行环境
# 编译
make -j4
# 显示编译详情
make VERBOSE=1 -j4
Source: README.md#L156-L164
编译成功后,post_build/ 目录下的固件即为烧录输入(README.md#L252-L257)。
烧录操作(README 标准流程)
1. 连接硬件:开发板通过 USB 或 USB 升级工具连接到 PC
2. 进入编程模式:
- 方式一(USB):按住烧录按键,然后复位或重新上电
- 方式二(USB/UART):通过 USB 升级工具进入编程模式
3. 打开 USB 升级工具,选择编译生成的固件
4. 点击下载按钮,等待烧录完成
Source: README.md#L284-L292
失败模式与边界情况
以下失败场景与处理方式基于 README 中的明确说明与烧录机制的必然约束:
| 失败模式 | 现象 | 原因与处理 |
|---|---|---|
| 未进入编程模式 | 上位机无法连接目标板 | 未按住烧录按键或未复位;改用 USB 升级工具强制进入编程模式(README.md#L287-L289) |
| 烧录前未连接工具 | 下载失败 | README 提示"编译前请确保 USB 升级工具正确连接且目标板已进入编程模式"(README.md#L166) |
| 芯片型号不匹配 | 烧录失败或运行异常 | Makefile target / app_config.h 与实物芯片不一致(README.md#L278) |
| Flash 形态选错 | 内置/外置 Flash 访问异常 | 需在配置中指定 Flash 类型,外置 Flash 经 SPI 控制器访问(README.md#L319-L320) |
| OTA 写入中断 | 新固件不可用 | 双备份机制保证旧固件区不受影响,可回退启动 |
| Linux 编译烧录 | 脚本报错 | 需重写 download_sh.c 适配 Linux 环境(README.md#L91) |
并发与一致性
- 烧录过程是独占式的:编程模式下用户程序不运行,不存在与业务逻辑的并发问题;但烧录期间断电可能产生半写入状态,因此量产产线应保证供电稳定
- OTA 升级的一致性由双备份 + 启动标志切换保证:写入与切换不是原子的,但任意时刻至少有一个完整可启动的固件区
- 生产烧写器一拖多烧写时,各通道独立,单通道失败不影响其他通道
扩展与自定义
- OTA 介质扩展:README 列出的 U 盘/SD 卡/串口是"常见方式",开发者可基于 update 库(
code_v2/update.h、dev_update.h)对接其他传输通道(如私有云、BLE) - 双备份布局自定义:通过
update.ld与ISD_CONFIG.INI调整固件分区大小与地址,适配不同 Flash 容量 - 升级协议选择:
code_v1与code_v2两套接口并存,兼容不同时期烧录工具/上位机