4. RH850中断控制器(INTC)配置与故障排查

RH850的中断系统由INTC统一管理,它把来自外设(CAN、LIN、ADC、定时器、GPIO等)的中断请求,按照优先级和屏蔽状态,路由到CPU的异常处理入口。理解INTC,核心要抓住三件事:中断向量表如何定位服务程序、优先级与屏蔽如何决定谁先被响应、嵌套与挂起如何影响响应时序。这三件事也是中断丢失、误触发、嵌套异常等故障的根源。

一、中断向量表与入口定位

RH850采用固定入口加向量表的方式。CPU响应中断后,会跳转到该中断对应的向量地址,再从向量表中取出真正的处理函数入口。以RH850/F1x系列为例,中断向量表通常位于代码起始区域,每个中断源占用固定字节数(如4字节或8字节,取决于芯片和编译器约定)。向量表项的内容就是ISR(中断服务程序)的入口地址。

调试时最常见的错误是向量号与中断源对不上。例如把CAN0的接收中断向量号写成了CAN0发送中断的向量号,结果数据一到达就跳进了错误的处理函数。排查方法是:先查芯片手册的“Interrupt Vector Table”章节,确认每个外设中断对应的向量号;再对照启动文件(如startup.asm或链接脚本)中向量表的排列顺序,确认第N项确实对应第N号向量。如果使用瑞萨的Smart Configurator或CS+生成代码,向量表通常由工具自动生成,此时要检查工具配置界面里每个中断的“Vector Number”是否与手册一致。

二、优先级设置与屏蔽

RH850的每个中断源都有一个可编程优先级(通常为0~15或0~31,具体取决于芯片)。数值越大,优先级越高。CPU内部有一个当前优先级寄存器(如PSW中的优先级字段),当某个中断被响应后,CPU会把当前优先级提升到该中断的级别,从而屏蔽掉优先级不高于它的中断。这就是优先级屏蔽的基本机制。

优先级配置的典型故障是高优先级中断被低优先级中断阻塞。比如ADC转换完成中断优先级设为5,而定时器中断优先级设为10,如果定时器中断正在执行且没有及时退出,ADC中断就会被挂起,直到定时器ISR结束。如果定时器ISR里还有长循环,ADC数据就可能丢失。排查时可以用仿真器查看INTC的优先级寄存器(如ICxxx寄存器)和CPU的当前优先级状态,确认是否发生了优先级反转或长时间屏蔽。

另一个常见问题是中断屏蔽寄存器(IMR)未正确清除。有些外设在初始化时会默认屏蔽中断,需要在配置阶段显式使能。如果忘记使能,中断永远不会触发,表现为“外设工作正常但ISR不执行”。

三、中断嵌套与响应时序

中断嵌套是指高优先级中断可以打断正在执行的低优先级ISR。RH850默认支持嵌套,但需要满足两个条件:一是新中断的优先级高于CPU当前优先级;二是全局中断使能位(如PSW.ID)处于允许状态。在ISR入口,通常需要先保存现场,再根据需求决定是否提前开中断。如果ISR执行时间很短,可以不开嵌套;如果ISR中有耗时操作,则应尽早开中断,让更高优先级的中断能够及时响应。

嵌套带来的典型故障是栈溢出。每次中断嵌套都会压栈,如果嵌套层数过深或ISR栈空间不足,就会破坏其他数据。排查时可以在仿真器中观察SP寄存器的变化,或者用栈使用分析工具估算最坏情况下的栈深度。

四、中断丢失与误触发的调试方法

中断丢失通常有三种原因:中断被屏蔽、中断标志未清除导致重复触发被忽略、中断响应太慢导致硬件请求被覆盖。调试时,先在INTC寄存器中查看对应中断的请求标志位(如ICxxx.IR)是否置位。如果置位但ISR没执行,说明被屏蔽或优先级不够;如果标志位没置位,说明外设根本没产生中断,问题在外设配置。

误触发则往往是中断标志清除时机不对。例如在ISR开头就清标志,但实际数据还没读完,外设又立刻置位,导致连续进入ISR。正确的做法通常是在ISR中先处理数据,再清标志;或者确认外设的清除机制是“读清除”还是“写清除”。

使用仿真器跟踪中断响应过程时,可以在INTC的请求寄存器、CPU的PSW、以及ISR入口处设置断点或观察点。以CS+或e2 studio为例,可以打开“Interrupt”视图,实时查看每个中断的请求状态、优先级和屏蔽状态。单步执行时,注意观察从外设置位到CPU跳转之间的延迟,以及ISR入口处栈指针的变化。

RH850 INTC 中断响应链路与故障排查点 外设中断源 CAN / ADC / Timer / GPIO 中断请求标志 ICxxx.IR 置位 INTC 中断控制器 优先级比较 (ICxxx.PR) 屏蔽控制 (IMR / PSW.ID) 向量号生成 CPU 响应 保存现场 (PSW / PC / SP) 跳转向量表取入口地址 执行 ISR 中断向量表 向量号 N → 入口地址 位于代码起始区域 ISR 执行 处理数据 → 清中断标志 返回 → 恢复现场 常见故障点与排查方向 向量号错配 → 查手册向量表与启动文件 优先级反转 → 查 ICxxx.PR 与 PSW 当前优先级 中断丢失 → 查 IR 标志、IMR 屏蔽位、响应延迟 误触发 → 查标志清除时机(读清除/写清除) 仿真器观察点 IR / PR / PSW / SP

五、用仿真器跟踪中断响应的实操要点

以CS+配合E1/E2仿真器为例,跟踪中断响应的典型操作如下:

  1. 在INTC的请求寄存器(如ICxxx)上设置“读/写”观察点,当外设置位中断请求时,仿真器会暂停。
  2. 在ISR入口设置断点,观察从请求置位到断点命中之间的指令周期数,判断响应延迟是否在预期范围内。
  3. 打开CPU寄存器窗口,查看PSW中的优先级字段和ID位,确认中断是否被正确屏蔽或使能。
  4. 在ISR中单步执行,观察栈指针SP的变化,确认压栈和出栈是否平衡。
  5. 如果怀疑中断丢失,可以在INTC的挂起寄存器中查看是否有请求被挂起但未响应。
在调试中断嵌套时,建议先在ISR入口处不加任何延时,直接开中断,观察高优先级中断能否及时打断。如果发现嵌套没有发生,优先检查PSW.ID是否被清除,以及新中断的优先级是否确实高于当前优先级。
清除中断标志的时机非常关键。对于“读清除”类型的外设,读取数据寄存器就会自动清标志;对于“写清除”类型,需要向特定寄存器写1。如果清标志过早,外设可能再次置位,导致ISR重复进入;如果清标志过晚,可能丢失下一次中断。务必对照外设手册确认清除机制。

总结来说,RH850 INTC的调试可以归纳为一条主线:先确认中断请求是否到达INTC,再确认INTC是否放行,最后确认CPU是否正确跳转并执行ISR。沿着这条链路,用仿真器逐级观察寄存器状态,绝大多数中断丢失、误触发和嵌套异常都能定位到具体的配置或时序问题。