API GUIDE / EFUSE / OVERVIEW
G32S10 EFUSE API 概述
模块概述:本文档定义 G32S10 SDK 当前 EFUSE 模块的正式接口,覆盖以下两层:
1. 文档范围
本文档定义 G32S10 SDK 当前 EFUSE 模块的正式接口,覆盖以下两层:
HAL EFUSE:面向应用、BSP、示例和驱动上层的段级读写与时序配置接口。LL EFUSE:面向寄存器与位操作的内联低层接口。
本文档基于以下文件编写:
code/include/drivers/g32s10/efuse/hal_efuse.hcode/include/drivers/g32s10/efuse/ll_efuse.hcode/include/drivers/g32s10/efuse/efuse_regs.hcode/drivers/g32s10/efuse/hal_efuse.c
EFUSE 编程会永久将 bit 从 0 置为 1,无法恢复为 0。写接口只能用于已评审的制造、校准或受控测试流程。
2. 分层关系
分层职责:
HAL EFUSE管理调用方持有的
hal_efuse_handle_t。管理 VDDQ GPIO、时序配置、控制器空闲检查、4 byte 分块访问和轮询超时。
将逻辑段 ID 映射为 EFUSE 字节地址、长度、特殊访问和保护位规则。
对写入执行
old | input的一次性编程、读回验证与统一错误码返回。LL EFUSE提供控制、状态、数据、特殊段和时序寄存器的最小访问单元。
不校验指针、实例、地址或控制器状态;事务启动接口仅校验 1 至 4 byte 长度。
不等待完成、不控制 VDDQ、不维护软件状态。
efuse_regs.h定义
EFUSE实例、寄存器布局和全部位域宏。
3. 典型用法
以下代码展示 BSP 已完成 VDDQ GPIO 配置并取得 EFUSE 输入时钟后的只读流程:
#include "hal_efuse.h"
static error_code_t read_chip_id(uint32_t efuse_rate_hz)
{
hal_efuse_handle_t handle = {0};
hal_efuse_gpio_t vddq = {
.gpiox = GPIOD,
.pin_mask = GPIO_PIN_10,
};
uint8_t chip_id[12];
error_code_t ret;
ret = hal_efuse_handle_init(&handle, EFUSE, &vddq);
if (ret != IM_OK) {
return ret;
}
ret = hal_efuse_set_timing(&handle, efuse_rate_hz);
if (ret == IM_OK) {
ret = hal_efuse_read_segment(&handle,
HAL_EFUSE_SEGMENT_CHIP_ID,
chip_id,
sizeof(chip_id));
}
(void)hal_efuse_handle_deinit(&handle);
return ret;
}写入流程还必须额外确认:目标段可写、对应保护位未置位、输入 bit 只会设置期望的 1、供电条件满足,并且已完成制造/安全评审。写后应读取并记录最终数据,而不是假设输入 buffer 会原样成为 EFUSE 内容。
4. 推荐关注的错误码
| 场景 | 建议处理 |
|---|---|
IM_ERR_NOT_READY | 检查 BSP 是否初始化 VDDQ GPIO、handle 是否已初始化、是否已按当前时钟调用 hal_efuse_set_timing()。 |
IM_ERR_BUSY | 等待其他 EFUSE 用户完成;不要并发启动读写或重新配置时序。 |
IM_ERR_TIMEOUT | 检查 EFUSE 输入时钟、时序配置、VDDQ 供电和硬件状态;不要立即重复编程。 |
IM_ERR_UNSUPPORTED | 检查是否尝试写保留段,或是否在未开启调试辅助选项时调用寄存器 dump。 |
IM_ERR_IO | 写后验证失败。停止后续编程并保留读回数据、时钟和供电诊断信息。 |