
有关嵌入式产品编号烧录的必要性和相关流程
2026-07-07 13:59:01
嵌入式产品的“产品编号”是什么?
嵌入式产品的产品编号通常指一个或多个用于标识设备身份的编号,常见的有:
- 硬件型号编号(Model Number / Product ID):表示产品型号,如 “SLB-001A”,用于区分不同硬件版本。
- 序列号(Serial Number):每台设备唯一的标识,如 “SN20260315001”,用于生产追溯、售后、授权控制。
- 固件版本号:标识当前烧录的软件版本,常与产品编号配合使用。
- 客户定制的物料码:根据企业编码规则生成的唯一字符串。
这些编号的共同目的是唯一标识设备、便于生产管理、售后服务和软件授权。
通常需要存储到 Flash(或其他非易失存储器)中,但不是写在“代码”里,而是放在 Flash 的特定区域。
✅ 为什么需要存储到 Flash?
- 设备断电后序列号不丢失。
- 程序运行时可以读取,用于界面显示、网络上报、授权验证等。
- 生产时每个设备写入不同的序列号,不能硬编码在固件中。
❌ 为什么不直接写死在代码里?
- 代码是通用的,同一个固件会烧录到所有设备,不能包含唯一值。
- 如果硬编码,每个设备都需要编译不同固件,效率极低且易出错。
常见的存储方案
存储位置 适用 场景特点
MCU 内部 Flash 独立区域(如最后几页) 低成本、无外部存储器 需占用部分 Flash,注意擦写寿命和代码分区
外部 EEPROM / Data Flash 需要频繁修改或寿命要求高 可靠性好,读写方便
电子标签(如 RFID、NFC) 需要物理标识和电子读取结合 非接触式,常用于防伪
安全芯片(如 ATECC508A) 需要高安全性、防克隆 序列号不可篡改,支持加密认证
OTP / eFuse(一次性写入区) 永久不变、防篡改 烧录后不可修改,适合唯一 ID
在程序里如何使用?
1. 写入(生产时操作)
通常由生产线工具(烧录工装)完成,流程如下:
- 通过串口、USB 或 SWD 发送写序列号命令。
- 程序收到指令后,将序列号写入 Flash 预留区。
- 写入后添加校验(如 CRC),防止损坏。
- 最后置标志位表示序列号已写,防止重复写入。
示例 Flash 地址划分:
0x08000000 - 0x0803FFFF : 应用程序代码 (256 KB)
0x08040000 - 0x0805FFFF : 用户数据区 (128 KB,用于存序列号、参数)
2. 读取(运行时调用)
在初始化时从固定地址读出序列号,校验通过后使用。
const char* get_serial_number(void) {
return (const char*)FLASH_SERIAL_NUMBER_ADDR;
}
3.安全注意事项
- 序列号写入区应设置读保护,防止被外部直接读出。
- 重要产品序列号可配合数字签名,防止伪造。
- 使用 OTP 区域可保证不可更改,但需提前规划。
整体生产流程
- 开发阶段
编写通用固件,代码中预留一个“产品信息区域”(如内部 Flash 的末尾扇区,或外部 EEPROM)。固件启动时会检查该区域是否已有有效编号。 - 生产烧录
将同一个固件烧录到所有设备(通过 SWD、串口 ISP 等方式),此时产品信息区域是空的(全0xFF或未初始化)。 - 生产写入编号
设备上电,固件检测到产品信息区域无效(空白),自动进入“等待写入编号”模式。
产线工人/自动化系统通过串口、USB 或专用测试点向设备发送一条指令,包含唯一的序列号。
固件收到后,将序列号写入 Flash 数据区,并校验成功,同时设置一个“已写入”标志。
写入完成后,设备重启或自动进入正常工作模式。 - 正常运行
设备再次上电时,固件从 Flash 数据区读取序列号,用于显示、上报、授权等。