杰理 SDK 文档中心
首页
首页
  • 项目概览

    • AD16N 系列芯片与 SDK 能力总览
  • 快速开始

    • 环境搭建与编译工具链
    • 编译构建指南
    • 烧录与固件升级
  • SDK 工程架构

    • SDK 目录结构与模块分层
    • 构建系统与批处理工具
    • BSP 板级支持包
  • mbox_flash 小音箱应用

    • 应用初始化与启动流程
    • 应用配置系统
    • 按键、UI 与用户交互
  • 音频子系统

    • 音频解码框架与调度
    • 音频格式解码器实现
    • MIDI 合成与播放
    • 音频编码与录音
    • EQ/DRC 与音效处理
    • DAC/ADC 音频接口与采样
  • 存储与文件系统

    • 媒体 IO 抽象层 MIO
    • 存储设备驱动
    • 文件系统支持
  • 平台系统库

    • 系统基础服务
    • CPU 平台与运行库
    • 固件升级与更新机制
    • 蓝牙与扩展连接接口
  • 电源与低功耗管理

    • 电源管理与低功耗设计
    • 锂电池充电管理
  • 硬件与文档参考

    • SDK 文档中心与版本发布记录
    • 芯片数据手册与硬件设计参考

编译构建指南

本文档介绍 fw-AD16N_GP-MCU_SDK(杰理 AD16N 系列通用 MCU SDK)的完整编译构建流程:环境搭建、工具链安装、三种编译方式(Code::Blocks / Makefile / VS Code)、编译产物与常见编译错误排查。

Purpose and Scope

本页面向首次接触 AD16N SDK 的开发者,说明如何把仓库源码编译为可烧录的固件,包括:

  • 编译前置条件与杰理工具链(clang)的安装与验证
  • Code::Blocks、Makefile 命令行、VS Code 三种编译方式的详细步骤
  • 工程结构(sdk/ 下的 Makefile、.cbp 工程、post_build/ 后处理脚本)
  • 编译命令速查、常见编译错误与解决办法
  • 编译产物的去向(post_build/ 目录)与下一步烧录指引

不在本页范围内(由兄弟页面 / README 对应章节承载):

  • 固件烧录、生产烧写与 OTA 升级 —— 详见「烧录与升级」相关页面
  • app_config.h 功能开关与芯片型号配置 —— 详见「配置说明」相关页面
  • 应用功能开发(mbox_flash 应用内部实现)—— 详见应用开发相关页面

Overview

AD16N 是杰理科技的 32 位音频 MCU 系列(AD160A/AD161A/AD162A/AD165A/AD166A/AD168A 等),SDK 采用 源码(apps/)+ 预编译库(include_lib/liba/ 下的 .a 文件) 的交付模式:应用层代码开源可改,底层解码/编码/驱动以库形式提供。因此编译必须使用与库匹配的杰理编译工具链,且需在 sdk/ 根目录下进行。

仓库的构建体系同时支持三种入口,核心都是调用同一个底层构建系统(顶层 Makefile + 杰理 clang 交叉编译工具链):

入口适用场景触发方式
Code::Blocks(.cbp 工程)Windows 用户,IDE 图形化编译Build → Build(Ctrl+F9)
Makefile 命令行Windows / Linux 用户,脚本化 / CImake -j4
VS Code已预配置任务Ctrl+Shift+B

无论哪种方式,最终产物都在 sdk/apps/app/post_build/ 目录下生成,供 USB 升级工具烧录。默认应用工程为 AD16N_mbox_flash.cbp(小音箱/音频播放应用,代码位于 sdk/apps/app/src/mbox_flash/)。

Architecture

下图展示 SDK 构建体系的整体架构:三种编译入口如何汇聚到同一套构建系统,以及从源码到固件的完整链路。

flowchart TD
    subgraph sg_Entry["编译入口 (sdk/ 根目录)"]
        CB["Code::Blocks<br/>AD16N_mbox_flash.cbp"]
        MK["Makefile 命令行<br/>make -j4"]
        VS["VS Code 任务<br/>Ctrl+Shift+B"]
    end

    subgraph sg_Build["构建系统"]
        BAT["make_prompt.bat<br/>环境变量 + make 路径"]
        MAKE["顶层 Makefile<br/>target 选择芯片型号"]
        TOOLCHAIN["杰理编译工具链<br/>clang (pi32)"]
    end

    subgraph sg_Src["源码与库"]
        APP["apps/app/src/mbox_flash<br/>应用源码"]
        LIB["apps/include_lib/liba<br/>预编译 .a 库"]
        CFG["app_config.h<br/>功能开关/芯片配置"]
    end

    subgraph sg_Out["编译产物"]
        POST["post_build/<br/>固件文件"]
    end

    CB --> MAKE
    VS --> MAKE
    MK --> BAT
    BAT --> MAKE
    MAKE --> TOOLCHAIN
    TOOLCHAIN --> APP
    TOOLCHAIN --> LIB
    MAKE --> CFG
    APP --> POST
    LIB --> POST
    POST -->|"USB 升级工具烧录"| DEV["目标板"]

架构说明:

  • 三种入口殊途同归:Code::Blocks 通过解析 .cbp 工程调用相同工具链;Makefile 命令行依赖 make_prompt.bat 预设好环境变量与 make 路径(Windows 下这是关键,否则 make 不可用);VS Code 任务则是仓库预配置的封装。
  • 工具链是硬性依赖:底层 clang(pi32 交叉编译器)必须存在,否则任何入口都无法编译(典型报错 clang: command not found)。
  • 源码 + 预编译库:应用源码(mbox_flash)与 .a 库共同链接;缺少对应 .a 文件会报 cannot find -lxxx。
  • 产物单一出口:所有编译方式的最终固件统一输出到 post_build/,随后通过 USB 升级工具或生产烧写工具写入目标板。

环境搭建

平台支持矩阵

SDK 的构建在三个平台上有不同的支持程度,官方推荐 Windows + Code::Blocks 组合:

系统编译方式说明
WindowsCode::Blocks IDE推荐方式,开箱即用
WindowsMakefile 命令行需通过 sdk/make_prompt.bat 进入预配置环境
LinuxMakefile 命令行需要重写 download_sh.c 脚本适配 Linux 环境
macOS自行配置需自行配置交叉编译工具链

设计意图:Windows 是官方主推开发环境,因此仓库内置了 make_prompt.bat 与 utils/(make、rm 等工具集),把 GNU 工具链的路径差异封装在脚本内;Linux 用户则需要自行适配 download_sh.c(该文件涉及下载/后处理流程,与 Windows 下调用方式不同)。

安装杰理编译工具链

编译的核心依赖是杰理编译工具链(内含 pi32 架构的 clang 交叉编译器)。安装步骤如下:

  1. 从杰理官方下载工具链:杰理工具在线文档
  2. Linux 用户可从此处下载:pkgman.jieliapp.com
    • 下载后解压到 /opt/jieli 目录
    • 确保 /opt/jieli/pi32/bin/clang 存在
  3. 安装完成后验证:
# 验证工具链是否安装成功
clang --version

Source: README.md

注意:工具链版本必须与仓库中预编译库(.a)匹配,混合使用不同版本的库与工具链可能导致链接错误或运行时异常。

安装烧录工具(编译完成后使用)

编译只产生固件,真正写入芯片还需要烧录工具:

工具用途获取方式
USB 升级工具将固件烧录到目标板申请链接 · 使用文档
生产烧写工具量产/裸片烧写代理商处 · 使用文档

Source: README.md

工程结构与构建入口

仓库的构建相关文件全部位于 sdk/ 目录下,核心结构如下:

fw-AD16N/
├── sdk/                           # SDK 主目录(构建工作目录)
│   ├── apps/                      # 应用层代码
│   │   ├── app/                   #   应用入口源码
│   │   │   ├── src/
│   │   │   │   └── mbox_flash/    #       小音箱/音频播放应用(默认工程)
│   │   │   ├── bsp/               #     板级支持包(BSP)
│   │   │   └── post_build/        #     编译后处理脚本与工具(固件输出目录)
│   │   └── include_lib/           #   头文件与预编译库
│   │       ├── cpu/ decoder/ encoder/ audio/ device/ common/ config/ ...
│   │       └── liba/              #     预编译库 (.a)
│   ├── tools/                     # 编译工具与脚本
│   │   ├── make_prompt.bat        #   Windows 编译命令行入口
│   │   └── utils/                 #   工具集(make、rm 等)
│   ├── Makefile                   # 顶层 Makefile(芯片 target 选择)
│   └── *.cbp                      # Code::Blocks 工程文件
└── README.md

Source: README.md

几个关键点:

  • sdk/Makefile 是命令行编译的顶层入口,芯片型号通过 Makefile target 选择(make 时指定或默认工程对应型号)。
  • sdk/apps/include_lib/liba/ 存放预编译库,编译时链接;缺失对应 .a 会导致 cannot find -lxxx。
  • sdk/apps/app/post_build/ 是固件输出目录,Code::Blocks 编译完成后固件也生成于此。
  • sdk/make_prompt.bat 是 Windows 下 Makefile 编译的"环境开关":双击进入预配置命令行,所有环境变量与 make 路径已就绪。

应用工程与代码入口

当前 SDK 默认提供一个小音箱/音频播放应用工程:

工程文件芯片应用类型代码入口
AD16N_mbox_flash.cbpAD16N 全系列小音箱 / 音频播放sdk/apps/app/src/mbox_flash/

Source: README.md

该应用覆盖音乐播放(FLASH/SD/U 盘,支持 MP3/WMA/WAV/.a/.b/.e 等格式)、MIDI 演奏、录音(MP2/UMP3/A)、USB Device、LINEIN、扩音等功能,是评估 SDK 编译与运行流程的起点。

编译方式详解

方式一:Code::Blocks(推荐 Windows 用户)

IDE 编译是最直观的方式,适合交互式开发调试:

  1. 确保已安装杰理编译工具链
  2. 双击 AD16N_mbox_flash.cbp 工程文件打开 Code::Blocks
  3. 点击 Build → Build(Ctrl+F9)触发编译
  4. 编译成功后,固件生成在 post_build/ 目录下

Source: README.md

Code::Blocks 通过 .cbp 工程文件内置了编译器路径、头文件搜索目录(include_lib/ 各子目录)与链接库列表,因此只要工具链安装正确即可一键编译。

方式二:Makefile 命令行

命令行编译适合脚本化、批处理与 CI 场景。所有命令都在 sdk/ 目录下执行:

# Windows 用户:先双击 sdk/make_prompt.bat 打开命令行环境
make -j4

# 显示编译详情(展开每条编译/链接命令)
make VERBOSE=1 -j4

# 清理编译中间产物
make clean

Source: README.md

Linux 用户流程(需要先适配 download_sh.c):

cd sdk
make -j`nproc`

Source: README.md

关于 make_prompt.bat 的设计意图:SDK 依赖 GNU make 与若干 Unix 工具(rm 等),这些在原生 Windows 命令行中通常不存在。make_prompt.bat 会把 sdk/tools/utils/(内置的 make、rm 等)与工具链路径加入 PATH,使 Windows 下 make 命令开箱可用——这就是"Windows 报错 make 不是有效命令时先运行该脚本"的根本原因。

方式三:VS Code

仓库已预配置 VS Code 构建任务,无需手工敲命令:

  1. 用 VS Code 打开仓库(或 sdk/ 目录)
  2. 按 Ctrl+Shift+B 打开任务列表
  3. 选择对应编译目标执行

Source: README.md

VS Code 任务本质上仍是调用底层 Makefile/工具链,适合习惯现代编辑器的开发者,与 Code::Blocks 共用同一套构建产物。

编译命令速查表

以下命令在 sdk/ 目录下执行:

目标命令说明
编译make -j4并行编译(4 个任务)
编译(verbose)make VERBOSE=1 -j4输出每条编译/链接命令,便于排查
清理make clean清除中间产物,重新全量编译

Source: README.md

编译后:烧录与升级(衔接)

编译得到固件后,进入烧录环节,完整流程为:

  1. 连接硬件:开发板通过 USB 或 USB 升级工具连接 PC
  2. 进入编程模式:按住烧录按键后复位/重新上电(或通过升级工具进入)
  3. 打开 USB 升级工具,选择 post_build/ 下的固件
  4. 点击下载,等待烧录完成

Source: README.md

量产场景改用杰理生产烧写工具(一拖二/一拖八),支持裸片烧写;OTA 升级支持自定义双备份固件(U 盘、SD 卡、串口等途径)。详细步骤见「烧录与升级」页面。

核心编译流程

下面的时序图展示了从克隆仓库到固件烧录的完整端到端流程,覆盖三种编译入口的公共路径:

sequenceDiagram
    participant Dev as 开发者
    participant Env as 编译环境<br/>(make_prompt.bat / IDE)
    participant Make as 顶层 Makefile
    participant Clang as 杰理工具链 clang
    participant Lib as 预编译库 (.a)
    participant Post as post_build/

    Dev->>Env: 打开命令行 / IDE / VS Code 任务
    Env->>Make: 触发构建 (make -j4 / Ctrl+F9)
    Make->>Make: 解析 target,确定芯片型号与配置
    Make->>Clang: 编译应用源码 (mbox_flash)
    Clang->>Lib: 链接预编译库 include_lib/liba
    Clang-->>Post: 输出中间目标文件
    Post->>Post: 后处理脚本 (download_sh.c) 生成固件
    Post-->>Dev: 固件就绪
    Dev->>Dev: 使用 USB 升级工具烧录到目标板

流程要点:

  • 环境准备是第一步:Windows 命令行入口必须先运行 make_prompt.bat,否则 make 不可用;IDE 方式则要求工具链已安装并加入路径。
  • Makefile 是唯一构建核心:无论从哪个入口进来,最终都归结到 sdk/Makefile 的 target 解析,因此"切换芯片型号"通过 Makefile target 完成,与入口无关。
  • 编译 = 源码 + 预编译库:mbox_flash 应用源码由 clang 编译,随后与 include_lib/liba/ 下的 .a 库链接;库文件缺失会在链接阶段报错。
  • 后处理产出固件:post_build/ 目录不仅接收链接产物,还运行后处理脚本(涉及 download_sh.c,Linux 下需重写适配),最终生成可供烧录的固件文件。

完整快速开始示例

以下是从零开始编译并烧录的完整命令序列:

# 1. 克隆仓库
git clone https://gitee.com/Jieli-Tech/fw-AD16N.git
cd fw-AD16N/sdk

# 2. 编译(Windows:先双击 sdk/make_prompt.bat)
make -j4

# 3. 需要排查时,用 verbose 模式重编
make VERBOSE=1 -j4

# 4. 固件生成于 post_build/,用 USB 升级工具烧录

Source: README.md

示例:工具链验证

编译前建议先确认工具链可用:

# 验证工具链是否安装成功
clang --version

Source: README.md

若 clang --version 报错或找不到命令,说明工具链未安装或未加入 PATH(Windows 下通过 make_prompt.bat 解决,Linux 下检查 /opt/jieli/pi32/bin 是否在 PATH 中)。

示例:Linux 并行编译

# Linux 用户(需要自行修改download_sh.c文件适配Linux)
cd sdk
make -j`nproc`

Source: README.md

-j\nproc`让并行任务数自动等于 CPU 核数,最大化编译吞吐;Windows 下建议固定-j4` 或根据核数调整,避免内存占用过高。

常见编译错误与排查

编译失败是构建流程中最常见的故障场景,下表汇总官方文档给出的错误与对应解法:

错误提示根因解决方法
clang: command not found工具链未安装,或环境变量未配置安装杰理编译工具链;Windows 下运行 make_prompt.bat,Linux 下检查 /opt/jieli/pi32/bin 路径
cannot find -lxxx缺少对应的 .a 库文件检查 apps/include_lib/liba/ 目录,确认对应库存在
make: command not foundWindows 下 make 未加入 PATH使用 sdk/tools/make_prompt.bat 打开编译命令环境(内置 make 与 rm 等工具)
链接错误Makefile target 与芯片型号不匹配检查 Makefile target 是否匹配当前芯片型号

Source: README.md

边界情况与并发注意事项

  • 平台差异是最大的边界:download_sh.c 后处理脚本按 Windows 环境编写,Linux 下必须重写适配,否则后处理阶段可能失败——这是官方明确提示的已知边界(见 README.md)。
  • 并行编译的资源占用:-j 参数决定并行任务数。任务数过大时内存/CPU 占用飙升,可能导致编译机卡顿甚至 OOM;小内存机器建议从 -j2 起步。
  • 工具链与库的匹配性:仓库为 Release 版本代码,需配合对应命名规则的 lib.a 编译;混用不匹配的库/工具链会表现为链接错误或运行期异常。
  • 清理后重建:切换芯片型号或配置后若出现"改配置不生效"的诡异问题,先执行 make clean 再全量重编,避免中间产物残留。

配置开关(与编译相关的部分)

编译行为可通过两处配置调整:

  1. 芯片型号:通过 Makefile 选择对应 target(或修改 app_config.h 中的芯片配置),用于"如何选择不同的芯片型号"(见 README.md)。
  2. 应用功能开关:编辑 sdk/apps/app/src/mbox_flash/app_config.h 可配置目标应用的功能开关,例如内置/外置 FLASH 类型切换(见 README.md)。

完整的配置项说明(ISD_CONFIG.INI 等烧录配置)见 ISD 配置说明 与「配置说明」页面。

性能与操作建议

  • 编译速度:官方建议使用 -j 并行编译,如 make -j4;多核机器可加大任务数显著缩短编译时间(README.md)。
  • 调试辅助:编译/运行期问题可通过 UART 串口日志、空闲 GPIO 输出调试波形来定位(README.md)。
  • 版本一致性:固件与烧录工具版本需匹配;升级 SDK 版本前查阅 SDK 发布版本信息 了解变更。

Related Links

  • 快速开始(仓库 README 快速开始章节对应页面:克隆仓库、工程入口)
  • 烧录与升级(首次烧录、生产烧写、OTA 升级)
  • 配置说明(app_config.h 功能开关与芯片配置)
  • README.md(仓库总览:环境搭建、工程结构、常见问题)
  • 杰理工具在线文档(工具链下载与使用手册)
  • SDK 手册(SDK 快速入门手册)
Prev
环境搭建与编译工具链
Next
烧录与固件升级