ESP32-C2 eFuse 布局全解:在 ESP-IDF 中查看 eFuse 字段表与空闲位(show-efuse-table / efuse_table_gen.py --info)
ESP32-C2 eFuse 布局全解在 ESP-IDF 中查看 eFuse 字段表与空闲位show-efuse-table / efuse_table_gen.py --info【免费下载链接】esp-idfEspressif IoT Development Framework. Official development framework for Espressif SoCs.项目地址: https://gitcode.com/GitHub_Trending/es/esp-idfESP-IDF 的 eFuse Manager 允许开发者以 CSV 表定义芯片内一次性可编程熔丝eFuse的数据字段并在生成 C 结构前检查字段是否重叠、是否越界。本文以 ESP32-C2 为例完整呈现efuse_table_gen.py --info等价于idf.py show-efuse-table输出的标准 eFuse 字段表与逐块位占用情况并结合 esp_efuse_table.csv 与 efuse_table_gen.py 源码讲解每张表格输出的含义、如何从中判断哪些位可用作自定义字段以及生成/校验自定义 eFuse 表的完整流程。1. 这条命令是干什么的idf.py show-efuse-table是构建系统提供的一个构建目标定义于 core_ext.py其作用是打印当前目标芯片的 eFuse 表。它背后的实现是 eFuse 组件中的生成工具efuse_table_gen.py加上--info参数后工具不生成 C 文件而是打印两张诊断信息Sorted efuse table按字段在块内的位偏移排序后的全部 eFuse 字段列表含父字段与.定义的子字段Used bits in efuse table每个 eFuse 块中被已定义字段实际占用的位区间。对 ESP32-C2目标目录名为esp32c2直接运行工具等价于执行文档中的命令cd $IDF_PATH/components/efuse/ ./efuse_table_gen.py esp32c2/esp_efuse_table.csv --info--info与输入文件解析的逻辑见 efuse_table_gen.py--info时走print(two_table.show_range_used_bits())分支不写任何输出文件不带--info时才调用create_output_files()生成esp_efuse_table.c/.h。其他常用参数包括--idf_target/-t目标芯片、--max_blk_len块最大位宽取值为 256/192/128默认 256、--quiet以及可选的第二个位置参数自定义 CSV 文件用于同时校验自定义表与公共表是否冲突。2. ESP32-C2 的 eFuse 硬件布局ESP32-C2 共有 4 个 eFuse 块EFUSE_BLK0~EFUSE_BLK3每块 256 位每块内部又分为 8 个 32 位寄存器。按 efuse.rst 中esp32c2分支的说明EFUSE_BLK0完全用于系统参数EFUSE_BLK1完全用于系统参数EFUSE_BLK2完全用于系统参数EFUSE_BLK3即 EFUSE_BLK_KEY0用于存放 Secure Boot 或 Flash Encryption 密钥若两者都不使用也可用作用户参数区。这与下文Used bits输出完全吻合BLK0/BLK1/BLK2 的已用位区间均由系统字段构成BLK3 被 256 位的KEY0整体占满。3. 完整字段表Sorted efuse table下面是./efuse_table_gen.py esp32c2/esp_efuse_table.csv --info在 ESP-IDF 仓库中记录的标准输出。表中列含义为#是序号field_name是字段名C 代码中对应ESP_EFUSE_前缀的宏.替换为_efuse_block是所属块bit_start是块内起始位bit_count是位宽。带前缀的条目如WR_DIS.RD_DIS是结构化子字段——它们与父字段WR_DIS占据相同的物理位只是从语义上切分出更细的访问入口。$ ./efuse_table_gen.py {IDF_TARGET_PATH_NAME}/esp_efuse_table.csv --info Parsing efuse CSV input file $IDF_PATH/components/efuse/esp32c2/esp_efuse_table.csv ... Verifying efuse table... Max number of bits in BLK 256 Sorted efuse table: # field_name efuse_block bit_start bit_count 1 WR_DIS EFUSE_BLK0 0 8 2 WR_DIS.RD_DIS EFUSE_BLK0 0 1 3 WR_DIS.WDT_DELAY_SEL EFUSE_BLK0 1 1 4 WR_DIS.DIS_PAD_JTAG EFUSE_BLK0 1 1 5 WR_DIS.DIS_DOWNLOAD_ICACHE EFUSE_BLK0 1 1 6 WR_DIS.DIS_DOWNLOAD_MANUAL_ENCRYPT EFUSE_BLK0 2 1 7 WR_DIS.SPI_BOOT_CRYPT_CNT EFUSE_BLK0 2 1 8 WR_DIS.XTS_KEY_LENGTH_256 EFUSE_BLK0 2 1 9 WR_DIS.SECURE_BOOT_EN EFUSE_BLK0 2 1 10 WR_DIS.UART_PRINT_CONTROL EFUSE_BLK0 3 1 11 WR_DIS.FORCE_SEND_RESUME EFUSE_BLK0 3 1 12 WR_DIS.DIS_DOWNLOAD_MODE EFUSE_BLK0 3 1 13 WR_DIS.DIS_DIRECT_BOOT EFUSE_BLK0 3 1 14 WR_DIS.ENABLE_SECURITY_DOWNLOAD EFUSE_BLK0 3 1 15 WR_DIS.FLASH_TPUW EFUSE_BLK0 3 1 16 WR_DIS.SECURE_VERSION EFUSE_BLK0 4 1 17 WR_DIS.CUSTOM_MAC_USED EFUSE_BLK0 4 1 18 WR_DIS.DISABLE_WAFER_VERSION_MAJOR EFUSE_BLK0 4 1 19 WR_DIS.DISABLE_BLK_VERSION_MAJOR EFUSE_BLK0 4 1 20 WR_DIS.CUSTOM_MAC EFUSE_BLK0 5 1 21 WR_DIS.MAC EFUSE_BLK0 6 1 22 WR_DIS.WAFER_VERSION_MINOR EFUSE_BLK0 6 1 23 WR_DIS.WAFER_VERSION_MAJOR EFUSE_BLK0 6 1 24 WR_DIS.PKG_VERSION EFUSE_BLK0 6 1 25 WR_DIS.BLK_VERSION_MINOR EFUSE_BLK0 6 1 26 WR_DIS.BLK_VERSION_MAJOR EFUSE_BLK0 6 1 27 WR_DIS.OCODE EFUSE_BLK0 6 1 28 WR_DIS.TEMP_CALIB EFUSE_BLK0 6 1 29 WR_DIS.ADC1_INIT_CODE_ATTEN0 EFUSE_BLK0 6 1 30 WR_DIS.ADC1_INIT_CODE_ATTEN3 EFUSE_BLK0 6 1 31 WR_DIS.ADC1_CAL_VOL_ATTEN0 EFUSE_BLK0 6 1 32 WR_DIS.ADC1_CAL_VOL_ATTEN3 EFUSE_BLK0 6 1 33 WR_DIS.DIG_DBIAS_HVT EFUSE_BLK0 6 1 34 WR_DIS.DIG_LDO_SLP_DBIAS2 EFUSE_BLK0 6 1 35 WR_DIS.DIG_LDO_SLP_DBIAS26 EFUSE_BLK0 6 1 36 WR_DIS.DIG_LDO_ACT_DBIAS26 EFUSE_BLK0 6 1 37 WR_DIS.DIG_LDO_ACT_STEPD10 EFUSE_BLK0 6 1 38 WR_DIS.RTC_LDO_SLP_DBIAS13 EFUSE_BLK0 6 1 39 WR_DIS.RTC_LDO_SLP_DBIAS29 EFUSE_BLK0 6 1 40 WR_DIS.RTC_LDO_SLP_DBIAS31 EFUSE_BLK0 6 1 41 WR_DIS.RTC_LDO_ACT_DBIAS31 EFUSE_BLK0 6 1 42 WR_DIS.RTC_LDO_ACT_DBIAS13 EFUSE_BLK0 6 1 43 WR_DIS.ADC_CALIBRATION_3 EFUSE_BLK0 6 1 44 WR_DIS.BLOCK_KEY0 EFUSE_BLK0 7 1 45 RD_DIS EFUSE_BLK0 32 2 46 RD_DIS.KEY0 EFUSE_BLK0 32 2 47 RD_DIS.KEY0.LOW EFUSE_BLK0 32 1 48 RD_DIS.KEY0.HI EFUSE_BLK0 33 1 49 WDT_DELAY_SEL EFUSE_BLK0 34 2 50 DIS_PAD_JTAG EFUSE_BLK0 36 1 51 DIS_DOWNLOAD_ICACHE EFUSE_BLK0 37 1 52 DIS_DOWNLOAD_MANUAL_ENCRYPT EFUSE_BLK0 38 1 53 SPI_BOOT_CRYPT_CNT EFUSE_BLK0 39 3 54 XTS_KEY_LENGTH_256 EFUSE_BLK0 42 1 55 UART_PRINT_CONTROL EFUSE_BLK0 43 2 56 FORCE_SEND_RESUME EFUSE_BLK0 45 1 57 DIS_DOWNLOAD_MODE EFUSE_BLK0 46 1 58 DIS_DIRECT_BOOT EFUSE_BLK0 47 1 59 ENABLE_SECURITY_DOWNLOAD EFUSE_BLK0 48 1 60 FLASH_TPUW EFUSE_BLK0 49 4 61 SECURE_BOOT_EN EFUSE_BLK0 53 1 62 SECURE_VERSION EFUSE_BLK0 54 4 63 CUSTOM_MAC_USED EFUSE_BLK0 58 1 64 DISABLE_WAFER_VERSION_MAJOR EFUSE_BLK0 59 1 65 DISABLE_BLK_VERSION_MAJOR EFUSE_BLK0 60 1 66 USER_DATA EFUSE_BLK1 0 88 67 USER_DATA.MAC_CUSTOM EFUSE_BLK1 0 48 68 MAC EFUSE_BLK2 0 8 69 MAC EFUSE_BLK2 8 8 70 MAC EFUSE_BLK2 16 8 71 MAC EFUSE_BLK2 24 8 72 MAC EFUSE_BLK2 32 8 73 MAC EFUSE_BLK2 40 8 74 WAFER_VERSION_MINOR EFUSE_BLK2 48 4 75 WAFER_VERSION_MAJOR EFUSE_BLK2 52 2 76 PKG_VERSION EFUSE_BLK2 54 3 77 BLK_VERSION_MINOR EFUSE_BLK2 57 3 78 BLK_VERSION_MAJOR EFUSE_BLK2 60 2 79 OCODE EFUSE_BLK2 62 7 80 TEMP_CALIB EFUSE_BLK2 69 9 81 ADC1_INIT_CODE_ATTEN0 EFUSE_BLK2 78 8 82 ADC1_INIT_CODE_ATTEN3 EFUSE_BLK2 86 5 83 ADC1_CAL_VOL_ATTEN0 EFUSE_BLK2 91 8 84 ADC1_CAL_VOL_ATTEN3 EFUSE_BLK2 99 6 85 DIG_DBIAS_HVT EFUSE_BLK2 105 5 86 DIG_LDO_SLP_DBIAS2 EFUSE_BLK2 110 7 87 DIG_LDO_SLP_DBIAS26 EFUSE_BLK2 117 8 88 DIG_LDO_ACT_DBIAS26 EFUSE_BLK2 125 6 89 DIG_LDO_ACT_STEPD10 EFUSE_BLK2 131 4 90 RTC_LDO_SLP_DBIAS13 EFUSE_BLK2 135 7 91 RTC_LDO_SLP_DBIAS29 EFUSE_BLK2 142 9 92 RTC_LDO_SLP_DBIAS31 EFUSE_BLK2 151 6 93 RTC_LDO_ACT_DBIAS31 EFUSE_BLK2 157 6 94 RTC_LDO_ACT_DBIAS13 EFUSE_BLK2 163 8 95 ADC_CALIBRATION_3 EFUSE_BLK2 192 11 96 KEY0 EFUSE_BLK3 0 256 97 KEY0.FE_256BIT EFUSE_BLK3 0 256 98 KEY0.FE_128BIT EFUSE_BLK3 0 128 99 KEY0.SB_128BIT EFUSE_BLK3 128 128表中几个值得注意的结构WR_DIS位 0~78 位写保护位集合。CSV 中每个WR_DIS.XXX子字段对应一个实际字段烧写该位后将永久禁止对XXX字段的后续编程。对照 esp_efuse_table.csv 可见WR_DIS的位与 BLK0 中各系统控制位一一对应例如第 4 位同时是SECURE_VERSION、CUSTOM_MAC_USED等字段的写保护位——同一位保护多个字段是允许的。RD_DIS位 32~332 位读保护位RD_DIS.KEY0.LOW/HI分别保护 EFUSE_BLK3 的低/高 128 位密钥。MACEFUSE_BLK2 位 0~47工厂 MAC 地址由 6 条 8 位记录拼接而成CSV 中field_name留空即表示与上一条同属一个字段见 esp_efuse_table.csv因此排序表中出现 6 行同名MAC。USER_DATAEFUSE_BLK1 位 0~8788 位BLK1 中的用户数据区其子字段USER_DATA.MAC_CUSTOM48 位用于存放自定义 MAC 地址配合 BLK0 的CUSTOM_MAC_USED位使用。KEY0EFUSE_BLK3 全块 256 位密钥块子字段KEY0.FE_256BIT/KEY0.FE_128BIT表示 Flash Encryption 密钥的两种长度视图KEY0.SB_128BIT高位 128 位是 Secure Boot 密钥。4. 已用位区间Used bits与哪些位还能用--info输出的第二部分按块列出所有已定义字段实际覆盖的位区间Used bits in efuse table: EFUSE_BLK0 [0 7] [0 1] [1 1] [1 2] [2 2] ... [6 6] [6 6] [6 6] [6 6] [6 6] [6 6] [6 6] [6 6] [6 6] [6 7] [32 33] [32 33] [32 60] EFUSE_BLK1 [0 87] [0 47] EFUSE_BLK2 [0 170] [192 202] EFUSE_BLK3 [0 255] [0 255] [0 255] Note: Not printed ranges are free for using. (bits in EFUSE_BLK0 are reserved for Espressif)解读方式[起 止]均为闭区间EFUSE_BLK0已用位集中在0~7WR_DIS、32~33RD_DIS和34~60各系统控制位三段。位 8~31、61~255 未列出理论上空闲但结尾的 Note 明确提示BLK0 的未定义位由乐鑫Espressif保留实际不可用作用户字段。EFUSE_BLK1[0 87]即USER_DATA的 88 位[0 47]是其中的MAC_CUSTOM。位 88~255共 168 位空闲是 ESP32-C2 上定义自定义 eFuse 字段的主要空间。EFUSE_BLK2[0 170]覆盖 MAC、版本、校准、LDO 偏置等系统字段[192 202]是 11 位的ADC_CALIBRATION_3。位 171~191 与 203~255 空闲但从 CSV 注释如 esp_efuse_table.csv 中Store the bit [86:96] of ADC calibration data可以看出 BLK2 大量位与校准数据相关属于芯片系统数据不宜挪用。EFUSE_BLK3三行[0 255]分别来自KEY0、KEY0.FE_256BIT和KEY0.SB_128BIT的合并整块被密钥占满。若不使用 Secure Boot/Flash Encryption从源码结构看该块BLOCK_KEY0可转作用户参数使用。所有字段均会被工具做重叠检查任何与既有字段相交的记录都会报错因此选位时以本表为唯一依据是安全的。5. 结合源码校验逻辑与自定义表生成流程show-efuse-table的底层流程可以从 efuse_table_gen.py 确认process_input_file()先打印Parsing efuse CSV input file ...、Verifying efuse table...随后对表执行verify()检查字段名唯一、子字段位范围落在父字段内、无重叠——这就是输出中那两行状态信息的来源--info分支只打印show_range_used_bits()不产出文件不带--info时进入create_output_files()在 CSV 同级目录生成esp_efuse_table.c与include/esp_efuse_table.h并通过 CSV 内容 MD5 判断是否需要重新生成MD5 未变时提示Source files do not require updating correspond to csv file.。因此在 ESP32-C2 上添加自定义 eFuse 字段的完整实操流程为# 1. 在 $IDF_PATH/components/efuse/esp32c2/esp_efuse_table.csv 中选定空闲位 # 例如 EFUSE_BLK1 的 88~119 位添加记录例如 # CUSTOM_DATA, EFUSE_BLK1, 88, 32, User custom data # 2. 重新生成公共表 C 源等价于 ./efuse_table_gen.py --idf_target esp32c2 esp32c2/esp_efuse_table.csv idf.py efuse-common-table # 3. 校验表内容 / 查看占用情况 idf.py show-efuse-table # 4. 若使用项目内的自定义表 esp_efuse_custom_table.csv # 在 main/CMakeLists.txt 或顶层 CMakeLists.txt 中 # idf_build_custom_efuse_component 后运行 idf.py efuse-custom-table构建系统层面的对应关系见 core_ext.pyefuse-common-table、efuse-custom-table、show-efuse-table三个目标都以reconfigure为前置依赖即执行前会先重新配置工程。应用代码中引用生成结果时包含esp_efuse.h与esp_efuse_table.h或自定义表头即可通过ESP_EFUSE_xxx描述符指针配合esp_efuse_read_field_blob()、esp_efuse_write_field_blob()等 API 读写。一个完整的读写示例可参考 examples/system/efuse。两点注意事项子字段规则新字段若落在既有父字段位范围内必须写成父字段.子字段形式例如USER_DATA.MY_FIELD否则会报intersected with错误子字段整体越出父字段范围则报out of range修正方法见 efuse.rst 的 Structured eFuse Fields 一节。修改 CSV 后必须手动重新执行efuse-common-tableCSV 文件头注释也提醒了这一点见 esp_efuse_table.csv否则 C 侧描述符与 CSV 定义不一致。6. 小结idf.py show-efuse-table/./efuse_table_gen.py esp32c2/esp_efuse_table.csv --info是查看 ESP32-C2 eFuse 布局的标准手段输出由排序字段表 逐块已用位区间两部分组成ESP32-C2 的 4 个块中BLK0/BLK2 与 BLK3KEY0基本被系统字段与密钥占满自定义字段的主要空间是 EFUSE_BLK1 的 88~255 位168 位且 BLK0 的未定义位归乐鑫保留、不可使用工具在打印信息的同时会执行字段名唯一性与位重叠校验因此该命令也是修改 CSV 后最低成本的自查手段生成 C 源则使用idf.py efuse-common-table或idf.py efuse-custom-table。【免费下载链接】esp-idfEspressif IoT Development Framework. Official development framework for Espressif SoCs.项目地址: https://gitcode.com/GitHub_Trending/es/esp-idf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考