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.h

  • code/include/drivers/g32s10/efuse/ll_efuse.h

  • code/include/drivers/g32s10/efuse/efuse_regs.h

  • code/drivers/g32s10/efuse/hal_efuse.c

EFUSE 编程会永久将 bit 从 0 置为 1,无法恢复为 0。写接口只能用于已评审的制造、校准或受控测试流程。

2. 分层关系

APPLICATION  Application / BSP / SLT  业务代码、板级支持与示例入口
↓
HAL  HAL EFUSE  模块级配置、状态管理与硬件访问
↓
LL  LL EFUSE  寄存器访问与字段级控制
↓
HARDWARE REGISTERS  EFUSE Registers  实例地址、寄存器布局与位域定义

分层职责:

  • 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写后验证失败。停止后续编程并保留读回数据、时钟和供电诊断信息。