TC3xx芯片】TC3xx芯片的SCU之WDT
1. TC3xx WDT速览
SCU(system control unit) 是控制不同系统功能模块的集合,这些子模块共享一个公共总线接口,子模块包含了下图这些,具体结构见图。后续文章会详细解读各个部分
TC3xx 芯片包含以下看门狗定时器:
- Safety Watchdog(Safety Watchdog Timer)
- CPU Watchdog (Watchdog Timer per CPU),每一个CPU 核都有自己的CPU Watchdog
TC397 会有 7 个WatchDog。
每个Watchdog有三个Register,WDTxCon0,WDTxCon1,WDTxSR。
除了标准的"看门狗"功能外,每个看门狗定时器还集成了End-of-Initialization(ENDINIT)保护机制,该功能可防止关键寄存器被意外写入。在看门狗服务和修改ENDINIT位是关键操作,必须确保在系统故障时不被执行。为保护这些功能,芯片采用了精密的安全机制:访问看门狗控制寄存器时需要同时验证密码和保护位。任何未提供正确密码或保护位的写操作都会被判定为系统故障,并触发看门狗报警。
此外,即使通过有效访问清除了ENDINIT位以开放关键寄存器的写入权限,看门狗也会为该访问窗口设置时间限制。若未在时限届满前重新正确设置ENDINIT位,系统将被判定为运行异常。这些严格的要求虽不能提供绝对保证,但能显著增强系统运行的鲁棒性。
看门狗定时器的主要特性总结如下:
基本配置
- 采用16位计数器结构
- 可选的输入时钟频率:fSPB/64、fSPB/256 或 fSPB/16384
- 支持16位用户可定义的重载值(正常看门狗模式),超时模式采用固定重载值安全保护机制
- 集成对应的ENDINIT位控制及修改监控功能
- 采用密码访问机制,支持用户自定义密码字段
- 访问错误检测:首次访问密码无效或二次访问保护位无效时,将向SMU触发报警监控能力
- 时序与逻辑监控功能:
- 可选的代码序列校验:错误的代码序列签名将触发SMU报警
- 可选的代码执行时间校验:执行时间超出预设范围将触发SMU报警
- 溢出错误检测:计数器溢出时立即向SMU发出报警请求特殊工作模式
- 看门狗功能可单独禁用(访问保护和ENDINIT监控功能保持有效)
- 可配置安全预警机制:未处理的安全预警事件将禁止看门狗重载,确保SMU硬件及时响应
- (注:fSPB表示系统外设总线时钟频率,SMU为系统管理单元,ENDINIT为初始化结束保护位)
2. TC3xx SMU Watchdog Alarm
2.1 Watchdog Alarm处理流程
根据文档描述,当出现没有及时喂狗的情况,虽然触发了alarm,但仍需要一段特殊流程来保证MCU行为,特别是在重启前给与软件一小段时间用于保存现场,这是非常关键的。
因此,SMU 看门狗alarm处理流程可用下图进行总结:
Watchdog一般情况下如果Watchdog time溢出了就会产生一个watch dog reset,在TC3xx中Watchdog的Timeout并不会直接触发Reset,而是经过配置SMU后会触发SMU里面的一个Recovery Timer启动,Recovery Timer的Timeout时间可以配置,单Recovery Timerout后就会产生一个Alarm,如果这个Alarm配置为Reset信号的话,就会触发Reset。
当WDT timeout发生时,如果采用默认配置,则直接触发NMI;同时有一个名叫Recovery Timer的计时器用于监控WDT Alarm处理的超时,一旦超过预配置的阈值(RTD)后,就会产生一个Recovery timeout的alam(对应ALM10[16-17])。
这个alam的默认配置为Reset(b110:RESET):
这个路径就很清楚了,那么我们来看看比较关键的Recovery Timer该如何配置
2.2 Recovery Timer详解
在SMU里,Recovery Timer共有两个实例,每个实例均可配置服务不同的WDT timeout alarm。
与Recovery Timer相关的寄存器包括:
RTC
Recovery Timer Configuration,用于配置超时阈值、使能RT0\1,如下:
阈值常见使用默认值0x3FF,RT均打开。
- RTAC00
- RTAC01
RTAC00\01用于配置RT0的服务对象,包括CPU Watchdog Timeout、Safety Watchdog Timeout等;
以RTAC00为例,
默认值为0xA80108,即对应ALM Group GID0 = d8 ,Alarm ID ALID0 = d10 ,对应ALM8[10]CPU0 看门狗超时,
每个寄存器可以配置2个Alarm,因此RTAC00 ,RTAC01共计可以配置服务4个Alarm,在默认配置中,RT0主要服务 Safety WDT, CPU0\1\2 WDT
- RTAC10
- RTAC11
RTAC10\11用于配置RT1的服务对象,包括CPU Watchdog Timeout、Safety Watchdog Timeout等,与上述配置类似,RT0默认服务CPU3\4\5 WDT。
2.3 NMI里可以做什么?
配置好RT后,我们继续来看看看门狗超时的行为--NMI,全称Non-Maskable Interrupt。
它是Tricore内核Trap系统中的一个具体实现。
SMU通过内部行为配置NMI触发一个Trap事件给到SCU,再有SCU仲裁生成Trap给到对应CPU,如下:
rap发生时,会由硬件自动生成一个Trap ID,该ID由两部组成,
TCN:Trap Class Number,作为Trap table的索引,由硬件根据BTV生成
TIN:Trap Identification Number,硬件自动加载到的数据寄存器D[15]
3. End-of-Initialization(ENDINIT)保护
为了提供系统的安全性能,TC3xx上一些重要的寄存器都受Endinit保护,不能直接修改。如果想要修改这些重要寄存器,就需要先按特定步骤解锁Endinit,然后才能修改这些重要的寄存器的值,最后还要上锁Endinit。那什么是Endinit功能了?
Endinit 是一种写保护方案,它只允许在特定时间进行写入,并使受此功能保护的寄存器的意外修改几乎不可能实现。
3.1 ENDINIT 类型
以下各节介绍了 WDT 的访问保护方案和 Endinit 超时操作。 在每个模块 (包括 SCU 本身) 的寄存器概览表中,通过每个 Endinit 类型保护的寄存器在描述写入访问的列中标识,如下所示:
- “ CEy ” - CPU 关键寄存器。 仅当 CPUy WDT ENDINIT=0 (y=CPU number) 时可写。也就是,只有把要要访问这个寄存器的CPU的ENDINIT设为0后,这个寄存器才能被这个CPU写访问(也就是解锁WDTCPUyCON0.ENDINIT)。
- “ E ” - 系统关键寄存器 - 任何 (一个或多个) CPUy 看门狗计时器 ENDINIT=0 或 EICON0.ENDINIT=0 时可写。也就是,任意一个CPU的ENDINIT设为0后,所有CPU都可以对这个寄存器进行写访问。
- “ SE ” - 安全关键寄存器 - 仅当安全监控计时器 ENDINIT=0 或 SEICON0.ENDINIT=0 时才可写入。也就是,Safety Watchdog的ENDINIT设为0后,Safety EndInit的保护就解除了,所有CPU都可以对这个寄存器进行写访问(也就是解锁WDTSCON0.ENDINIT)。
- .以上都不是 - 随时都可以访问
EICON0和SEICON0是两个Global的ENDINIT保护寄存器,如果不想改变Watchdog CPUx或者Safety Watchdog的ENDINIT值,但是又想解除保护,就可以使用Global的EICON0和SEICON0(前提是EndInit的保护等级是“E”或者“SE”)。