TC3xx芯片】TC3xx芯片的SCU之WDT
本文介绍了TC3xx系列芯片的看门狗定时器(WDT)及其安全机制。该芯片包含安全看门狗和多个CPU看门狗,每个看门狗具有三个寄存器,并集成ENDINIT保护机制防止关键寄存器意外写入。看门狗采用16位计数器,支持多种时钟频率和安全保护功能,包括密码访问、时序监控和特殊工作模式。当看门狗超时触发报警时,系统会启动恢复定时器(Recovery Timer)进行延时处理,超时后将产生复位信号。此外,TC
目录
3. End-of-Initialization(ENDINIT)保护
3.3.1 WDTxCON0 的密码访问(Password Access to WDTxCON0)
3.3.2 WDTxCON0的检查访问(Check Access to WDTxCON0)
3.3.3 WDTxCON0的修改访问(Modify Access to WDTxCON0)
3. 4 WDTxCON1 ( WDT Control Register 1) 访问
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 RT1,如下:
阈值常见使用默认值0x3FF,RT均打开。

- RTAC00 (Recovery Timer0 Alarm Configuration 0)
- RTAC01 (Recovery Timer0 Alarm Configuration 1)
用于配置RT0的服务对象,包括CPU Watchdog Timeout、Safety Watchdog Timeout等;
RT0主要服务 Safety WDT, CPU0\1\2 WDT
以RTAC00(Recovery Timer0 Alarm Configuration 0)为例,

默认值为0xA80108,即对应ALM Group GID0 = d8 ,Alarm ID ALID0 = d10 ,对应ALM8[10]CPU0 看门狗超时,RT0主要服务 Safety WDT, CPU0\1\2 WDT

每个寄存器可以配置2个Alarm,因此RTAC00 ,RTAC01共计可以配置服务4个Alarm,在默认配置中。
- RTAC10 (Recovery Timer1 Alarm Configuration 0)
RTAC11 (Recovery Timer1 Alarm Configuration 1)
RTAC10\11用于配置RT1的服务对象,包括CPU Watchdog Timeout、Safety Watchdog Timeout等,与上述配置类似,RT1默认服务CPU3\4\5 WDT。
2.3 NMI里可以做什么?
配置好RT后,我们继续来看看看门狗超时的行为--NMI,全称Non-Maskable Interrupt。
它是Tricore内核Trap系统中的一个具体实现。
SMU通过内部行为配置NMI触发一个Trap事件给到SCU,再有SCU仲裁生成Trap给到对应CPU,如下:

trap发生时,会由硬件自动生成一个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 是一种写保护方案,它只允许在特定时间进行写入,并使受此功能保护的寄存器的意外修改几乎不可能实现。
3.1 ENDINIT 类型
TC3xx中有三类ENDINIT机制,分别是E、CE、SE,我们可以从模块寄存器Overview获取当前寄存器受什么保护,如下:

- “ CEy ” - CPU 关键寄存器。 仅当 CPUy WDT ENDINIT=0 (y=CPU number) 时可写。也就是,只有把要要访问这个寄存器的CPU的ENDINIT设为0后,这个寄存器才能被这个CPU写访问(也就是解锁WDTCPUyCON0.ENDINIT)。
- “ E ” - 系统关键寄存器 - 任何 (一个或多个) CPUy WDT ENDINIT=0 或 EICON0.ENDINIT=0 时可写。也就是,任意一个CPU的ENDINIT设为0后,所有CPU都可以对这个寄存器进行写访问。
- “ SE ” - 安全关键寄存器 - 仅当Safty WDT ENDINIT=0 或 SEICON0.ENDINIT=0 时才可写入。也就是,Safety Watchdog的ENDINIT设为0后,Safety EndInit的保护就解除了,所有CPU都可以对这个寄存器进行写访问(也就是解锁WDTSCON0.ENDINIT)。
- .以上都不是 - 随时都可以访问
当软件清除 ENDINIT 位以允许修改时,实际的硬件清除操作并非瞬时完成。

- 当软件清除 ENDINIT 位以允许修改时,实际的硬件清除操作并非瞬时完成。
- 如果在清除 ENDINIT 位后,软件立即尝试访问受保护的寄存器,访问操作可能会在硬件实际解除保护之前发生,从而导致问题。
Note:
- ENDINIT 位的清除需要一些时间。 在清除 ENDINIT 位后访问受 Endinit 保护的寄存器必须仅在 ENDINIT 位真正被清除时进行。 作为一种解决方案, ENDINIT 位应在 ENDINIT位 清除后第一次访问受 Endinit 保护的寄存器之前被读回一次。
EICON0和SEICON0是两个Global的ENDINIT保护寄存器,如果不想改变Watchdog CPUx或者Safety Watchdog的ENDINIT值,但是又想解除保护,就可以使用Global的EICON0和SEICON0(前提是EndInit的保护等级是“E”或者“SE”)。
不过根据芯片手册描述,如果我们使用EDT来访问受Endinit保护的寄存器时,会带来一个负作用,那就是一旦WDTyCON1.ENDINIT置0,该WDT就会自动切换timeout模式(目的是为了避免该bit长期置0),因此需要及时将ENDIINIT复位。
3.2 Watchdog Timer 工作概述


复位以后CPU的Watchdog默认是处在Time-Out Mode下的,WDT在Time-Out Mode下就会从0xFFFC开始往上计数。
如果计数到0xFFFF就会溢出,如果在计数到0xFFFF之前对WDT_CON0进行了password access后对WDT_CON0进行了Modify access,重新对WDT进了reload value到REL_1值(写寄存器前ENDINIT值改为1了,也就是先要介绍ENDINIT保护),这样WDT从Time-Out模式切换到了Normal Mode,这个时候WDT开始从REL_1值晚上计数。
Note: 后面会介绍password access和Modify access

在上图中的3)的地方对WDT_CON0进行了password access,WDT就会切换到Time-Out Mode,WDT又从0xFFFC开始计数,
如果在4)这个点,又对WDT_CON0做了password access就会切换WDT到Normal Mode,同时对WDT_CON0做了一次Modify access后,WDT从REL_2开始计数。

计数到0xFFFF后WDT就溢出了,触发SMU的Timeout的Alarm,这个Alarm会触发SMU里面的一个Recovery time进行计数,Recovery time也timeout后就会产生一个SMU的reset。
3.3 WDTxCON0的访问
WDTxCON0
该寄存器在"检查访问"和"密码访问"操作中用于写入检查数据。在"修改访问"期间,它还会存储定时器重载值、密码更新以及相应的初始化结束控制位。

寄存器描述:


3.3.1 WDTxCON0 的密码访问(Password Access to WDTxCON0)

Password access的条件是LCK为0,ENDINIT为1。WDTxCON0.PW[7:2]写入当前WDTxCON0.PW[7:2]值的反转值,WDTxCON0.PW[15:8]写入当前WDTxCON0.PW[15:8]值,这样Password access就解锁了。
必须向 WDTxCON0(x = CPUy,y 为 CPU 编号,或 S)寄存器写入正确的密码,才能解锁并修改该寄存器。
软件必须事先知道正确的密码,或者在运行时计算密码。 每个监视程序计时器(Watch)的密码 (x=CPUy 和 y=CPU 编号,或 S) 可以不同,以便提供独立的监视程序功能程序流,以具有独立的监视程序功能。
安全看门狗(Safety Watchdog)安全监视器密码寄存器(Safety Watchdog password register) WDTSCON0 受通用 SCU 保护,仅允许配置的主控(Master)写入(参见 ACCEN10 寄存器)
CPU 专用看门狗(CPU-specific Watchdog password register)密码寄存器访问 WDTCPUyCON0 单独受到保护,因此它们只能由相应的 CPUy 写入。
| Safety Watchdog | WDTSCON0 |
| CPU 专用看门狗 | WDTCPUyCON0 |
在安全应用程序中可以使用看门狗来提供恢复时间,在此期间软件可能会尝试从安全警报警告中恢复。 为确保 CPU 故障不允许忽略故障,提供了一个选项,用于在安全管理单元 (SMU) 处于故障状态时防止看门狗解锁。 此选项可由位 WDTxCON1.UR 启用。
如果密码有效且 SMU 状态满足 WDTxSR.US 位的要求,则一旦密码访问完成, WDTxCON0 将被解锁。 解锁条件将由 WDTxCON0.LCK = 0 指示。 为了确保正确的服务顺序(servicing sequence),只有在访问之前设置了 WDTxCON0.LCK 位时才允许密码访问。
如果在密码访问期间向 WDTxCON0 写入了不正确的密码值,则存在看门狗访问错误情况。 位 WDTxSR.AE 已设置,并向安全管理单元 (SMU) 发送警报请求。 14 位用户可定义密码 WDTxCON0.PW 提供了其他选项,用于根据应用程序的需要调整密码要求。 例如,它可用于检测意外的软件循环,或监视例程的执行顺序。
下表 汇总了密码的要求。 有多种选择,下文将更详细地介绍这些选择
3.3.1.1 Static Password
在静态密码模式 (WDTxSR.PAL=0) 中,密码只能通过有效的“修改访问”进行更改。 密码访问(Password Access)的设计使其不可能简单的读取寄存器并重写寄存器。 在重新写入之前,某些密码读取位必须反向 (切换)。 这可以防止简单的故障通过简单的读 / 写序列意外解锁 WDT。
3.3.1.2 Automatic Password Sequencing
如果启用了自动密码排序 (WDTxSR.PA=1) ,则每次检查密码后,密码会自动更改 (即 Password Access or Check Access)。 预期的下一个密码遵循基于具有特征多项式 x14+X13+x12+x2+1 的 14 位斐波那契(Fibonacci) LFSR (Linear Feedback Shift Register) 的pseudorandom sequence。 修改访问权限还可以提供初始密码 (或后续手动密码更新)。
3.3.2 WDTxCON0的检查访问(Check Access to WDTxCON0)
Check Access 与 Password Access 相同,只不过锁位(lock bit)未被清除,因此不允许后续的“修改访问”。 如果满足写入数据要求,“检查访问”不会触发 SMU 警报请求。 只有在设置了 LCK 位时才能执行检查访问。
此类访问用于 WDT 服务之间的中间检查点。 这可以用于任务序列或执行时间监控 (例如,与时间戳计数检查功能或序列密码结合使用)。
Table 2: Check Access Bit Pattern Requirements

如果在检查访问期间向 WDTxCON0 写入了不正确的值 (x=CPUy and y=CPU number, or S) ,则存在看门狗访问错误情况。 位 WDTxSR.AE 已设置,并向安全管理单元 (SMU) 发送警报请求。
3.3.3 WDTxCON0的修改访问(Modify Access to WDTxCON0)
如果密码访问(Password Access)成功解锁 WDTxCON0 (x=CPUy and y=CPU number, or S) ,则以接下来的WDTxCON0 的写入访问可以对其进行修改。当完成Modify access后,这个寄存器就又被lock住了,如果要改它就需要再来一次password access。
Table 3: Modify Access Bit Pattern Requirements

但是,这种访问也必须满足某些要求才能被接受并被视为有效。 表 3列出了所需的位模式(bit patterns)。 如果访问不遵循这些规则,则会检测到监视程序访问错误情况,设置位 WDTxSR.AE ,并向安全管理单元 (SMU) 发送警报请求。 修改访问完成后,将再次设置 WDTxCON0.LCK ,自动重新锁定 WDTxCON0。 在重新修改寄存器之前,必须再次执行有效的密码访问。
3. 4 WDTxCON1 ( WDT Control Register 1) 访问
每个看门狗定时器实例 x(x=CPUy,其中 y=CPU 编号;对于安全看门狗则为 x=S)均配备一个 WDTxCON1 寄存器。对于安全看门狗定时器,x 取值为 S。
WDTxCON1 寄存器用于管理安全看门狗的操作,包含以下功能位:
- 禁用请求位
- 密码配置位
- 频率选择位
写保护机制
每个 WDTxCON1 寄存器均受 安全ENDINIT (SE) 写保护机制控制。



3.5 WDT 模式状态切换

3.6. 访问受Endinit保护的寄存器
如果在运行期间需要对受 Endinit 保护的寄存器进行写入访问,则可以在有限的时间内临时重新启用写入访问。 提供了两种选择:
- 通过 WDT 刷新重新启用对受 ENDINIT 保护的寄存器的访问
- 无需 WDT 刷新即可重新启用对 ENDINIT 保护的寄存器的访问
为了获得调试支持, Cerberus 模块可以覆盖所有 WDT 的所有 ENDINIT 控件,以简化调试流程。 如果设置了 CBS_OSTATE.ENIDIS位 ,则所有 ENDINIT 保护都将被禁用,而不管 WDT 配置的当前状态如何。 如果清除了 CBS_OSTATE.ENIDIS ,则完整的ENDINIT控制位于 WDT 内。
3.6.1 通过WDT访问Endinit保护的寄存器
要重新启用访问(修改受Endinit保护的寄存器),必须先使用有效的密码访问解锁 WDTxCON0。 在随后的有效修改访问中,可以清除 ENDINIT。解锁WDTxCON0且清除ENDINT后, 就能再次打开对受 Endinit 保护的寄存器的访问。 注意,当 WDTxCON0 解锁时, WDT 会自动切换到超时模式。 因此,访问窗口有时间限制。 超时模式仅在重新设置 ENDINIT 后终止,需要另一个有效密码和有效的 WDTxCON0 修改访问权限。
3.6.2 不通过WDT访问Endinit保护的寄存器
在某些应用中,可能不使用 WDT ,并将被禁用 (WDTxSR.DS =1) ,尽管不建议这样做。
在其他应用程序中,可能会使用 WDT 时间戳功能,刷新之间的 WDT 访问将是不可取的。
在这种情况下,仍然可以使用 ENDINIT 全球控制寄存器 (EICONx) 来临时访问受 Endinit 保护的寄存器。
3.6.3 解除Endint保护流程
3.6.4 设置EndInit 保护并且是能WDT 服务

Set EndInit的Modify Access动作会设置WDT_CON0.INIT为1,WDT的Reload timer会重新Reload一次,也就是和Watchdog的喂狗操作是一样的。
参考原文:
- https://blog.csdn.net/qq_36056498/article/details/134617065
- 一文简析TC3xx Rest/Clock/Watch模块-电子发烧友网
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐




所有评论(0)