量产优化:如何在烧录过程中写入指定NVS值
实现方案:合并ESP32固件烧录与NVS序列号写入
核心思路
ESP32的NVS存储对应独立分区,你可以先将序列号打包为符合NVS格式的二进制文件,再通过esptool.py依次完成通用固件烧录和NVS二进制文件烧录,实现一步到位的量产操作。
具体步骤
1. 确认NVS分区的偏移地址
查看你的ESP32项目partition_table.csv,找到NVS分区的offset值(默认通常为0x9000,需以实际配置为准)。示例分区表行:
nvs, data, nvs, 0x9000, 0x6000,
其中0x9000是NVS分区起始偏移,0x6000是分区大小。
2. 生成含序列号的NVS二进制文件
使用ESP-IDF自带的nvs_partition_generator.py工具(路径为ESP-IDF目录/components/nvs_flash/nvs_partition_generator)生成NVS格式文件:
2.1 动态生成配置文件
通过脚本接收序列号参数,生成临时配置文件(示例用Shell脚本):
SERIAL=$1 cat > sn_config.csv << EOF key,type,encoding,value sn,data,string,$SERIAL EOF
2.2 生成NVS二进制
调用工具生成对应二进制:
python $IDF_PATH/components/nvs_flash/nvs_partition_generator/nvs_partition_gen.py generate sn_config.csv sn.bin 0x6000
注意:0x6000需与你分区表中NVS的大小一致。
3. 合并烧录流程
在脚本中依次执行固件烧录和NVS二进制烧录:
# 烧录通用固件(替换为你的固件路径,默认偏移0x1000) esptool.py --chip esp32 write_flash 0x1000 your_general_firmware.bin # 烧录NVS二进制到对应偏移 esptool.py --chip esp32 write_flash 0x9000 sn.bin
4. 完整Shell脚本示例
将上述步骤整合为可执行脚本(flash_with_sn.sh):
#!/bin/bash if [ $# -ne 1 ]; then echo "用法: $0 <序列号>" exit 1 fi SERIAL=$1 IDF_PATH="/path/to/your/esp-idf" # 替换为你的ESP-IDF路径 FIRMWARE_PATH="your_general_firmware.bin" # 替换为通用固件路径 NVS_OFFSET="0x9000" # 替换为你的NVS分区偏移 NVS_SIZE="0x6000" # 替换为你的NVS分区大小 # 生成临时NVS配置文件 cat > sn_config.csv << EOF key,type,encoding,value sn,data,string,$SERIAL EOF # 生成NVS二进制文件 python $IDF_PATH/components/nvs_flash/nvs_partition_generator/nvs_partition_gen.py generate sn_config.csv sn.bin $NVS_SIZE # 合并烧录固件与NVS esptool.py --chip esp32 write_flash 0x1000 $FIRMWARE_PATH $NVS_OFFSET sn.bin # 清理临时文件 rm sn_config.csv sn.bin echo "烧录完成,序列号已设置为: $SERIAL"
5. 验证方法
烧录后可读取并解析NVS分区确认结果:
# 读取NVS分区到本地文件 esptool.py --chip esp32 read_flash $NVS_OFFSET $NVS_SIZE read_nvs.bin # 解析NVS内容 python $IDF_PATH/components/nvs_flash/nvs_partition_generator/nvs_partition_gen.py parse read_nvs.bin parsed_nvs.csv
查看parsed_nvs.csv即可确认序列号是否写入成功。
注意事项
- 提前配置ESP-IDF环境变量(执行
source $IDF_PATH/export.sh),确保esptool.py和nvs_partition_generator.py可正常调用。 - 不同ESP32型号(如ESP32-S3)的分区表可能不同,务必确认NVS分区的偏移和大小。
- 量产时可配合串口多路工具,同时烧录多块板子提升效率。
内容的提问来源于stack exchange,提问作者Stéphane de Luca
相关产品推荐
相关产品推荐

