4. 中断系统与事件链接控制器ELC

在RA系列MCU中,中断系统与事件链接控制器(ELC)是两条并行但互补的“外设响应通路”。中断通路依赖CPU:外设产生中断请求,经ICU(Interrupt Controller Unit)汇聚与筛选后送入NVIC,由NVIC按优先级裁决,CPU跳转执行ISR。事件通路则绕过CPU:外设事件经ELC直接路由到另一个外设的触发输入端,由硬件自动启动目标外设。理解这两条通路的差异,是设计低CPU占用、确定性响应系统的前提。

NVIC中断优先级:抢占与子优先级的裁决规则

Cortex-M内核的NVIC为每个中断分配一个8位优先级字段,RA实际实现中通常使用高4位,因此可用优先级为0~15,数值越小优先级越高。这4位又被拆成“抢占优先级”和“子优先级”两部分,拆分位置由PRIGROUP决定。抢占优先级决定能否打断正在执行的ISR,子优先级只在多个中断同时挂起、抢占级相同时决定谁先被响应,不能实现嵌套打断。

举例说明:设PRIGROUP使2位为抢占、2位为子优先级。若把ADC扫描结束中断设为抢占1、子优先级0,把按键中断设为抢占2、子优先级3,则按键ISR执行期间,ADC中断可以抢占它;反之若两者抢占级相同,则先到先服务,后到者必须等前者返回。配置时需注意:优先级分组一旦设定,会影响所有中断的相对关系,应在系统初始化早期统一确定,避免运行中反复修改。

RA的ICU在NVIC之外还提供了若干增强能力:可为每个中断设置独立的中断向量号、使能/禁止、以及数字滤波。对于机械按键这类带抖动的输入,ICU的滤波功能可以在硬件层面抑制窄脉冲,减少误触发进入NVIC的概率。

ICU配置:从引脚到中断向量的完整链路

以RA6M5的IRQ引脚为例,一个外部中断从物理引脚到CPU响应,需要经过以下配置环节:

  1. 引脚功能选择:通过PmnPFS寄存器的PSEL字段,把目标引脚设为IRQ功能,并配置上拉/下拉、驱动能力。
  2. IRQ通道映射:在ICU的IRQCRn寄存器中选择该IRQ通道的触发边沿——上升沿、下降沿或双边沿。按键按下通常选下降沿,若需要检测释放则选双边沿。
  3. 数字滤波:IRQCRn的FCLKSEL与FLTEN位可开启滤波,选择采样时钟分频,滤除短于设定宽度的毛刺。
  4. NVIC使能:调用R_ICU_ExternalIrqOpen()与R_ICU_ExternalIrqEnable(),FSP会自动写入NVIC的ISER寄存器并使能对应向量。
  5. 优先级设置:通过R_ICU_ExternalIrqOpen()的ipl参数指定抢占优先级,FSP写入NVIC_IPR寄存器。

完成上述配置后,按键按下时IRQ引脚产生边沿,ICU将其转换为中断请求,NVIC按优先级裁决,CPU进入回调函数。这条链路每一步都依赖CPU参与,若按键频繁或ISR内做ADC启动、数据搬运,CPU负载会明显上升。

ELC事件路由:让外设直接对话

ELC的核心思想是“事件源→事件目标”的硬件直连。RA的ELC支持数十种事件源(如IRQ、GPT溢出、ADC转换结束、DTC传输完成等)和多种事件目标(如ADC启动、GPT计数启动、DTC触发、端口输出等)。每个事件链接通过ELC的ELSRn寄存器配置:低8位选择事件源,高8位选择事件目标,再通过ELCR寄存器使能该链接。

与中断的关键区别在于:事件不经过NVIC,不产生异常向量,CPU不执行任何指令。事件到达目标外设后,目标外设按自身配置自动动作。例如,把IRQ0事件链接到ADC0的启动触发,则按键边沿到来时ADC0自动开始一次扫描转换,全程无需CPU介入。

ELC事件与中断可以并存:同一个IRQ既可以产生中断请求给NVIC,也可以同时作为ELC事件源。若不需要CPU处理,只需不使能该IRQ的NVIC通道,仅保留ELC链接即可。

零CPU干预链路:按键触发ADC采集的完整实现

下面以RA6M5为例,构建“按键按下→ADC自动采集→DTC搬运结果→标志置位”的链路。目标是在按键触发到数据就绪的整个过程中,CPU不执行任何ISR,仅在主循环中轮询完成标志。

第一步:配置ADC0。选择软件触发以外的触发源,在FSP的ADC属性中把Trigger设为“ELC”。扫描模式设为单次扫描,通道选择AN000(假设按键对应采集通道)。转换结果存放在ADC0.ADDR000寄存器。

第二步:配置DTC。DTC是RA的链式数据传输控制器,可由ELC事件触发。设置DTC传输源为ADC0.ADDR000,目标为内存数组adc_buf[n],传输长度为1,传输完成后产生DTC完成事件。

第三步:配置ELC链接。需要两条链接:

链接1:事件源 = IRQ0(按键下降沿)
       事件目标 = ADC0扫描启动
链接2:事件源 = ADC0转换结束
       事件目标 = DTC传输启动

在FSP中可通过R_ELC_Open()与R_ELC_LinkSet()完成,或直接在Smart Configurator的ELC页面添加两条链接。

第四步:配置IRQ0。IRQCR0设为下降沿触发,开启数字滤波,但不使能NVIC通道——即不调用R_ICU_ExternalIrqEnable(),或使能后不注册回调。这样IRQ0只作为ELC事件源存在。

第五步:主循环处理。DTC传输完成后可产生一个事件,链接到某个GPIO翻转或置位一个软件标志。主循环检测标志后读取adc_buf[0],清零标志,继续等待下一次按键。

按键触发ADC采集的ELC零CPU干预链路 按键 SW1 P105 / IRQ0 ICU / IRQ0 下降沿 + 数字滤波 ELC 事件路由 链接1: IRQ0 → ADC启动 链接2: ADC完成 → DTC ADC0 AN000 单次扫描 DTC ADDR000 → adc_buf 内存数组 adc_buf[0] 主循环 轮询完成标志 边沿 事件 触发 完成事件 搬运 读取 CPU参与情况: 按键→ADC启动→DTC搬运 全程由ELC硬件完成,CPU不执行任何ISR;仅在主循环中轮询标志并读取adc_buf[0]。

结果观察与验证方法

验证该链路是否真正实现零CPU干预,可从三个层面观察:

  • 断点验证:在IRQ0回调函数中设置断点,若按键按下后断点不命中,说明NVIC通道未使能,中断未进入CPU。
  • 寄存器观察:按键按下后读取ADC0.ADDR000,应看到转换结果更新;读取adc_buf[0],应看到DTC搬运后的值。两次读取之间无需任何CPU写操作。
  • 时序测量:用GPIO在ADC转换结束时翻转,示波器测量按键边沿到翻转的延迟。该延迟由ADC采样时间和ELC传播延迟决定,通常在微秒级,且不受CPU负载影响。
若发现按键后adc_buf[0]不更新,优先检查三处:ELC链接是否使能(ELCR对应位)、ADC触发源是否设为ELC而非软件、DTC是否已使能并正确配置传输源地址。任何一处遗漏都会导致链路断开。

该链路的工程价值在于:把“响应—采集—搬运”三个动作从CPU软件流程中剥离,交给ICU、ELC、ADC、DTC四个硬件模块协作完成。CPU只在需要处理数据时介入,适合按键唤醒采集、周期性传感器采样、低功耗待机下的突发事件记录等场景。掌握ELC事件路由的配置方法后,还可以把同一思路扩展到GPT触发ADC、ADC触发DTC、DTC触发GPT等更多组合,形成以事件为纽带的硬件自动化数据通路。