1. 配置HSM模块并验证启动
任务目标
在TC3xx平台上完成HSM(硬件安全模块)的基础初始化:配置HSM时钟源与电源模式,启动HSM并轮询其启动状态,最终通过寄存器标志位确认HSM已进入运行态,为后续安全启动与加密通信建立可信基础环境。
前置条件
- 硬件:AURIX TC3xx开发板(如TC375 Lite Kit)
- 软件:AURIX Development Studio 或 Tasking编译器,iLLD库(Infineon Low Level Driver)
- 调试器:MiniWiggler 或 Lauterbach Trace32
核心实现
HSM模块的初始化涉及三个关键步骤:使能HSM模块时钟、配置电源状态、启动并等待HSM固件完成自举。以下代码基于iLLD库实现完整初始化流程,通过IfxHsm_enable()触发启动,并轮询IFX_HSM_STRTSTA寄存器中的BOOT_DONE位判断启动是否完成。
#include "IfxHsm.h"
#include "IfxScuWdt.h"
#include "Ifx_HSM.h"
/* HSM启动状态标志位定义 */
#define HSM_BOOT_DONE_POS (0) /* STRTSTA.BOOT_DONE 位 */
/* 模块间通信等待超时(毫秒) */
#define HSM_TIMEOUT_MS (1000u)
/**
* \brief 初始化HSM模块:使能时钟、配置电源、启动并验证
* \return 1: 启动成功; 0: 启动超时或失败
*/
uint8_t HSM_InitAndVerify(void)
{
/* 1. 关闭看门狗(HSM初始化期间需禁止复位) */
IfxScuWdt_disableCpuWatchdog(IfxScuWdt_getCpuWatchdogPassword());
IfxScuWdt_disableSafetyWatchdog(IfxScuWdt_getSafetyWatchdogPassword());
/* 2. 使能HSM模块时钟(位于CCU中,默认关闭以降低功耗) */
Ifx_Hsm_enableModuleClock();
/* 3. 配置HSM电源:进入正常运行模式(非待机/掉电) */
Ifx_Hsm_setPowerMode(Ifx_Hsm_PowerMode_run);
/* 4. 触发HSM启动(内部固件开始自举) */
Ifx_Hsm_enable();
/* 5. 轮询启动状态寄存器,等待BOOT_DONE置位 */
uint32_t timeout = 0;
while (0 == (Ifx_Hsm_getStartStatus() & (1u << HSM_BOOT_DONE_POS)))
{
/* 简单延时(约1ms) */
Ifx_WaitTime(IfxStm_getTicksFromMilliseconds(1));
timeout++;
if (timeout > HSM_TIMEOUT_MS)
{
/* 超时,启动失败 */
return 0;
}
}
/* 6. 确认HSM主状态机处于运行态 */
if (Ifx_Hsm_getModuleState() != Ifx_Hsm_ModuleState_run)
{
return 0;
}
return 1;
}
运行与验证
- 将上述代码放入主程序
core0_main()中,在initPhase()之后调用HSM_InitAndVerify()。 - 编译并烧录至TC3xx开发板。
- 在调试器中设置断点于函数返回处,或使用变量
result捕获返回值。
通过条件:函数返回值为1,且调试器寄存器视图中HSM_STRTSTA.BOOT_DONE位为1,HSM_MODSTA寄存器值为0x1(运行态)。若返回0,检查HSM时钟使能位(CCU寄存器)和电源配置是否正确。
关键说明
Ifx_Hsm_enableModuleClock()对应iLLD库中IfxHsm_enableModuleClock(),其内部操作CCU的CLK_SRC寄存器为HSM分配时钟。- HSM固件启动需要约数十毫秒,超时阈值设为1000ms已留足余量;若实际固件较大可适当增加。
- 看门狗必须在HSM启动前关闭,否则启动过程中的长延时可能触发CPU复位。