> 技术文档 > 小智AI嵌入式merge.bin文件制作小结_小智ai1.7.6固件

小智AI嵌入式merge.bin文件制作小结_小智ai1.7.6固件


前言

有一定开发能力的同学,如只需要看命令,移步下方 固件归并 小标题

作为当下大火的开源嵌入式项目,小智AI机器人大家或许都有所耳闻。

其中,嵌入式硬件的固件烧录方式大致有两种。

源码烧录固件烧录

原理基本上一致,均为生成二进制bin文件,然后烧录到mcu的对应内存地址。

但是仔细观察能发现,虾哥官方给出的‍​‌‌⁠‬​⁠‬​‍‬​​​​​​‍‍‌‬​​⁠​⁠​​​‌‍​⁠​​‬v1.7.6 小智AI终端最新版本固件下载 - 飞书云文档
均为mergebinary.bin,是归并后的二进制文件,而自己的源码编译出的build中则为多个bin文件。

教程

实际上,要制作merge后的固件很简单,idf已经给我们准备好了相应的命令。

在我们完成源码的编译和烧录测试后,代码能在开发板上正常运行,且产生了build文件夹以及对应bin文件,即可使用idf命令制作单一的固件。

前情提要

开发板选用:立创实战派s3

MCU为:S3-1-N16R8

因此命令需要参考16M的分区表

注:如有从事python开发,接下来的操作需要保证python环境为idf的python,如有虚拟环境(例如conda),手动执行关闭命令(如conda deactivate),否则会导致找不到idf

固件归并

idf离线版:直接从终端输入

idf vscode插件版:点击下方图标打开终端

输入命令,即可在build目录下找到merge.bin文件,直接使用烧录器软件进行烧录即可(约5分钟)
注:本项目基于1.7.5版本代码,在1.7.6版本中 ota0分区参数有变化,需要修改为0x100000

esptool.py --chip esp32s3 merge_bin --output build/merge.bin --flash_mode dio --flash_size 16MB --flash_freq 80m 0x0 build/bootloader/bootloader.bin 0x8000 build/partition_table/partition-table.bin 0xd000 build/ota_data_initial.bin 0x10000 build/srmodels/srmodels.bin 0x410000 build/xiaozhi.bin

注:如果不熟悉命令行,在下图的烧录器软件选择所有需要烧录的固件并且填写好对应地址,点击CombineBin效果同理。

进阶:如果使用命令烧录

在VSCode IDF插件终端中,您可以使用以下命令烧录这个合并文件:

esptool.py --chip esp32s3 --port COM端口号 --baud 921600 --before default_reset --after hard_reset write_flash 0x0 build/merge.bin

成果展示

命令解读

如需要对是s3N8,c3或p4等制作merge固件,需要自行参考下列信息进行命令修改,本人只保证s3N16R8可直接通过此文档完成复刻。

命令结构

esptool.py [芯片类型] [操作] [输出] [闪存配置] [偏移量+文件] [偏移量+文件] ...

参数详解

🔧 基础参数

  • --chip esp32s3 → 指定芯片类型
  • merge_bin → 合并bin文件操作
  • --output build/merge.bin → 输出文件路径

⚡ 闪存配置

  • --flash_mode dio → 双线输入输出模式
  • --flash_size 16MB → 闪存大小
  • --flash_freq 80m → 闪存频率80MHz

📍 文件映射

  • 0x0 build/bootloader/bootloader.bin → 启动引导程序
  • 0x8000 build/partition_table/partition-table.bin → 分区表
  • 0xd000 build/ota_data_initial.bin → OTA数据
  • 0x10000 build/srmodels/srmodels.bin → 语音模型
  • 0x410000 build/xiaozhi.bin → 主应用程序
核心原理

按偏移地址顺序将多个bin文件拼接成一个完整的固件镜像

tips

🔧 硬件规定地址

1. Bootloader 固定地址

0x0 → 硬件固定,不可更改

  • ESP32-S3芯片上电后必须从0x0开始执行
  • 这是芯片ROM引导程序的硬性要求

2. 分区表标准地址

0x8000 → ESP-IDF框架标准约定

  • 所有ESP32系列都使用此地址
  • Bootloader会在此位置查找分区表

3.关于ota_1

ota_1本身就是空分区 无ota文件 不需要在merge时候写入参数