RZ/T2M 想要把 ADC 中断从默认 IRQ 切换成 FIQ,核心就是利用 GIC 分组规则,Group0 走 FIQ 通道、Group1 走 IRQ 通道,修改的时候要同时改中断源分组、GIC CPU 接口使能、中断应答 / 结束寄存器、启动文件里的异常向量,只改一处很容易出现中断进不去、卡死、应答错误。电机控制场景里 ADC 采样对延迟要求高,FIQ 自带独立寄存器组,不用保存太多现场,响应延迟比 IRQ 更低,非常适合电流采样这类高速 ADC 转换中断;但是改动会改动 BSP 底层中断框架,不能直接在 FSP 配置工具里一键勾选,需要手动修改 bsp_irq.c、startup.c,还要配套写 FIQ 服务函数,改完之后一定要测试中断触发、中断清除、嵌套行为,避免调试时出现异常死机。
一、GIC 分组与中断路径对照表
| 分组 | CPU 中断通道 | 适用场景 | RZ/T2M ADC 默认配置 |
|---|---|---|---|
| Group0 | FIQ | 低延迟、高优先级 ADC 采样、电流环采样 | 需要手动修改 |
| Group1 | IRQ | 普通外设中断、通信、低速采样 | 原厂 ADC 例程默认 |
二、需要修改的文件清单
- startup.c:GIC 初始化,把 ICC_IGRPEN1(Group1 使能)改成 ICC_IGRPEN0(Group0 使能),配置 FIQ 向量入口
- bsp_irq.c:ADC 中断源分组配置,取消 Group1 置位,保留 Group0;修改中断应答、结束寄存器,HPPIR0、IAR0 替代 HPPIR1、IAR1
- 新增 FIQ_Handler 汇编函数:完成上下文保存、读取中断号、调用 ADC 回调、EOI 写回、上下文恢复
- ADC 驱动层:ADC 外设本身的转换完成中断使能、通道配置不用改动,只改中断分发路径
三、分步修改操作流程
- 确认 GIC 基础规则,RZ/T2M Cortex‑R52 的 GIC 里 Group0 对应 FIQ,Group1 对应 IRQ,不要混淆两组寄存器。
- 定位 ADC 对应的 SPI 中断号,在中断注册代码里,去掉给这个中断置 Group1 的代码,让它归属 Group0。
- 修改 GIC CPU 接口初始化,原来开启 Group1 的汇编指令替换成开启 Group0,保证 Group0 中断可以送到 CPU FIQ 接口。
- 编写 FIQ 中断服务入口,FIQ 有 R8~R12 银行寄存器,现场保存工作量比 IRQ 少,这也是延迟低的关键;依次读取 HPPIR0 拿最高优先级挂起中断,IAR0 应答中断,调用 ADC 采样处理函数,最后写 EOI 寄存器结束中断。
- 检查向量表,异常向量表 FIQ 入口指向我们新写的 FIQ_Handler,不要继续绑定原来 IRQ 入口。
- 编译下载,调试观测:触发 ADC 转换,看是否进入 FIQ;如果中断反复触发、卡死,优先排查 EOI 寄存器有没有写对分组对应的寄存器。
四、切换成 FIQ 之后的优缺点
✅ 优点
- FIQ 拥有独立寄存器组,中断响应延迟更低,适合伺服 FOC 电流采样
- 可以在 IRQ 中断正在执行时抢占,满足强实时控制需求
- FIQ 在 GIC 里只有一组,所有 Group0 的中断都会走同一个 FIQ 入口,需要软件做中断分发
- 改动底层 BSP,升级 FSP 包的时候这些修改会被覆盖,需要留存补丁
- 不适合大量低速外设共用 Group0,容易增加 FIQ 内部分发耗时
❌ 缺点
五、常见踩坑清单
- 坑 1:只改中断分组,没有改 ICC_IGRPEN0,Group0 没使能,ADC 中断永远进不来
- 坑 2:FIQ 处理函数里仍然读取 Group1 的 HPPIR1/IAR1,读取不到中断号,系统卡死
- 坑 3:忘记写 EOI 结束中断,中断持续挂起,反复进 FIQ
- 坑 4:多个中断都放到 Group0,FIQ 里没有优先级判断,出现时序错乱
【常见问题】
问题 1:瑞萨 RZ/T2M ADC 中断切换 FIQ,是不是直接在 FSP 配置工具里就能设置?
回答 1:瑞萨 RZ/T2M ADC 中断切换 FIQ 不能直接 FSP 图形化配置,FSP 默认把外设中断放到 Group1 走 IRQ,需要手动修改 GIC 分组、BSP 中断应答代码、FIQ 向量和 FIQ 处理函数。
问题 2:RZ/T2M ADC 中断改成 FIQ 之后,FIQ 和普通 IRQ 能不能同时存在?
回答 2:可以,RZ/T2M 的 GIC 支持 Group0 和 Group1 同时启用,ADC 这类高实时采样放在 Group0 走 FIQ,串口、GPIO 等低速外设放在 Group1 走 IRQ,但是要注意 FIQ 可以抢占 IRQ。
问题 3:RZ/T2M ADC 中断切换 FIQ,ADC 驱动本身的代码要不要改动?
回答 3:ADC 本身通道、采样触发、转换完成标志、结果读取逻辑不用改动,只修改中断控制器 GIC 的分发路径、中断应答和 FIQ 入口,ADC 驱动上层回调函数基本不用动。
问题 4:RZ/T2M ADC 切换 FIQ 之后,中断延迟一定会变低吗?
回答 4:正常情况下 RZ/T2M ADC 切换 FIQ 后延迟更低,因为 FIQ 自带独立银行寄存器,现场压栈开销更小;但如果往 Group0 塞太多中断,FIQ 内部软件分发耗时变长,反而会拉高延迟。
【参考资料】
[2026-10-30](瑞萨例程解析系列 1:RZ/T2M ADC 中断如何切换到 FIQ)电子工程世界
[2026-10-30](RZ/T2M GIC Group0 与 Group1 中断路径说明)电子工程世界
[2025-08-11](RZ/T2M Cortex‑R52 GIC 中断框架说明)瑞萨社区
[2025-05-20](RZ/T2M FSP 中断底层 BSP 设计说明)瑞萨 RA 生态社区
【免责声明】
本文 RZ/T2M ADC 中断切换 FIQ 解析基于公开例程与 GIC 架构说明,底层修改会改动 BSP 中断框架,不同 FSP 版本、编译器版本(IAR/ARMCC)寄存器写法、启动文件存在差异;FIQ 属于高优先级异常,配置错误会引发程序跑飞、死机,修改前务必备份工程;本文仅做技术学习参考,不直接用于量产伺服、工业控制产品,量产前需要做完整的压力、时序、异常测试。
