深入解析TI RTI模块:硬件定时、自动重载与看门狗实战
1. RTI模块核心架构与设计思路拆解在嵌入式系统开发尤其是汽车电子和工业控制这类对实时性要求严苛的领域定时器模块的稳定性和精确度直接决定了系统的可靠性。德州仪器TI的实时中断RTI模块就是为满足这种高要求而设计的一套复杂且强大的硬件定时系统。它远不止是一个简单的计数器而是一个集成了多路独立比较、自动重载、中断管理乃至硬件看门狗的综合性外设。很多工程师初次接触RTI的数据手册时容易被其繁多的寄存器列表吓到感觉无从下手。其实只要理解了其核心的设计哲学——“基于事件的自动触发与状态机管理”就能化繁为简。RTI模块的核心可以看作一个“双引擎驱动”的架构。第一个引擎是自由运行计数器Free-Running Counter通常有RTIFRC0和RTIFRC1两个它们就像两个永不停止的时钟为整个模块提供时间基准。第二个引擎是比较匹配逻辑它包含多组“比较寄存器COMPx”和“更新比较寄存器UDCPx”对。你可以把COMPx想象成闹钟设定的时间点而UDCPx则是闹钟响过后自动为下一次闹铃延后的时间间隔。当计数器的值“走到”COMPx设定的值时就产生一个“匹配事件”。这个事件是RTI模块一切功能的源头它可以被配置为触发一个CPU中断让软件立即响应也可以触发一个DMA请求让数据搬运在后台静默完成不占用CPU资源。这种设计的精妙之处在于“自动更新”机制。传统定时器在中断服务程序中需要手动重装定时初值这引入了软件延迟和不确定性。而RTI的UDCPx寄存器允许在硬件层面在比较匹配发生的瞬间自动将UDCPx的值加到COMPx上从而设定好下一次匹配的时间点。这就实现了完全由硬件保障的、周期绝对精确的定时中断软件只需要在第一次初始化时设定好COMPx和UDCPx之后就可以“放任不管”极大地解放了CPU也消除了因中断服务程序延迟导致定时漂移的风险。中断管理则是另一层设计重点。RTI没有采用简单的单个使能位而是提供了RTISETINTENA置位使能和RTICLEARINTENA清零使能这一对寄存器。这种设计是为了避免在多任务或中断嵌套环境中进行“读-修改-写”操作可能引发的竞态条件。你可以直接向RTISETINTENA的对应位写1来使能某个中断无需先读取整个寄存器的值保证了操作的原子性和安全性。最后看门狗子系统是RTI作为“系统卫士”的关键。数字看门狗DWD和窗口看门狗WWWD提供了不同级别的保护。DWD就像一个简单的倒计时炸弹如果不在规定时间内“喂狗”写入正确的密钥序列就会引爆系统复位。而WWWD则更加严格它规定了一个“时间窗口”喂狗既不能太早也不能太晚必须在窗口期内进行这对于检测软件逻辑混乱或时序错乱异常有效。RTIWDSTATUS寄存器则像是一个“黑匣子”在系统复位后能告诉你上次“死机”的原因究竟是看门狗超时、窗口违规还是密钥错误对于后期调试至关重要。理解了这个架构我们再去看那几十个寄存器就会发现它们各司其职共同构建了这个强大的定时与监控系统。接下来的内容我们将深入寄存器的细节看看如何将这些硬件特性转化为实际可用的代码和配置。1.1 核心需求解析为何需要如此复杂的定时器你可能会问一个简单的SysTick定时器不就够了吗为什么需要RTI这么复杂的模块这源于工业级和车规级应用的几个硬性需求多速率精确定时一个复杂的控制系统往往需要多种不同周期的定时任务。例如电机控制PWM可能需要100微秒的中断通信协议处理需要10毫秒的周期而系统状态监控则需要1秒的周期。使用多个独立的通用定时器GPT会占用大量硬件资源。RTI模块通过多组独立的比较寄存器可以仅用1-2个基础计数器就衍生出4个甚至更多周期完全独立、精度极高的定时中断源硬件资源利用率极高。确定性延迟与低抖动在自动控制中定时任务的执行时机抖动Jitter是致命的。软件重装定时器必然引入微秒级的不确定性。RTI的硬件自动重载UDCPx彻底消除了这个抖动源使得中断产生的时刻完全由硬件时序决定达到了纳秒级的确定性。减轻CPU中断负载高频率的定时中断如用于软件PWM生成会严重消耗CPU性能。RTI可以将比较匹配事件直接关联到DMA通道。例如你可以设置一个1微秒的定时每次匹配触发DMA去搬运一个数据到DAC数模转换器生成波形或者从ADC模数转换器读取数据。整个过程无需CPU参与实现了“零开销”的硬件定时数据流。高可靠性系统监控普通的独立看门狗只能应对程序完全跑飞。而RTI集成的窗口看门狗能检测出更细微的故障比如某个任务执行过快或过慢导致系统时序紊乱但未完全死机。这对于功能安全ISO 26262要求下的系统是必不可少的。因此RTI模块的复杂性正是为了满足这些高端嵌入式应用对性能、精度和可靠性的极致追求。它不是为点亮一个LED而生的而是为控制汽车发动机喷油、工业机械臂轨迹、电网同步采样这些任务而设计的。2. 比较寄存器与自动重载机制深度解析RTI模块的定时功能核心在于比较寄存器对RTICOMPx和RTIUDCPxx0,1,2,3。我们以RTICOMP2和RTIUDCP2为例进行深入剖析。理解了这一对其他几组原理完全相同。2.1 RTICOMP2设定第一次“闹钟”RTICOMP2寄存器是一个32位可读写寄存器需在特权模式下写入复位值为0。它的功能非常直观存储一个需要与自由运行计数器RTIFRC0或RTIFRC1由比较控制逻辑选择进行比较的值。工作流程硬件持续将选定的自由运行计数器的当前值假设为RTIFRC0与RTICOMP2中存储的值进行比较。当RTIFRC0 RTICOMP2时发生“比较匹配”事件。此事件会立即将中断标志寄存器RTIINTFLAG中的INT2位置1表明有一个类型2的比较中断正等待处理。同时如果RTISETINTENA寄存器中的SETINT2位已被置1即中断已使能则该事件会向CPU核提交一个中断请求。此外如果RTISETINTENA中的SETDMA2位被使能此事件还会触发一个DMA请求。关键点比较匹配事件的发生不依赖于中断是否使能。只要数值匹配RTIINTFLAG中的标志位就会被置起。这允许软件采用“查询”模式或者在不使能中断的情况下利用该事件触发DMA。配置示例假设系统时钟RTICLK为100MHz我们希望创建一个周期为1ms的定时中断。首先需要计算第一次匹配点的计数值。时钟周期 T_clk 1 / 100MHz 10 ns。1ms需要的时钟周期数 N 1ms / 10ns 100,000。因此我们需要向RTICOMP2寄存器写入100,000十进制即0x186A0。// 假设RTIFRC0作为基准计数器且已配置为在RTICLK下递增 RTICOMP2 100000; // 设置第一次比较匹配点在1ms后2.2 RTIUDCP2实现“自动重装”的魔法如果只有RTICOMP2那么每次匹配后你需要在中斷服務程序ISR中手动计算并写入下一个比较值这既麻烦又可能引入延迟。RTIUDCP2寄存器的存在就是为了解决这个问题。RTIUDCP2也是一个32位寄存器它存储了一个“增量”值。其魔法发生在比较匹配事件发生的那一个时钟周期当RTIFRC0与RTICOMP2匹配时硬件在置起中断标志的同时会自动执行一个操作RTICOMP2 RTICOMP2 RTIUDCP2。这个加法操作是硬件原子操作瞬间完成。之后计数器RTIFRC0继续递增。当RTIFRC0增长到等于新的RTICOMP2值时下一次匹配事件发生循环往复。这样一来只要初始化时设置好RTICOMP2第一次触发点和RTIUDCP2周期增量就能产生一个周期绝对稳定、无需软件干预的定时中断流。接上例我们要维持1ms的周期中断那么RTIUDCP2的值就应该等于一个周期对应的计数值即100,000。RTICOMP2 100000; // 第一次中断在1ms后发生 RTIUDCP2 100000; // 之后每1ms触发一次中断 // 使能COMP2中断 RTISETINTENA | (1 2); // 设置SETINT2位为1实操心得与陷阱计数器溢出处理RTIFRC0和RTICOMP2都是32位寄存器最大值为0xFFFFFFFF。当RTICOMP2 RTIUDCP2的结果超过32位最大值时会发生溢出结果会回绕到0。这在计算超长周期定时时要特别注意。例如在100MHz下32位计数器最多计时约42.9秒0xFFFFFFFF * 10 ns。如果需要更长的周期需要使用计数器溢出中断OVL0INT来扩展。初始相位控制RTICOMP2的初始值决定了第一次中断的“相位”。如果你想在系统启动后延迟一段时间再开始周期性中断可以将RTICOMP2设为一个较大的值。RTIUDCP2只影响第一次匹配之后的周期。动态修改周期你可以在运行时修改RTIUDCP2的值来改变中断周期。但要注意修改操作最好在中断服务程序中进行并且要考虑到当前计数器值避免出现“错过”或“重复”匹配的情况。一种安全的方法是先读取当前RTIFRC0值计算出新的RTICOMP2值 当前值 新周期然后同时更新RTICOMP2和RTIUDCP2。3. 中断管理框架的实操与精要RTI提供了精细而灵活的中断管理机制主要由三个寄存器协同完成RTISETINTENA,RTICLEARINTENA, 和RTIINTFLAG。很多开发者容易混淆它们的用法下面我们彻底理清。3.1 使能与禁用RTISETINTENA和RTICLEARINTENA这是一对“镜像”寄存器专为安全、无竞态地操作中断使能位而设计。RTISETINTENA(置位中断使能寄存器)向这个寄存器的某个位写1会将对应的中断使能位置1而写0则没有任何效果。读操作返回的是当前中断使能位的状态。例如RTISETINTENA | (1 2);这条语句执行后INT2比较2中断的使能位一定会被置1无论它之前是什么状态。你不需要先读取整个寄存器避免了“读-修改-写”过程中的风险。RTICLEARINTENA(清零中断使能寄存器)向这个寄存器的某个位写1会将对应的中断使能位置0而写0则没有任何效果。读操作返回的也是当前中断使能位的状态。例如RTICLEARINTENA | (1 2);这条语句执行后INT2的中断使能位一定会被清0。为什么需要这样设计在实时操作系统中中断使能位可能被多个任务或中断服务程序访问。如果使用传统的“读-修改-写”方式如REG | BIT;在“读”和“写”之间如果发生高优先级中断并修改了同一个寄存器那么低优先级任务修改的值可能会覆盖高优先级的修改导致错误。SET和CLEAR寄存器通过提供原子操作彻底杜绝了这种竞态条件。标准操作流程// 1. 使能COMP2中断和其DMA请求 RTISETINTENA | (1 2) | (1 10); // SETINT2和SETDMA2 // 2. 在某个任务或初始化中需要禁用COMP2中断但可能保留DMA请求 RTICLEARINTENA | (1 2); // 仅清除中断使能DMA使能位不变 // 3. 再次使能 RTISETINTENA | (1 2);3.2 状态与清除RTIINTFLAG(中断标志寄存器)这个寄存器反映了事件是否发生与中断是否使能无关。只要比较匹配或计数器溢出事件发生对应的标志位就会被硬件自动置1。位特性该寄存器的标志位是“写1清除”W1C。这意味着要清除一个挂起的中断标志你必须向该位写入1。写入0无效。读取读操作返回当前标志位的状态。1表示有中断事件挂起0表示没有。中断服务程序ISR中的标准操作进入ISR后第一件事就是读取该寄存器以判断中断源虽然可以通过向量表但读取此寄存器是更通用的做法然后立即向对应的位写1以清除标志避免同一中断被重复响应。// 假设这是RTI的整体中断服务例程 void RTI_ISR(void) { uint32_t flags RTIINTFLAG; // 读取当前所有标志位 if (flags (1 2)) { // 检查是否是COMP2中断 // 处理COMP2相关任务... RTIINTFLAG (1 2); // 关键写1清除INT2标志位 } if (flags (1 18)) { // 检查是否是RTIFRC1溢出中断 // 处理计数器溢出可用于扩展定时周期... RTIINTFLAG (1 18); // 清除OVL1INT标志位 } // ... 检查其他中断源 }严重注意事项RTIINTFLAG的清除操作也必须在特权模式下进行。在非特权模式下写入是无效的。这通常意味着你的中断服务程序需要运行在特权模式或者需要通过系统调用SYS/SVC来清除标志。这是嵌入式系统安全设计的一部分防止用户态代码随意清除中断标志破坏系统时序。4. 看门狗子系统配置与故障诊断实战RTI模块集成了两种看门狗数字看门狗DWD和数字窗口看门狗DWWD。它们是系统最后的“保险丝”。4.1 数字看门狗DWD配置步骤DWD是一个简单的递减计数器需要定期“喂狗”以防止其超时复位。配置预加载值RTIDWDPRLD必须在使能DWD之前进行这个12位的值决定了看门狗的超时时间。计算公式t_exp (DWDPRLD 1) * 2^13 / RTICLK1。举例若RTICLK1为100MHz希望超时时间为100ms。计算所需计数周期N t_exp * RTICLK1 / 2^13 0.1s * 100e6 Hz / 8192 ≈ 1220.7。DWDPRLD N - 1 ≈ 1219(0x4C3)。写入RTIDWDPRLD 0x4C3;使能DWDRTIDWDCTRL这是一个“一次性”操作。向该寄存器写入特定的密钥值0xA98559DA来使能DWD计数器。RTIDWDCTRL 0xA98559DA; // 使能数字看门狗重要一旦使能除非发生系统复位或电源复位否则无法通过软件禁用。任何其他写入操作都会被阻塞。这确保了看门狗一旦启动就无法被意外或恶意关闭。定期服务喂狗通过向RTIWDKEY寄存器写入正确的密钥序列来重置DWD递减计数器。正确序列先写0xE51A再写0xA35C。两次写入必须成对出现且顺序不能错。任何其他值或误的序列都会立即触发复位或NMI。// 喂狗函数 void Feed_DWD(void) { RTIWDKEY 0xE51A; RTIWDKEY 0xA35C; // 必须紧接着写中间不能有长时间延迟 }警告RTIWDKEY的写入需要3个VCLK周期才能生效。在编写喂狗代码时必须确保这两条写指令连续执行中间不能被长时间的中断或任务切换打断否则可能导致密钥序列无效而触发复位。通常将喂狗操作放在最高优先级任务或中断中。4.2 数字窗口看门狗DWWD高级应用DWWD比DWD更严格它定义了一个“喂狗时间窗口”。你不仅要在超时前喂狗还不能喂得太早。配置窗口大小RTIWWDSIZECTRL决定窗口相对于整个超时周期的比例。0x00000005: 100% (等同于普通DWD无窗口限制)。0x00000050: 50% (必须在后50%的时间窗口内喂狗)。0x00000500: 25% (必须在后25%的时间窗口内喂狗)。0x00005000: 12.5%。0x00050000: 6.25%。其他值: 3.125%。选择根据任务的最短执行周期来选择。例如如果监控的任务周期非常稳定可以选择较小的窗口如12.5%以提高对时序偏差的敏感度。配置违规反应RTIWWDRXNCTRL决定当喂狗违规太早、太晚或不喂时触发何种反应。0x5: 触发系统复位。0xA: 触发不可屏蔽中断NMI。这允许系统在复位前尝试记录错误或执行紧急保存操作。选择对于要求高可用性的系统可以先配置为NMI在NMI服务程序中尝试修复或保存关键数据然后再触发软复位。对于安全性第一的系统直接配置为复位更简单可靠。服务DWWD喂狗序列与DWD完全相同使用RTIWDKEY寄存器。但必须确保喂狗操作发生在“窗口打开”之后超时之前。4.3 看门狗状态诊断与调试技巧系统复位后如何知道是不是看门狗导致的RTIWDSTATUS寄存器就是你的“侦探”。DWD_ST(位1)如果为1表示DWD超时导致了复位/NMI。KEY_ST(位2)如果为1表示向RTIWDKEY写入了错误的密钥或序列。START_TIME_VIOL(位3)和END_TIME_VIOL(位4)用于DWWD。START_TIME_VIOL1表示喂狗过早在窗口打开前END_TIME_VIOL1表示喂狗过晚或未喂超时。DWWD_ST(位5)DWWD总状态位任何窗口违规都会置位。上电初始化时的诊断流程void System_Init(void) { uint32_t wd_status RTIWDSTATUS; if (wd_status (1 5)) { // DWWD违规 if (wd_status (1 3)) { log_error(DWWD Start Time Violation! Fed too early.); } if (wd_status (1 4)) { log_error(DWWD End Time Violation! Fed too late or not fed.); } // 清除状态标志否则NMI会持续断言 RTIWDSTATUS (1 5); // 写1清除DWWD_ST位这会连带清除其他状态位 } else if (wd_status (1 1)) { // DWD超时 log_error(DWD Timeout! System was not fed in time.); RTIWDSTATUS (1 1); // 清除DWD_ST位 } else if (wd_status (1 2)) { // 密钥错误 log_error(Watchdog Key Error! Incorrect sequence written.); RTIWDSTATUS (1 2); // 清除KEY_ST位 } else { log_info(Normal power-on or external reset.); } // ... 其他初始化代码 // 最后重新配置并启用看门狗 Configure_And_Enable_Watchdog(); }这个诊断流程能帮助你在开发阶段快速定位系统不稳定的根源——究竟是主循环卡死、任务调度出问题还是喂狗逻辑有bug。5. 高级功能自动清除中断与DMA联动对于需要极高效率或完全确定性响应的应用RTI提供了“自动清除中断标志”和“直接触发DMA”的高级功能。5.1 自动清除中断使能RTIINTCLRENABLE与RTICMPxCLR在某些场景下比如用RTI中断来触发一个非常高频、执行时间极短的任务进出中断服务程序的上下文保存/恢复开销变得不可忽视。或者当你将比较事件用于触发DMA时可能希望完全不用CPU参与中断处理。这时可以使用自动清除功能。工作原理除了主要的比较寄存器RTICOMPx还有一组对应的清除比较寄存器RTICMPxCLR。你需要设置RTICMPxCLR的初始值这个值必须大于RTICOMPx的初始值但小于RTICOMPx RTIUDCPx即下一个周期点。当RTIINTCLRENABLE寄存器中对应的INTCLRENABLE位被使能写入非5h的值时硬件逻辑生效。当自由运行计数器与RTICOMPx匹配时触发中断/DMA事件。随后当自由运行计数器增长到与RTICMPxCLR匹配时硬件自动清除RTIINTFLAG寄存器中对应的中断标志位INTx并且自动将RTIUDCPx的值加到RTICMPxCLR上为下一次清除做准备。效果中断标志被硬件自动清除软件的中断服务程序可能根本不会被调用如果你不使能CPU中断的话或者即使调用也发现标志位已是0。这实现了“后台静默”的定时事件生成。配置示例设置COMP2在匹配时触发DMA并在匹配后一段固定时间自动清除标志。// 目标RTICLK100MHz, 主周期1ms匹配后100us自动清除标志。 uint32_t period_ticks 100000; // 1ms uint32_t clear_delay_ticks 10000; // 100us RTICOMP2 period_ticks; // 第一次匹配在1ms RTIUDCP2 period_ticks; // 周期1ms RTICMP2CLR period_ticks clear_delay_ticks; // 在匹配后100us清除标志 // 使能COMP2的自动清除功能 RTIINTCLRENABLE (0xA 16); // 给INTCLRENABLE2字段写入0xA非5h即启用 // 使能COMP2的DMA请求但不使能CPU中断 RTISETINTENA | (1 10); // SETDMA2 // RTICLEARINTENA | (1 2); // 如果需要可明确禁用CPU中断这样每1ms会触发一次DMA请求并在1.1ms时硬件自动清除中断标志周而复始CPU零干预。5.2 DMA请求的配置与应用RTI的比较事件可以直接触发DMA传输这是实现高效数据搬运的关键。使能DMA请求通过RTISETINTENA寄存器中的SETDMAx位x0,1,2,3来使能对应比较通道的DMA请求。配置DMA控制器在微控制器的DMA控制器模块中需要将RTI的对应事件如RTI_COMP2配置为DMA传输的触发源。联动场景举例ADC定期采样设置一个1us的RTI比较中断触发DMA。DMA的源地址指向ADC结果寄存器目标地址指向一个环形缓冲区。这样ADC以1Msps的速率采样数据被DMA自动搬运到内存完全不需要CPU参与。DAC波形生成在内存中预存一个正弦波表。设置RTI比较中断触发DMADMA的源地址指向波形表目标地址指向DAC数据寄存器。通过调整RTI的比较周期可以精确控制输出波形的频率。数据块传输将RTIUDCPx设为0RTICOMPx设为一个很大的值。在需要启动一次DMA传输时通过软件修改RTICOMPx为当前计数器值1使其立即匹配触发一次DMA。传输完成后在DMA完成中断中再禁用该请求。这实现了由软件事件触发的单次DMA。注意事项DMA请求的使能和清除与中断标志是独立的但共享同一个比较事件。即使你禁用了CPU中断INTxDMA请求仍然可以在事件发生时被触发。同样使用RTICMPxCLR自动清除中断标志也不会影响DMA请求的生成。DMA请求通常需要在其专用的DMA标志寄存器中清除。6. 常见问题排查与实战避坑指南在实际项目中使用RTI模块难免会遇到各种问题。下面是我在多年项目中总结的一些典型故障和排查思路。6.1 中断不触发或触发一次后停止现象配置好后中断一次都不触发或者只触发了一次就再也不触发了。排查步骤检查时钟源确认RTICLK和RTICLK1的时钟是否已使能且运行在预期频率。这是最常见的问题根源。使用示波器或通过翻转GPIO来验证计数器是否在递增。验证计数器选择检查全局控制寄存器或比较控制寄存器确认你操作的RTICOMPx是与RTIFRC0还是RTIFRC1进行比较。弄错了计数器比较永远不会匹配。检查RTIUDCPx寄存器如果只触发一次很可能是RTIUDCPx被错误地设置为0。当第一次匹配发生后RTICOMPx的值没有增加计数器永远无法再次追上它。确保RTIUDCPx被设置为一个大于0的有效周期值。检查中断嵌套与优先级如果系统中存在更高优先级且长时间阻塞的中断可能导致RTI中断被持续推迟甚至丢失。检查中断控制器如NVIC中的优先级设置。检查中断标志清除在中断服务程序中是否正确地写1清除了RTIINTFLAG中对应的位如果忘记清除该中断标志会一直为1后续的中断请求可能被硬件屏蔽。特权模式访问确保所有对RTICOMPx,RTIUDCPx,RTISET/CLEARINTENA,RTIINTFLAG写操作的访问都是在CPU特权模式下进行的。用户模式下的写入会被忽略且不会产生错误异常极易被忽略。6.2 看门狗意外复位系统现象系统运行一段时间后莫名复位RTIWDSTATUS显示看门狗超时或密钥错误。排查步骤确认喂狗时机在喂狗函数Feed_DWD()前后添加GPIO翻转代码用逻辑分析仪观察喂狗脉冲的间隔。是否大于RTIDWDPRLD计算出的超时时间检查喂狗序列确认写入RTIWDKEY的序列绝对是0xE51Afollowed by0xA35C。检查代码中是否有其他地方如其他任务、库函数误写了此寄存器。检查VCLK延迟RTIWDKEY写入需要3个VCLK周期。如果你的喂狗两条指令之间插入了其他操作哪怕是一条NOP在极高的VCLK频率下可能没问题但如果VCLK较慢或被分频可能导致序列无效。确保两次写入是紧邻的。任务阻塞分析如果喂狗操作在某个低优先级任务中检查是否有更高优先级任务或中断长时间关闭全局中断__disable_irq()导致低优先级任务无法运行从而无法及时喂狗。DWWD窗口违规如果使用了窗口看门狗检查喂狗时间是否落在规定的窗口内。这需要精确计算任务的最坏执行时间WCET。可能因为任务执行时间波动有时过早进入了喂狗函数。6.3 定时周期不准确或出现漂移现象中断周期用示波器测量发现不稳定或随时间有累积误差。排查步骤时钟源精度首先排除硬件问题。RTICLK的时钟源通常是PLL输出或外部晶振本身的精度和稳定性如何用频率计测量基准时钟。软件重装误差确保你使用的是RTIUDCPx硬件自动重载而不是在中断服务程序里手动重装RTICOMPx。手动重装必然引入由中断响应延迟和指令执行时间带来的抖动。中断响应延迟即使使用硬件重载中断服务程序开始执行的时刻相对中断事件也有延迟。如果对绝对时间戳要求极高应该在ISR一开始就读取一个自由运行的硬件计时器如RTIFRC0本身来获取精确的事件发生时刻而不是依赖进入ISR的软件时间。计数器溢出如果你的定时周期很长接近或超过32位计数器的最大范围约42.9秒 100MHz需要处理溢出。例如设置周期为50秒。你需要利用计数器溢出中断OVLxINT来扩展。在OVL0INT的中断里维护一个软件计数器如ovl0_counter。在比较中断里判断的不再是硬件计数器值而是(ovl0_counter 32) RTIFRC0这个扩展后的64位值。6.4 DMA传输与中断的协同问题现象使能了RTI触发DMA但DMA不传输或者传输一次后停止。排查步骤DMA触发源映射在芯片的数据手册或TRM中找到RTI比较事件对应的具体DMA触发线编号例如RTI_COMP2可能映射到DMA_REQ_MUX的Line 14。确保DMA通道的触发源配置正确。DMA通道使能与配置确认DMA通道本身已使能并配置为外设到内存或内存到外设模式地址递增、传输数据大小等参数正确。DMA与中断使能位RTISETINTENA中的SETDMAx位只是允许RTI模块产生DMA请求信号。DMA通道自身还有一个“使能”位通常叫CH_EN或CHCTRL.ENABLE也必须置1通道才会响应请求。DMA传输完成中断如果DMA配置为单次Burst模式传输完指定数据量后会自动停止。你需要在其传输完成中断中重新使能DMA通道或者将DMA配置为自动重载Ping-Pong模式以实现连续传输。资源冲突检查是否有其他外设或软件正在使用同一个DMA通道。