您的位置首页 >科技要闻 >

瑞萨 RZ/T2M ADC 中断改 FIQ 实操解析

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 默认配置
Group0FIQ低延迟、高优先级 ADC 采样、电流环采样需要手动修改
Group1IRQ普通外设中断、通信、低速采样原厂 ADC 例程默认

二、需要修改的文件清单

  1. startup.c:GIC 初始化,把 ICC_IGRPEN1(Group1 使能)改成 ICC_IGRPEN0(Group0 使能),配置 FIQ 向量入口
  2. bsp_irq.c:ADC 中断源分组配置,取消 Group1 置位,保留 Group0;修改中断应答、结束寄存器,HPPIR0、IAR0 替代 HPPIR1、IAR1
  3. 新增 FIQ_Handler 汇编函数:完成上下文保存、读取中断号、调用 ADC 回调、EOI 写回、上下文恢复
  4. ADC 驱动层:ADC 外设本身的转换完成中断使能、通道配置不用改动,只改中断分发路径

三、分步修改操作流程

  1. 确认 GIC 基础规则,RZ/T2M Cortex‑R52 的 GIC 里 Group0 对应 FIQ,Group1 对应 IRQ,不要混淆两组寄存器。
  2. 定位 ADC 对应的 SPI 中断号,在中断注册代码里,去掉给这个中断置 Group1 的代码,让它归属 Group0。
  3. 修改 GIC CPU 接口初始化,原来开启 Group1 的汇编指令替换成开启 Group0,保证 Group0 中断可以送到 CPU FIQ 接口。
  4. 编写 FIQ 中断服务入口,FIQ 有 R8~R12 银行寄存器,现场保存工作量比 IRQ 少,这也是延迟低的关键;依次读取 HPPIR0 拿最高优先级挂起中断,IAR0 应答中断,调用 ADC 采样处理函数,最后写 EOI 寄存器结束中断。
  5. 检查向量表,异常向量表 FIQ 入口指向我们新写的 FIQ_Handler,不要继续绑定原来 IRQ 入口。
  6. 编译下载,调试观测:触发 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 属于高优先级异常,配置错误会引发程序跑飞、死机,修改前务必备份工程;本文仅做技术学习参考,不直接用于量产伺服、工业控制产品,量产前需要做完整的压力、时序、异常测试。

今日大家都在搜的词: