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内部的处理链路大致如下:报警源置位 → 对应报警组的状态寄存器(如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、设置外部路由等。初始化顺序建议如下:
- 解锁SMU配置寄存器(通常需要写安全端序或访问保护寄存器)。
- 配置每个报警组的严重度(Class A/B/C)和使能位。
- 配置报警计数阈值(如需要)。
- 配置外部报警路由的端口和极性。
- 清除所有报警组状态寄存器中的历史标志。
- 使能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的配置本质是“把报警源归组、给组定级、按级选路、按路响应”。初始化时先关SMU再配置,配置完清状态再使能,运行中在中断里读状态、处理、清零,并定期检查计数与阈值。掌握这条主线,就能在AURIX安全工程中把SMU从“会报错”变成“可控地报错并正确响应”。