3. 故障监控核心模块SMU详解

SMU(Safety Management Unit,安全管理单元)是AURIX安全架构中负责“收集报警、判定严重度、触发安全反应”的核心枢纽。它本身不产生故障,而是把来自CPU、外设、存储器、时钟、电源等模块的报警信号汇聚起来,按报警组统一管理,再根据配置决定是仅记录、触发中断,还是直接进入安全状态(如复位、关断输出)。理解SMU,关键要抓住四个对象:报警源、报警组、报警处理路径、寄存器配置。

报警源与报警组:从“点”到“类”的组织方式

报警源(Alarm Source)是SMU监控的最小单元,每个报警源对应一个具体的故障事件,例如“CPU0锁步比较错误”“Flash ECC不可纠正错误”“时钟监控失锁”“电压监控越限”等。AURIX的SMU通常管理数十个报警源,若逐个处理会非常零散,因此硬件把它们按功能域和严重度归入若干报警组(Alarm Group)。同一报警组内的报警源共享一条报警处理路径和一组控制寄存器,这样既减少寄存器数量,也便于按“类”制定安全策略。

需要特别区分两个概念:报警组编号(如Alarm Group 0、1、2……)决定信号走哪条硬件路径;报警严重度(Alarm Class)决定该组被触发后系统应做什么。严重度通常分为三类:Class A为最高级,要求立即进入安全状态;Class B为中级,通常触发中断由软件处理;Class C为最低级,仅记录或触发低优先级中断。配置时先确定每个报警源属于哪个组,再为每个组指定严重度,这是SMU初始化的基本顺序。

SMU 报警源 → 报警组 → 处理路径 结构关系 报警源(Alarm Source) CPU0 锁步比较错误 ALM_CPU0_LOCKSTEP Flash ECC 不可纠正 ALM_FLASH_ECC_UNC 时钟监控失锁 ALM_CLK_LOSS 电压监控越限 ALM_VMON_OV SRAM ECC 可纠正 ALM_SRAM_ECC_COR 总线协议错误 ALM_BUS_PROTO 看门狗超时 ALM_WDT_TIMEOUT 温度传感器越限 ALM_TEMP_HIGH 报警组(Alarm Group) Group 0 CPU / 锁步 / 总线 Class A(最高) Group 1 Flash / SRAM ECC Class B(中级) Group 2 时钟 / 电压 / 温度 Class B(中级) Group 3 可纠正 ECC / 状态 Class C(最低) 报警处理路径 Class A 路径 立即触发复位 / 关断输出 进入安全状态,不等待软件 Class B 路径 触发 SMU 中断,通知软件 软件在 ISR 中读取状态并处理 Class C 路径 仅置位状态标志 / 计数 由软件周期查询或低优先级中断 外部报警路由 通过 SMU 输出引脚 / 端口 送至外部安全芯片或系统级监控 用于整车 / 系统级降级策略 注:报警组编号与严重度映射由 SMU 配置寄存器决定,图中为教学示例划分

报警处理流程:从触发到响应的完整链路

当某个报警源被触发后,SMU内部的处理链路大致如下:报警源置位 → 对应报警组的状态寄存器(如AGxSR)置位 → 根据该组配置的严重度选择路径 → 若为Class A则直接驱动复位或安全输出;若为Class B则置位中断标志并产生SMU中断请求;若为Class C则仅置位状态位。软件在中断服务程序或周期任务中读取状态寄存器,确认是哪个报警源触发,执行相应处理,最后写1清零(Write-1-to-Clear)该状态位。若不清零,同一报警组后续的报警可能被屏蔽或无法再次触发中断,这是实际调试中常见的“报警只报一次”问题根源。

此外,SMU还支持报警计数与阈值机制。某些报警源可配置为“累计N次才升级严重度”,例如可纠正ECC错误累计超过阈值后,从Class C升级为Class B,从而在故障恶化前提前介入。这一机制通过报警计数寄存器(如AGxCNT)和阈值寄存器配合实现。

内部与外部报警路由

SMU的报警路由分为内部和外部两条。内部路由面向芯片内部:Class A直接连接到复位控制逻辑和安全管理单元输出,Class B连接到CPU中断控制器(如IR),Class C连接到状态寄存器供软件查询。外部路由则通过SMU的输出端口(如SMU_OUT、ERROR_PIN等)把报警状态送到芯片外部,供外部安全监控芯片、系统基础芯片(SBC)或整车控制器使用。外部路由通常需要配置端口复用、输出极性和驱动能力,并注意与外部器件的电平匹配。

实际工程中,外部路由常用于“芯片内部无法独立处理”的场景:例如Class A报警触发内部复位后,外部SBC需要同步获知并记录故障码,以便整车诊断。此时SMU输出引脚会保持有效电平直到软件清除,外部器件据此判断故障类型。

SMU寄存器配置与初始化

SMU的寄存器按功能分为几类:报警组配置寄存器(AGxCFG)用于设置严重度和使能;报警组状态寄存器(AGxSR)用于读取和清除报警状态;报警组计数与阈值寄存器(AGxCNT、AGxTHR)用于累计报警;全局控制寄存器(SMU_CFG)用于使能SMU、设置外部路由等。初始化顺序建议如下:

  1. 解锁SMU配置寄存器(通常需要写安全端序或访问保护寄存器)。
  2. 配置每个报警组的严重度(Class A/B/C)和使能位。
  3. 配置报警计数阈值(如需要)。
  4. 配置外部报警路由的端口和极性。
  5. 清除所有报警组状态寄存器中的历史标志。
  6. 使能SMU全局控制位,退出配置模式。

下面是一段示例性的初始化代码片段,用于说明寄存器操作顺序(参数为教学示例,非实际芯片实测值):

/* SMU 初始化示例(教学用,寄存器名与位域为示意) */
SMU_CFG = 0x00000000;          /* 先关闭 SMU,进入配置模式 */
SMU_AG0CFG = 0x00000001;       /* Group 0: Class A, 使能 */
SMU_AG1CFG = 0x00000002;       /* Group 1: Class B, 使能 */
SMU_AG2CFG = 0x00000002;       /* Group 2: Class B, 使能 */
SMU_AG3CFG = 0x00000003;       /* Group 3: Class C, 使能 */
SMU_AG1THR = 0x00000005;       /* Group 1 累计 5 次升级 */
SMU_AG1CNT = 0x00000000;       /* 清零计数 */
SMU_OUTCFG = 0x00000001;       /* 使能外部报警输出,高有效 */
SMU_AG0SR = 0xFFFFFFFF;        /* 清除所有历史状态(写1清零) */
SMU_AG1SR = 0xFFFFFFFF;
SMU_AG2SR = 0xFFFFFFFF;
SMU_AG3SR = 0xFFFFFFFF;
SMU_CFG = 0x00000001;          /* 使能 SMU,退出配置模式 */
配置完成后,建议通过读取SMU_AGxSR确认所有状态位为0,再触发一次已知报警源(如软件注入可纠正ECC错误)验证中断是否按预期产生。若中断未产生,优先检查该报警组是否使能、严重度是否配置为Class B、以及中断控制器中SMU中断是否已开放。
写状态寄存器时务必使用“写1清零”方式,直接写0不会清除标志。若在中断中忘记清零,该报警组将无法再次触发中断,导致后续同类故障被漏报。

总结来看,SMU的配置本质是“把报警源归组、给组定级、按级选路、按路响应”。初始化时先关SMU再配置,配置完清状态再使能,运行中在中断里读状态、处理、清零,并定期检查计数与阈值。掌握这条主线,就能在AURIX安全工程中把SMU从“会报错”变成“可控地报错并正确响应”。