1. 项目概述与核心价值在嵌入式系统开发尤其是汽车电子、工业控制这类对时序和可靠性要求近乎苛刻的领域一个精准、可靠且功能丰富的定时器模块其重要性不亚于CPU本身。它不仅是系统心跳的节拍器更是守护系统生命线的“安全员”。今天要深入探讨的实时中断RTI模块正是德州仪器TI在其诸多高性能微控制器中集成的这样一个核心外设。它远不止是一个简单的定时器而是一个集成了独立计数器、可编程比较/捕获、以及高级数字看门狗包括窗口看门狗于一体的硬件时序管理引擎。很多刚接触这类器件的朋友可能会觉得定时器嘛不就是设置个计数值然后等中断吗但当你真正需要构建一个需要多任务调度、精确时间戳记录、或满足功能安全如ISO 26262要求的系统时一个基础定时器就捉襟见肘了。RTI模块的设计恰恰是为了解决这些复杂场景下的痛点它提供两个完全独立的64位时间基准允许你为不同的任务或外设分配不同的“时钟源”它的四个可配置比较器可以灵活产生操作系统OS的滴答中断或触发DMA传输解放CPU而其集成的数字看门狗特别是数字窗口看门狗DWWD提供了远超传统看门狗的故障检测能力能有效识别“喂狗”过早、过晚等异常模式极大增强了系统的抗干扰和自恢复能力。理解并熟练运用RTI模块意味着你能为你的嵌入式系统打下坚实的时间管理和安全监控基础。无论是实现一个高精度的延时函数构建一个实时操作系统的调度核心还是为关键安全任务设计“双保险”监控机制RTI都能提供硬件级的支持。接下来我将结合手册内容和个人在汽车ECU开发中的实际经验拆解RTI的每一个核心功能从原理到寄存器操作再到实际编程中的坑与技巧希望能为你呈现一幅清晰、可落地的实战图谱。2. RTI模块整体架构与核心设计思路要驾驭RTI模块首先得从宏观上理解它的设计哲学。它不是一个单一的定时器而是一个高度模块化、可配置的定时器子系统。其核心设计围绕着“提供灵活、可靠且安全的时间服务”展开。2.1 核心组件构成从提供的框图和数据手册描述来看RTI模块主要由以下几大核心部分组成我们可以将其想象成一个精密的钟表作坊计数器块Counter Blocks这是RTI的“心脏”。模块内包含两个完全相同的、独立的64位计数器块Counter Block 0 和 Counter Block 1。每个计数器块又由一个32位上行计数器Up Counter, RTIUCx和一个32位自由运行计数器Free-Running Counter, RTIFRCx级联构成。上行计数器由RTICLK驱动每计满一个设定的比较值RTICPUCx就向自由运行计数器进一位。这种设计实现了对高频时钟RTICLK的可编程分频从而生成一个频率更低、但位数更宽64位的稳定时间基准。两个独立的块意味着你可以用不同的时间基准去驱动不同的系统功能互不干扰。比较单元Compare Unit这是RTI的“闹钟”系统。模块提供了四个独立的比较寄存器RTICOMP0-3。每个比较寄存器都可以被配置为与Counter Block 0或Counter Block 1的自由运行计数器值进行比较。当计数值与预设的比较值匹配时就会产生一个事件。这个事件可以被路由到两个地方一是触发一个中断给向量中断管理器VIM用于执行中断服务程序二是触发一个DMA请求直接启动数据传输完全无需CPU干预。更强大的是每个比较器还配有一个“更新比较值”寄存器RTIUDCPy在每次匹配发生后会自动将更新值加到当前比较值上从而实现周期性的中断或DMA触发无需软件反复重装极大地减轻了CPU负担并保证了时序精度。捕获功能Capture Feature这是RTI的“秒表”功能。两个计数器块各配备了一套捕获机制。你可以配置一个外部事件源通常来自其他外设的中断信号来触发捕获。当事件发生时当前计数器块的上行计数器和自由运行计数器的值会被瞬间“冻结”并存入对应的捕获寄存器中。这常用于精确测量两个外部事件之间的时间间隔例如测量一个脉冲的宽度或两个传感器信号到来的时间差。数字看门狗定时器Digital Watchdog Timer, DWD/DWWD这是RTI的“安全卫士”。它本质上是另一个独立的计数器通常基于Counter Block 0但逻辑更专注于系统监控。其核心任务是如果CPU不能在规定时间内“喂狗”向特定寄存器写入正确的密钥序列看门狗就会认为系统运行异常进而触发系统复位Reset或不可屏蔽中断NMI。而**数字窗口看门狗DWWD**是其高级形态它不仅仅规定了一个最终期限还规定了一个“服务窗口期”。CPU必须在计数器递减到窗口开启后、归零前这个时间段内喂狗过早或过晚都会触发违规。这能有效检测出程序卡在某个循环中“疯狂”喂狗或者程序跑飞后偶然执行到喂狗指令等更隐蔽的故障。2.2 模块操作的基本时钟流理解时钟是理解定时器的关键。RTI模块的时钟源是RTICLK它通常来源于系统时钟的分频。这个时钟驱动着两个计数器块的上行计数器RTIUCx。每个上行计数器RTIUCx都有一个对应的比较寄存器RTICPUCx。RTIUCx从0开始每个RTICLK周期加1直到其值等于RTICPUCx中设定的值。此时两个事情发生上行计数器RTIUCx被清零。对应的自由运行计数器RTIFRCx加1。因此自由运行计数器RTIFRCx加1的频率f_FRCx就由RTICPUCx的值决定公式如下当 RTICPUCx ≠ 0 时f_FRCx f_RTICLK / (RTICPUCx 1)当 RTICPUCx 0 时不推荐f_FRCx f_RTICLK / (2^32 1)举个例子假设f_RTICLK 100 MHz设置RTICPUC0 9999。那么RTIUC0每计数10000个RTICLK周期即0.1 ms就会清零一次并让RTIFRC0加1。因此RTIFRC0的计数频率就是100 MHz / 10000 10 kHz即每0.1 ms计数值增加1。RTIFRC0是一个32位计数器所以它的溢出周期非常长约为2^32 * 0.1 ms ≈ 429496729.6 ms ≈ 1193小时。这为系统提供了一个非常宽泛且稳定的长周期时间基准。关键设计考量为什么需要两个独立的64位计数器在实际系统中不同的功能对时间基准的精度和周期需求不同。例如操作系统的调度器可能需要一个1ms的精确滴答而一个后台的数据日志任务可能只需要一个100ms的粗粒度定时。使用两个独立的计数器块可以分别配置不同的RTICPUCx值生成不同频率的时间基准f_FRC0和f_FRC1然后让不同的比较器关联不同的FRC。这样所有定时任务都基于统一的硬件时钟源但又能满足各自不同的周期需求架构上非常清晰也避免了软件分频带来的误差和负担。3. 计数器操作、比较中断与DMA请求的实战解析理解了架构我们进入实战环节。如何使用RTI模块产生一个周期性的中断如何配置DMA请求这里面的细节和“坑”不少。3.1 计数器初始化与启动流程在操作任何寄存器之前务必先查阅芯片数据手册确认RTI模块的基地址和时钟RTICLK的来源与频率。假设我们已经知道RTICLK 100 MHz。步骤1配置计数器分频设置时间基准我们的目标是让Counter Block 0产生一个1ms的时间基准。即要求f_FRC0 1 kHz。 根据公式f_FRC0 f_RTICLK / (RTICPUC0 1)代入1000 Hz 100,000,000 Hz / (RTICPUC0 1)解得RTICPUC0 (100,000,000 / 1000) - 1 99,999我们需要向RTICPUC0寄存器写入99,9990x1869F。同样如果需要Counter Block 1产生另一个时间基准比如10ms则计算RTICPUC1 (100,000,000 / 100) - 1 999,999。步骤2设置比较值与更新值设定“闹钟”假设我们想利用Counter Block 0的基准每10ms产生一次中断。由于FRC0每1ms加1那么10ms就需要FRC0计数值增加10。 因此我们需要设置比较寄存器RTICOMP0的初始值。通常我们从0开始所以第一次匹配值就是10。同时我们希望这个中断是周期性的所以需要设置更新寄存器RTIUDCP0也为10。这样每次比较匹配后RTICOMP0的新值会自动变为旧值 10从而实现每10ms一次的中断。步骤3配置比较控制选择“闹钟”关联的计数器通过RTICOMPCTRL寄存器的COMPSEL0位我们需要指定RTICOMP0是与RTIFRC0比较还是与RTIFRC1比较。这里我们选择与RTIFRC0比较所以设置COMPSEL0 0。步骤4使能计数器与比较中断首先通过RTIGCTRL寄存器的CNT0EN位使能Counter Block 0。 然后通过RTISETINTENA寄存器使能RTICOMP0对应的中断。通常每个比较事件在RTISETINTENA中都有对应的位例如SETINT0对应RTICOMP0。步骤5编写中断服务程序ISR在中断向量表中配置好RTI比较中断的入口。在ISR中首要任务是清除中断标志位通过读取RTIINTFLAG寄存器或向特定清除寄存器写入。然后执行你的定时任务例如更新系统时钟、检查任务队列等。关键代码片段示意以C语言和伪寄存器操作为例// 假设 RTI_BASE 为模块基地址 #define RTI_BASE 0xFFFFFC00 #define RTICPUC0 (*(volatile uint32_t *)(RTI_BASE 0x18)) #define RTICOMP0 (*(volatile uint32_t *)(RTI_BASE 0x50)) #define RTIUDCP0 (*(volatile uint32_t *)(RTI_BASE 0x54)) #define RTICOMPCTRL (*(volatile uint32_t *)(RTI_BASE 0x0C)) #define RTIGCTRL (*(volatile uint32_t *)(RTI_BASE 0x00)) #define RTISETINTENA (*(volatile uint32_t *)(RTI_BASE 0x80)) void RTI_Init_10ms_Tick(void) { // 1. 停止计数器可选但安全起见先停止 RTIGCTRL ~(1 0); // 清除CNT0EN停止Counter Block 0 // 2. 配置分频产生1ms基准 (RTICLK100MHz) RTICPUC0 99999; // 100MHz / 100000 1kHz // 3. 配置比较器0初始值10更新值10实现10ms周期 RTICOMP0 10; RTIUDCP0 10; // 4. 配置比较器0使用Counter Block 0 (FRC0) RTICOMPCTRL ~(1 0); // 设置COMPSEL0 0 // 5. 使能比较器0中断 RTISETINTENA | (1 0); // 使能INT0 // 6. 启动Counter Block 0 RTIGCTRL | (1 0); // 设置CNT0EN 1 } // 在中断服务程序中 void RTI_Compare0_ISR(void) { // 清除中断标志具体寄存器位需查手册 // 例如向RTIINTFLAG的对应位写1清零 *(volatile uint32_t *)(RTI_BASE 0x88) (1 0); // 执行10ms定时任务 System_10ms_Task(); }3.2 使用DMA请求替代中断RTI的比较事件除了产生中断还可以触发DMA请求。这在需要高频、规律性数据搬运的场景下非常有用可以完全解放CPU。例如你需要每隔100us就将ADC的采样结果搬运到内存中的一个缓冲区。配置思路配置RTI如上所述设置一个100us周期的比较事件例如使用Counter Block 1配置合适的RTICPUC1和RTICOMPy/RTIUDCPy。配置DMA通道在DMA控制器中将一个通道的触发源设置为对应的RTI DMA请求例如RTI比较事件2可能映射到DMA请求线18。设置DMA的源地址如ADC结果寄存器、目标地址内存缓冲区、传输数据量等。使能RTI的DMA请求输出通常除了使能中断的RTISETINTENA可能还有专门的寄存器位或方式使能该比较事件向DMA控制器发出请求。需要仔细查阅手册中关于DMA请求使能的部分。启动使能RTI计数器和比较器使能DMA通道。之后每次RTI比较匹配就会自动触发DMA进行一次数据传输CPU无需干预。优势避免了频繁的中断进入/退出开销大大提高了数据传输效率尤其适合音频流、高速数据采集等场景。3.3 读取64位计数器的正确姿势与捕获功能应用这是一个极易出错的细节。由于数据总线是32位的读取64位的计数器RTIUCx RTIFRCx需要分两次进行。如果顺序不对可能会读到“撕裂”的值即两次读取之间计数器进位了。规则必须首先读取自由运行计数器RTIFRCx然后读取上行计数器RTIUCx。为什么因为当你读取RTIFRCx时硬件会自动将当前RTIUCx的值锁存到一个影子寄存器中。随后你读取RTIUCx时得到的正是读取RTIFRCx那一时刻对应的上行计数值。这样就保证了两个32位数组合起来是一个完整的、时间一致的64位时间戳。uint64_t Read_Counter_Block0(void) { uint32_t frc0_high, frc0_low, uc0; uint64_t full_counter; // 错误做法先读UC0再读FRC0值可能不匹配 // uc0 RTIUC0; // frc0 RTIFRC0; // 正确做法先读FRC0 frc0_low RTIFRC0; // 读取低32位同时锁存UC0值 uc0 RTIUC0; // 读取锁存的UC0值 frc0_high RTIFRC0_HI; // 假设有高32位寄存器具体看手册可能合并或分开 // 组合成64位值 (注意高低位顺序取决于寄存器定义) full_counter ((uint64_t)frc0_high 32) | (uint64_t)frc0_low; // UC0是FRC0的“小数部分”通常用于更高精度的时间计算 return full_counter; }捕获功能的读取顺序同理必须先读捕获的自由运行计数器寄存器RTICAFRCx再读捕获的上行计数器寄存器RTICAUCx。捕获功能常用于性能剖析Profiling或精确计时。例如你可以在函数入口和出口分别触发捕获事件通过配置外部事件源如一个GPIO中断然后读取两次捕获的时间戳差值即可得到函数执行的精确时间精度可以达到RTICLK的周期级别。4. 数字看门狗DWD与数字窗口看门狗DWWD的深度配置与安全策略看门狗是嵌入式系统的“最后防线”。RTI模块集成的数字看门狗特别是窗口看门狗提供了工业级的安全监控能力。4.1 基础数字看门狗DWD配置流程计算超时时间与预装载值超时时间t_exp由公式t_exp (DWDPRLD 1) × 2^13 / f_RTICLK决定。DWDPRLD是12位预装载值0-4095。假设f_RTICLK 100 MHz我们需要设置一个约500ms的超时。计算500ms (DWDPRLD 1) * 8192 / 100,000,000 Hz。解得DWDPRLD 1 ≈ 6103.5取整为6103。因此DWDPRLD 6102。注意DWDPRLD写入的是12位值计算出的值必须小于4096。如果需要更长的超时时间可能需要降低f_RTICLK或接受最大超时限制。配置预装载寄存器向RTIDWDPRLD寄存器写入计算出的值如6102。使能看门狗向RTIDWDCTRL寄存器写入特定的32位使能值具体值需查手册通常是一个密钥。这是一个不可逆操作一旦使能只有系统复位才能关闭看门狗。喂狗服务程序在应用程序的主循环或关键任务中必须定期按顺序写入正确的密钥序列到RTIWDKEY寄存器先写入0xE51A再写入0xA35C。写入后看门狗递减计数器会被重载为(DWDPRLD 13)的值然后重新开始递减。4.2 高级数字窗口看门狗DWWD原理与配置DWWD是DWD的增强版它引入了“服务窗口”的概念极大地提高了故障检测的覆盖率。窗口概念传统的看门狗只规定了一个最终期限T_timeout。只要在这个期限前喂狗即可。这存在一个漏洞如果程序跑飞但恰好卡在一个包含喂狗指令的短循环里它可能会在远早于预期的时间点“疯狂”喂狗从而逃避检测。DWWD通过定义一个窗口期来解决这个问题。窗口期由窗口大小和超时时间共同决定。超时时间由RTIDWDPRLD设定与DWD相同。窗口大小由RTIWWDSIZECTRL寄存器配置可选100%、50%、25%、12.5%、6.25%、3.125%。100%窗口等同于普通DWD整个超时周期内都可以喂狗。50%窗口喂狗操作只能在超时时间的后50%内进行即计数器值从(DWDPRLD1)*2^13 / 2递减到0这段时间。25%窗口喂狗操作只能在超时时间的后25%内进行。以此类推。配置与使用流程禁用DWWD计数器在配置前确保看门狗未使能或已通过复位禁用。配置预装载值RTIDWDPRLD设定超时时间。配置窗口大小RTIWWDSIZECTRL根据你期望的“喂狗”时间点选择合适的窗口。例如如果你的喂狗任务预期在超时前的最后10%时间内执行可以选择12.5%或6.25%的窗口为执行时间留出余量。配置违规反应RTIWWDRXNCTRL决定窗口违规时产生复位Reset还是不可屏蔽中断NMI。对于最高安全等级通常直接配置为复位。配置为NMI时系统有机会在中断中记录错误日志后再复位但需要确保NMI服务程序本身非常简短可靠并能最终正确地服务看门狗或触发复位。使能DWWD通过RTIDWDCTRL寄存器使能。在窗口期内喂狗应用程序必须在计数器递减到窗口开启后才能进行喂狗操作写入0xE51A和0xA35C。过早喂狗窗口未开启会立即触发违规过晚喂狗计数器已归零也会触发违规。窗口期计算示例 假设f_RTICLK 100 MHzDWDPRLD 6102超时约500ms窗口大小设置为25%。总计数周期 (6102 1) * 2^13 ≈ 50,000,000 个RTICLK周期。窗口期开始的点 总计数周期 * (1 - 25%) 50,000,000 * 0.75 37,500,000 个计数。 这意味着喂狗操作必须在看门狗计数器从37,500,000递减到0这段时间内进行。过早计数器值 37,500,000或过晚计数器已到0都会导致系统复位。4.3 看门狗使用中的致命陷阱与最佳实践喂狗时序的临界竞争手册中特别警告“Care should be taken to ensure that the CPU write to the watchdog register is made allowing time for the write to propagate to the RTI.” 这意味着在喂狗操作两次写RTIWDKEY之后不能立即执行可能长时间阻塞或关闭总线访问的代码例如某些低功耗模式入口、对慢速Flash的写操作。需要确保写操作确实到达RTI模块后再执行后续代码。一个简单的做法是在喂狗后插入几条NOP指令或一个短暂的空循环。中断与主循环的协同如果喂狗操作放在主循环中要确保没有中断服务程序ISR能长时间关闭总中断或阻塞主循环运行。如果喂狗放在一个高优先级定时器中断中则要确保该中断不会被意外禁用或延迟。DWWD窗口大小的选择窗口不能设得太“紧”。要给你的喂狗任务执行时间留出足够的余量Margin考虑到最坏情况下的执行时间Worst-Case Execution Time, WCET并加上一定的安全裕量。通常选择比理论计算窗口大一级的配置。NMI处理如果配置为窗口违规触发NMI在NMI服务程序中必须清除违规状态标志并且必须正确地服务看门狗写入密钥序列否则NMI会持续产生。同时NMI服务程序应尽可能短小只做最关键的错误记录然后尽快安排系统复位不应尝试修复复杂的不确定状态。测试与验证在开发阶段必须有意识地测试看门狗的有效性。例如可以临时注释掉喂狗代码验证系统是否能按预期复位。对于DWWD可以尝试在窗口期前或后喂狗验证违规反应是否触发。5. 寄存器详解与关键配置速查表手册中列出了大量寄存器这里提炼出最核心、最常用的部分并解释其关键位域。理解这些寄存器是进行底层编程的基础。表RTI核心功能寄存器速查寄存器名称 (偏移量)主要功能关键位域与说明RTIGCTRL (00h)全局控制CNT0EN/CNT1EN (位0/1)分别使能计数器块0和1。COS (位15)调试暂停行为。0暂停时计数器停止1暂停时计数器继续运行。RTICPUC0/1 (18h/38h)比较上行计数器写入值N则上行计数器每计满N1个RTICLK周期自由运行计数器加1。切勿设为0。RTICOMPCTRL (0Ch)比较控制COMPSEL[3:0] (位0,4,8,12)分别选择COMP0-3与哪个FRC比较0FRC01FRC1。RTICOMPy (50h,58h,60h,68h)比较值寄存器设置与FRC比较的初始值。匹配时触发中断/DMA。RTIUDCPy (54h,5Ch,64h,6Ch)更新比较值寄存器比较匹配后自动加到RTICOMPy上的值。用于产生周期性事件。RTISETINTENA (80h)置位中断使能写1到某位使能对应的比较中断或溢出中断。RTICLEARINTENA (84h)清除中断使能写1到某位禁用对应的中断。RTIINTFLAG (88h)中断标志寄存器读取可查看哪些中断事件发生。通常通过向对应位写1来清除标志。RTIDWDCTRL (90h)数字看门狗控制写入特定32位密钥以使能看门狗。一旦使能无法软件禁用。RTIDWDPRLD (94h)看门狗预装载值12位值决定超时时间。公式t_exp (DWDPRLD 1) * 2^13 / f_RTICLK。RTIWDKEY (9Ch)看门狗密钥寄存器喂狗序列先写0xE51A再写0xA35C。任何错误的写入都会立即触发复位/NMI。RTIWWDSIZECTRL (A8h)窗口看门狗大小控制配置服务窗口相对于超时周期的百分比100%, 50%, 25%, 12.5%, 6.25%, 3.125%。RTIWWDRXNCTRL (A4h)窗口看门狗反应控制配置窗口违规时触发复位还是NMI。关于“特权模式写入”手册中许多寄存器标注为WPWrite in Privileged mode only。这意味着在具有内存保护单元MPU或类似机制的系统中只有在特权模式如操作系统内核态下才能修改这些寄存器。用户态任务试图写入会导致硬件错误。这是在多任务系统中保护关键定时器资源不被误操作的重要机制。6. 常见问题排查与调试经验实录在实际项目中使用RTI模块难免会遇到各种问题。下面是我和同事们踩过的一些坑以及对应的排查思路。问题1RTI中断无法产生或产生频率不对。检查顺序时钟确认RTI模块的钟RTICLK是否使能且频率正确。检查系统时钟配置、外设时钟门控。计数器使能确认RTIGCTRL.CNTxEN位已置1。分频计算复核RTICPUCx的计算公式。f_FRCx f_RTICLK / (RTICPUCx 1)。一个常见错误是忘了1。比较值与更新值确认RTICOMPy和RTIUDCPy的设置。如果RTIUDCPy为0则是一次性比较不会产生周期性中断。中断使能与路由确认RTISETINTENA已使能对应中断。确认中断向量表VIM中已正确配置该RTI中断的入口函数和优先级。中断标志清除在中断服务程序ISR中是否清除了对应的中断标志位如果没有清除中断只会发生一次。调试技巧可以暂时将中断服务程序简化成一个翻转GPIO引脚的操作用示波器测量引脚波形直观判断中断是否按预期频率发生。问题2看门狗意外复位系统。检查顺序喂狗时序喂狗代码是否严格按0xE51A-0xA35C的顺序执行两次写入之间是否有其他操作确保是原子操作或不会被中断打断。窗口期如果使用DWWD计算一下你的喂狗任务最坏执行时间是否可能在窗口开启前就执行了或者因为任务阻塞导致错过了窗口期使用更宽松的窗口设置或优化代码。看门狗使能时机是否在系统初始化早期任务调度启动前就使能了看门狗导致初始化代码执行时间过长而触发复位。建议在系统完全初始化完毕、主循环开始前再使能看门狗。低功耗模式进入低功耗模式后RTICLK可能停止导致看门狗计数器暂停。退出低功耗模式后需要及时喂狗。查阅手册中关于“Continue on Suspend (COS)”位的说明了解在调试暂停模式下计数器的行为。调试技巧在RTIWDSTATUS寄存器中可能包含看门狗复位的原因如超时、密钥错误。在系统启动后尽早读取并记录该寄存器值到非易失性存储器中供后续分析。问题3读取的64位时间戳出现“跳变”或不连续。原因几乎可以肯定是读取顺序错误。必须严格遵守先读RTIFRCx后读RTIUCx对于捕获则是先读RTICAFRCx后读RTICAUCx的顺序。解决方案封装一个专门的读取函数并在函数内严格遵循此顺序。如果需要在多处读取就调用这个函数避免重复代码和潜在错误。问题4使用DMA触发时数据传输不规律或丢失。检查顺序DMA请求映射确认RTI的比较事件号正确映射到了DMA控制器的哪个请求输入。不同芯片的映射关系可能不同。DMA使能确认RTI端已配置为产生DMA请求可能涉及RTICOMPCTRL或其他寄存器中关于输出选择的位并且DMA通道已正确配置并使能。带宽与优先级检查DMA通道的优先级确保不会被更高优先级的DMA传输长时间阻塞。检查目标内存或外设的访问速度是否跟得上DMA触发频率。调试技巧可以先用中断模式验证RTI定时事件的准确性然后再切换到DMA模式。利用DMA传输完成中断来检查数据传输是否成功。问题5在调试模式下Halting Debug定时行为异常。关注RTIGCTRL.COS位该位决定当芯片被调试器暂停时RTI计数器是否继续运行。COS0计数器停止。这对于调试与时间相关的代码很有用可以“冻结”时间。COS1计数器继续。这对于调试需要实时响应的系统如通信协议可能更重要但会让调试过程更复杂。根据调试需求选择合适的COS设置并理解其影响。例如如果看门狗在调试时也继续计数你可能需要在调试会话中定期手动喂狗或者临时增大超时时间。