AURIX TC334 UCB、BMHD 与锁步功能完全指南
AURIX TC334 UCB、BMHD 与锁步功能完全指南
Infineon AURIX TC3xx 系列 | 启动配置 | 功能安全 | 嵌入式系统
1. 概述
TC334 是 Infineon AURIX TC3xx 系列的一款高性能汽车级 MCU,专为功能安全应用设计(支持 ISO 26262 ASIL-D)。芯片的启动配置和安全机制依赖三个核心概念的协同工作:
| 功能 | 说明 |
|---|---|
| UCB | User Configuration Block,存储在 DFlash 中的用户配置块,用于配置芯片启动参数、保护设置等 |
| BMHD | Boot Mode Header,存储在 UCB 中的启动模式头,定义启动模式、启动地址、锁步使能等 |
| Lockstep | 锁步核技术,通过双核并行执行相同指令并比较结果,实现单点故障检测 |
启动架构总览
BMHD 在 Boot ROM 和 SSW 之间充当配置桥梁:决定芯片启动模式、控制 LBIST/MBIST 自检、指定用户代码地址、配置锁步核使能,以及激活密码保护。
2. UCB(User Configuration Block)
2.1 UCB 简介
UCB 是 DFlash(数据闪存)中专门为用户配置预留的存储区域,总大小约 24 KB,起始地址为 0xAF400000,结束地址为 0xAF405FFF。
- 每个 UCB 块大小为 512 字节
- 总共 48 个 UCB 配置项(UCB00 ~ UCB47)
- BMHD 占据前 8 个 UCB 块(4 组 ORIG + 4 组 COPY)
2.2 UCB 存储映射
| 地址范围 | UCB 编号 | 用途 |
|---|---|---|
| 0xAF400000 - 0xAF4001FF | UCB00 | BMHD0_ORIG(支持密码保护) |
| 0xAF400200 - 0xAF4003FF | UCB01 | BMHD1_ORIG |
| 0xAF400400 - 0xAF4005FF | UCB02 | BMHD2_ORIG |
| 0xAF400600 - 0xAF4007FF | UCB03 | BMHD3_ORIG |
| 0xAF400800 - 0xAF400FFF | — | 保留区域 |
| 0xAF401000 - 0xAF4011FF | UCB08 | BMHD0_COPY(备份) |
| 0xAF401200 - 0xAF4013FF | UCB09 | BMHD1_COPY(备份) |
| 0xAF401400 - 0xAF4015FF | UCB10 | BMHD2_COPY(备份) |
| 0xAF401600 - 0xAF4017FF | UCB11 | BMHD3_COPY(备份) |
| 0xAF401800 - 0xAF405FFF | UCB12~47 | SSW 配置、用户配置、HSM 配置等 |
2.3 UCB 的核心作用
TC3xx 芯片启动时运行固化在芯片内部的 SSW(Startup Software),SSW 读取 UCB 中的配置执行以下操作:
- 应用程序跳转地址:通过 BMHD.STAD 指定
- 启动模式选择:Internal Start / ABM / Bootloader 等
- 锁步核使能:是否启用 CPU 的锁步监控
- LBIST 操作:是否在冷启动时执行逻辑内建自测试
- RAM 初始化配置:是否在启动时初始化 RAM
2.4 UCB 的访问保护
UCB 支持密码保护机制。其中 BMHD0_ORIG 和 BMHD0_COPY 支持 256 位密码保护,BMHD1-3 不支持密码保护。保护状态可通过 DMU_HF_PROTECT.PRODISx 寄存器查看。
Confirmation 字段与保护状态
| 状态值 | 状态名 | 说明 |
|---|---|---|
0x43211234 | UNLOCKED | 未锁定,可直接修改 |
0x57B5327F | CONFIRMED | 已确认,启用保护 |
0xFFFFFFFF | ERRORED | 擦除状态或错误 |
| 其他值 | UNINITIALIZED | 未初始化 |
2.5 UCB 修改流程
当 UCB 处于 CONFIRMED 状态时,修改需要遵循以下安全流程:
- 确认 ORIG 和 COPY 的 confirmation codes 为 CONFIRMED
- 应用密码禁用保护(Disable Protection)
- 擦除 COPY UCB(confirmation code 先被擦除,视为 ERRORED)
- 编程 COPY UCB,设置 confirmation code 为 CONFIRMED
- 擦除 ORIG UCB(confirmation code 先被擦除,视为 ERRORED)
- 编程 ORIG UCB,设置 confirmation code 为 CONFIRMED
- 重新启用保护或重启设备
3. BMHD(Boot Mode Header)
3.1 BMHD 简介
BMHD(Boot Mode Header)是存储在 UCB 中的核心启动配置结构。TC3xx 提供 4 组 BMHD(BMHD0 ~ BMHD3),每组包含 ORIG(原始)和 COPY(备份)两个副本,共 8 个副本,构成四重冗余设计。
冗余设计的目的:
- 防止单点故障:某个副本损坏时 Boot ROM 自动尝试后续副本
- 安全在线更新:ORIG-COPY 配对机制支持不断电更新
- 多应用支持:可存储 4 种不同的启动配置(生产/测试/诊断/恢复固件)
3.2 BMHD 数据结构
每个 BMHD 结构共 512 字节,定义如下:
typedef struct {
unsigned short bmi; // 0x000: Boot Mode Index (16 bits)
unsigned short bmhdid; // 0x002: Boot Mode Header ID = 0xB359
unsigned int stad; // 0x004: User Code Start Address
unsigned int crc; // 0x008: CRC32 Check Result
unsigned int crcInv; // 0x00C: Inverted CRC (~crc)
unsigned int reserved0[60]; // 0x010: Reserved (240 bytes)
unsigned int pw[8]; // 0x100: Password Protection (256 bits)
unsigned int reserved1[52]; // 0x120: Reserved (208 bytes)
unsigned int confirmation; // 0x1F0: Confirmation Code
} Ifx_Ssw_Bmhd; // 总大小:512 字节
内存布局
| 偏移量 | 字段 | 大小 | 含义 |
|---|---|---|---|
| 0x000 | BMI | 2 字节 | 启动模式索引 |
| 0x002 | BMHDID | 2 字节 | 固定标识符 = 0xB359 |
| 0x004 | STAD | 4 字节 | 用户代码入口地址 |
| 0x008 | CRCBMHD | 4 字节 | BMI + BMHDID + STAD 的 CRC32 |
| 0x00C | CRCBMHD_N | 4 字节 | CRC 的按位取反 |
| 0x010 - 0x0FF | Reserved | 240 字节 | 保留,必须写 0 |
| 0x100 - 0x11F | PW[0:7] | 32 字节 | 密码保护(256 位) |
| 0x120 - 0x1EF | Reserved | 208 字节 | 保留,必须写 0 |
| 0x1F0 | Confirmation | 4 字节 | 确认码 |
3.3 BMI(Boot Mode Index)位域详解
BMI 是 16 位字段,控制芯片的启动行为和安全功能:
| 位域 | 名称 | 说明 |
|---|---|---|
| Bit 0 | PINDIS | 硬件引脚选择模式使能:0 = 启用 HWCFG 引脚;1 = 禁用 HWCFG 引脚 |
| Bit 3:1 | HWCFG | 启动模式选择(详见下表) |
| Bit 4 | LSENA0 | CPU0 锁步监控使能:0 = 禁用;1 = 启用 |
| Bit 5 | LSENA1 | CPU1 锁步监控使能:0 = 禁用;1 = 启用 |
| Bit 6 | LSENA2 | CPU2 锁步监控使能:0 = 禁用;1 = 启用 |
| Bit 7 | LSENA3 | CPU3 锁步监控使能:0 = 禁用;1 = 启用 |
| Bit 8 | LBISTENA | SSW 启动 LBIST 使能:0 = 禁用;1 = 冷启动时执行 LBIST |
| Bit 11:9 | CHSWENA | SSW 后检查软件(CHSW)执行:101B = 禁用;其他 = 启用 |
| Bit 15:12 | Reserved | 保留,必须配置为 0 |
HWCFG 启动模式选择
| HWCFG 值 | 启动模式 | 说明 | 应用场景 |
|---|---|---|---|
| 111B | Internal Start | 直接从内部 PFlash 执行用户代码 | 生产、量产应用 |
| 110B | ABM(Alternate Boot Mode) | 通过 ABM Header 间接跳转 | Bootloader 场景 |
| 100B | Generic BSL | 自动选择 ASC 或 CAN 通信下载代码 | 固件升级 |
| 011B | ASC BSL | 通过 ASC(串口)协议下载代码 | 开发、调试 |
3.4 STAD(Start Address)
STAD 指定用户代码入口地址。通常设为 0xA0000000,即 PFlash 起始地址的非缓存映射。
使用非缓存地址的原因:
- 启动阶段缓存和 TLB 未初始化
- 非缓存地址直接映射物理地址,无需 TLB 查询
- 保证即使 MMU 配置不当也能访问代码
- Infineon 所有 AURIX 平台的标准做法
0xA000 0000 开始;有 Cache 的 Flash 从 0x8000 0000 开始。启动阶段必须使用无 Cache 地址。
3.5 CRC 计算
BMHD 使用 CRC-32(IEEE 802.3 标准) 保证数据完整性:
- 多项式:0x04C11DB7
- 初始值:0xFFFFFFFF
- 计算范围:BMI(2 字节)+ BMHDID(2 字节)+ STAD(4 字节)= 8 字节
- CRCBMHD_N:CRCBMHD 的按位取反(双重校验增强可靠性)
Python 计算示例
import struct
import zlib
def calculate_bmhd_crc(bmi, bmhdid, stad):
# 按大端序打包前 8 字节
data = struct.pack('>HHI', bmi, bmhdid, stad)
crc = zlib.crc32(data) & 0xFFFFFFFF
crc_inv = crc ^ 0xFFFFFFFF
return crc, crc_inv
# 示例:STAD = 0xA0000000
crc, crc_inv = calculate_bmhd_crc(0x003E, 0xB359, 0xA0000000)
print(f"CRC: 0x{crc:08X}") # 0xD86CBDAB
print(f"CRCINV: 0x{crc_inv:08X}") # 0x27934254
- 字节序错误:必须使用大端序(Big Endian)
- 输入长度错误:只取前 8 字节参与计算
- 多项式选择错误:必须用 IEEE 802.3 多项式
- 反码计算错误:CRCINV = CRC ^ 0xFFFFFFFF
3.6 BMHD 评估与故障转移
SSW 按以下顺序评估 BMHD,直到找到有效配置:
评估流程(每个副本):
- 检查 BMHDID 是否为
0xB359 - 验证 CRCBMHD 和 CRCBMHD_N 是否匹配
- 检查 Confirmation 状态
- 如果有效,根据 BMI.HWCFG 选择启动模式
- 如果无效,尝试下一个 BMHD
- 所有 8 个副本都无效 → 芯片进入安全模式(不可启动)
ORIG 与 COPY 的选择逻辑
| ORIG Confirmation | COPY Confirmation | 使用的配置源 |
|---|---|---|
| UNLOCKED | UNLOCKED | ORIG(默认) |
| CONFIRMED | UNLOCKED | ORIG |
| UNLOCKED | CONFIRMED | COPY |
| CONFIRMED | CONFIRMED | ORIG |
| ERRORED | 任意有效 | COPY |
| 任意有效 | ERRORED | ORIG |
| 都 ERRORED | 都 ERRORED | 无效,尝试下一个 BMHD |
3.7 ABM(Alternate Boot Mode)
当 HWCFG = 110B 时,STAD 不直接指向用户代码,而是指向一个 ABM Header(ABMHD)结构:
| 偏移 | 字段名 | 说明 |
|---|---|---|
| 0x00 | STADABM | 用户代码实际启动地址 |
| 0x04 | ABMHDID | 固定为 0xFA7CB359 |
| 0x08 | CHKSTART | 待校验内存范围起始地址 |
| 0x0C | CHKEND | 待校验内存范围结束地址 |
| 0x10 | CRCRANGE | 内存范围的 CRC32 |
| 0x14 | CRCRANGE_N | CRCRANGE 的按位取反 |
| 0x18 | CRCABMHD | ABM Header 的 CRC32 |
| 0x1C | CRCABMHD_N | CRCABMHD 的按位取反 |
ABM 的优势:UCB 位于 DFlash 中,频繁刷新容易损坏并锁定芯片;ABM Header 位于 PFlash 中,刷新更安全,且支持 Bootloader 跳转场景。
4. Boot ROM 启动流程
4.1 完整启动序列
4.2 SSW 衔接
Boot ROM 成功验证 BMHD 后,跳转到 SSW(Startup Software)执行用户级初始化:
4.3 HWCFG 引脚
TC334 的硬件配置引脚可在不修改 Flash 的情况下强制特定启动模式:
| 引脚 | 功能 | 备注 |
|---|---|---|
| HWCFG[2:1] | 电压调节器选择 | 启动早期被 Boot ROM 采样 |
| HWCFG[5:3] | 备用启动模式 | 非零时覆盖 BMHD 中的 ABM 设置 |
HWCFG[5:3] 允许通过硬件引脚强制进入 ISP 模式(例如强制固件升级),这在芯片因 BMHD 损坏无法正常启动时尤其有用。
5. 锁步(Lockstep)功能
5.1 技术概述
锁步(Lockstep)是一种硬件冗余技术,用于检测 CPU 核心中的单点故障。TC3xx 的每个 CPU 核心都可配置一个影子核心(Shadow Core),两个核心执行完全相同的指令,并通过比较器在每个时钟周期比较输出结果。
TC334 的 CPU 锁步配置:
- CPU0:主核心,通过 BMI.LSENA0 控制锁步
- CPU1:从核心,通过 BMI.LSENA1 控制锁步
- CPU2:从核心,通过 BMI.LSENA2 控制锁步
- CPU3:从核心,通过 BMI.LSENA3 控制锁步
5.2 工作原理
工作流程:
- 主核心和影子核心接收相同的时钟和输入信号
- 两个核心独立执行完全相同的指令流
- 比较器在每个周期比较两个核心的输出(PC、数据总线、控制信号)
- 影子核心有固定的时钟延迟(如 2 个周期),可检测瞬态故障
- 如果检测到差异,触发 SMU(Safety Management Unit)报警
5.3 故障检测与处理
| 故障类型 | 说明 | 检测方式 |
|---|---|---|
| 单点故障 | CPU 内部硬件故障 | 比较器检测到输出不一致 |
| 瞬态故障 | 电磁干扰导致的临时错误 | 延迟比较检测 |
| 共模故障 | 两个核心同时发生相同故障 | 需要额外的多样性设计 |
故障处理流程:比较器检测到不一致 → 触发 SMU 报警 → SMU 根据配置执行故障响应(触发 NMI、复位系统或切换安全状态)→ 软件记录故障信息并采取恢复措施。
5.4 性能影响
| 指标 | 无锁步 | 有锁步 | 说明 |
|---|---|---|---|
| CPU 性能 | 100% | ~95-98% | 影子核心占用部分总线资源 |
| 功耗 | 基准 | +20-30% | 影子核心的额外功耗 |
| 故障覆盖率 | 低 | 高 | 可检测单点故障 |
| 安全等级 | ASIL-B | ASIL-D | 满足最高功能安全要求 |
5.5 适用场景建议
推荐启用锁步:安全关键应用(制动、转向系统)、需要 ISO 26262 ASIL-D 认证的系统、电磁环境恶劣的场合。
可考虑禁用锁步:功耗敏感应用、性能要求极高且安全要求较低的场景、成本敏感的非安全关键应用。
6. 配置示例
6.1 内部 Flash 启动(无锁步)
const Ifx_Ssw_Bmhd bmhd_0_orig = {
.bmi = 0x003E, // PINDIS=0, HWCFG=111B(Internal Start),
// LSENA0-3=0(无锁步), LBISTENA=0
.bmhdid = 0xB359, // AURIX BMHD ID(固定值)
.stad = 0xA0000000, // 用户代码入口(PFlash 起始,非缓存)
.crc = 0xD86CBDAB, // CRC-32
.crcInv = 0x27934254, // CRC 反码
.reserved0 = { 0 },
.pw = { 0 }, // 无密码保护
.reserved1 = { 0 },
.confirmation = 0x43211234, // UNLOCKED
};
6.2 内部 Flash 启动(启用全部锁步)
const Ifx_Ssw_Bmhd bmhd_0_orig = {
.bmi = 0x01FE, // PINDIS=0, HWCFG=111B(Internal Start),
// LSENA0-3=1(启用全部锁步),
// LBISTENA=1(启用LBIST)
// 二进制: 0000_0001_1111_1110
.bmhdid = 0xB359,
.stad = 0xA0000000,
.crc = 0xXXXXXXXX, // 根据实际 BMI 值重新计算
.crcInv = 0xXXXXXXXX,
.reserved0 = { 0 },
.pw = { 0 },
.reserved1 = { 0 },
.confirmation = 0x57B5327F, // CONFIRMED(生产环境)
};
6.3 ABM 模式启动
// BMHD 配置 - STAD 指向 ABM Header
const Ifx_Ssw_Bmhd bmhd_0_orig = {
.bmi = 0x003C, // HWCFG=110B (ABM Mode)
.bmhdid = 0xB359,
.stad = 0xA000FFE0, // 指向 ABM Header 地址
.crc = 0xXXXXXXXX, // 根据实际值计算
.crcInv = 0xXXXXXXXX,
...
};
// ABM Header 定义(位于 PFlash 中)
const Ifx_Ssw_Abmhd abmhd = {
.stadabm = 0xA0020000, // 实际用户代码启动地址
.abmhdid = 0xFA7CB359, // ABM Header ID(固定值)
.chkstart = 0xA0000000, // 校验范围起始
.chkend = 0xA001FFFF, // 校验范围结束
.crcrange = 0xXXXXXXXX, // 范围 CRC
.crcrange_n = 0xXXXXXXXX,
.crcabmhd = 0xXXXXXXXX, // Header CRC
.crcabmhd_n = 0xXXXXXXXX,
};
6.4 链接脚本段定义(Tasking)
/* 链接脚本中的 BMHD 段放置 (Lcf_Tasking_Tricore_Tc.lsl) */
group (ordered)
{
group bmh_0_orig (run_addr=mem:ucb[0x0000])
{
select ".rodata.bmhd_0_orig";
}
group bmh_1_orig (run_addr=mem:ucb[0x0200])
{
select ".rodata.bmhd_1_orig";
}
group bmh_2_orig (run_addr=mem:ucb[0x0400])
{
select ".rodata.bmhd_2_orig";
}
group bmh_3_orig (run_addr=mem:ucb[0x0600])
{
select ".rodata.bmhd_3_orig";
}
group bmh_0_copy (run_addr=mem:ucb[0x1000])
{
select ".rodata.bmhd_0_copy";
}
/* ... bmh_1_copy ~ bmh_3_copy 类似 ... */
}
7. UCB 编程与更新
7.1 编程方式
方式 A:通过 C 代码编译(推荐)
在 Ifx_Cfg_SswBmhd.c 中定义 BMHD 数据,编译器将数据放入指定段,调试器/编程器自动识别段信息并写入 UCB 正确位置。
// 编译器段指令(多编译器兼容)
#if defined(__TASKING__)
#pragma section farrom "bmhd_0_orig"
#elif defined(__GNUC__) && !defined(__HIGHTEC__)
#pragma section ".bmhd_0_orig" a
#elif defined(__DCC__)
#pragma section CONST ".bmhd_0_orig" far-absolute R
#endif
方式 B:使用 Lauterbach TRACE32
; 解锁 UCB 区域
FLASH.REProgram 0xAF400000--0xAF4001FF TARGET
; 擦除 BMHD0_ORIG
FLASH.Erase 0xAF400000--0xAF4001FF
; 编程 BMHD0_ORIG
FLASH.Program 0xAF400000
Data.Set 0xAF400000 %LE %WORD 0x003E ; BMI
Data.Set 0xAF400002 %LE %WORD 0xB359 ; BMHDID
Data.Set 0xAF400004 %LE %LONG 0xA0000000 ; STAD
Data.Set 0xAF400008 %LE %LONG 0xD86CBDAB ; CRCBMHD
Data.Set 0xAF40000C %LE %LONG 0x27934254 ; CRCBMHD_N
; ... 填充保留区域为 0x00 ...
Data.Set 0xAF4001FC %LE %LONG 0x43211234 ; Confirmation (UNLOCKED)
FLASH.Program off
; 恢复保护
FLASH.REProgram 0xAF400000--0xAF4001FF NOP
方式 C:使用 ADS Flash Programmer
右键项目 → Program Devices,工具自动计算 CRC 并编程、验证。
7.2 编程限制
| 操作 | 限制 | 说明 |
|---|---|---|
| 读取 | 任何时间 | 无限制 |
| 编程 | 需先擦除 | UCB 块级擦除(512 字节) |
| Flash 执行 | 编程期间不可 | 编程 Flash 时 CPU 不能执行 Flash 代码,需从 RAM 执行 |
| ECC | 自动计算 | DFLASH/UCB 有 ECC 自动计算,不可手动修改 |
| Confirmation | 最后写入 | 必须作为最后一个字写入 |
8. 故障排查与恢复
8.1 常见问题
| 问题 | 可能原因 | 恢复难度 | 解决方案 |
|---|---|---|---|
| 芯片无法启动 | 所有 8 个 BMHD 副本无效 | 非常难 | 通过 HWCFG 引脚强制 ISP 模式重新编程 |
| STAD 指向无效地址 | 链接脚本配置错误 | 难(需 ISP) | 调试器停止 CPU → 重新编程 UCB |
| CRC 校验失败 | CRC 计算错误 | 中 | 其他副本可用则自动恢复;否则重新计算并编程 |
| 无法修改 UCB | UCB 被密码锁定 | 极难 | 使用密码解锁或执行 ERASE_ALL |
| 锁步不工作 | LSENAx 未设置 | 低 | 检查 BMHD.BMI.LSENAx 位并重新配置 |
| 密码遗忘 | 设置密码后未记录 | 极难 | 需完全擦除芯片(ERASE_ALL) |
8.2 恢复方法(按优先级)
优先级 1:调试器恢复(推荐)
连接 JTAG/SWD 调试器 → 停止 CPU → 重新编程 UCB → 复位验证。
优先级 2:ISP 模式恢复
通过 HWCFG 引脚强制 ISP 模式 → 串口通信 → 重新编程 BMHD。
优先级 3:完全擦除(ERASE_ALL)
清除所有 Flash 包括 UCB → 重置为工厂默认 → 重新编程所有内容。
优先级 4:SAP(Service Access Port)
仅限 Infineon 内部或授权工程师使用,为最后手段。
8.3 调试技巧
- 验证 BMHD 读取:在调试器中读取 0xAF400000 处的内存,确认数据正确
- 设置断点:在 0xA0000000 设置硬件断点,确认 Boot ROM 成功跳转
- HWCFG 状态检查:读取
SCU_PMSWSTAT寄存器查看引脚采样状态 - ELF 段检查:使用 objdump 提取 BMHD 段数据验证其完整性
8.4 配置建议
Confirmation = 0x43211234 (UNLOCKED),Password = 0x00000000便于反复修改和调试,不会因 UCB 配置错误锁定芯片。
Confirmation = 0x57B5327F (CONFIRMED),Password = <强密码>启用保护防止未授权修改。务必安全保管密码,遗忘密码将导致芯片需要完全擦除。
参考文档
- Infineon AURIX TC3xx User Manual Part 1 — 章节 3.1.1.6: Boot Mode evaluation sequence
- Infineon AURIX TC3xx Data Sheet — CPU 核心配置与锁步功能
- ISO 26262 功能安全标准 — 锁步技术满足 ASIL-D 要求
- iSYSTEM winIDEA 文档 — UCB 配置与编程指南
- Lauterbach TRACE32 文档 — Flash 编程命令参考