AURIX TC2XX 学习笔记(3) 中断路由器(IR)


1.模块简介

中断是单片机的一种功能,它允许单片机在执行程序的过程中,对外部或内部事件做出快速响应。当一个中断事件发生时,单片机会暂停当前的任务,转而去执行一个特定的中断服务程序,这个程序是预先定义好的,用来处理这个中断事件。处理完毕后,单片机会返回到中断发生前的任务继续执行。

这种机制非常像日常生活中的“优先级”处理:当你正在做某件事情时,如果出现了更紧急的事情,你会先去处理那个紧急的事情,然后再回来继续你之前的事情。中断机制使得单片机能够高效地处理多任务,确保关键任务得到及时执行。

TC27x中的中断系统在中断路由器模块中实现,将硬件中断源和CPU、DMA进行灵活的连接,并且有着稳定可靠高效的硬件上下文保存机制,具有较高的中断实时性。该模块包括服务请求节点(SRNs)、中断控制单元(ICUs)和用于软件开发支持的附加功能。

2.功能介绍

 

2.1中断路由器及其组成部分

中断路由器是单片机中的一个重要组件,它的主要作用是管理各种中断请求,确保它们能够被CPU或DMA(直接内存访问)模块正确处理。下面是一些模块简单的解释:

中断路由器(IR):它就像是一个交通指挥员,负责把来自不同地方的中断请求(比如外部设备、单片机内部或软件产生的请求)引导到CPU或DMA。

服务请求节点(SRNs):每个可以产生中断的模块都连接到中断路由器的一个或多个服务请求节点上。你可以把它们想象成不同的“请求点”,每个点都有一个控制寄存器(SRC),用来设置这个请求的配置。

中断控制单元(ICU):这些单元是中断路由器的一部分,它们负责处理来自SRN的中断请求。ICU会根据SRN控制寄存器中的设置来决定哪个请求应该被优先处理。

服务请求处理器(CPU/DMA):每个ICU都连接到一个处理器,这个处理器可能是CPU或DMA。ICU会把处理好的中断请求发送给这个处理器,由它来执行相应的中断服务程序。

每个SRN都连接到中断路由模块中的所有ICU,其中SRN控制寄存器设置定义了目标服务提供者和服务请求的优先级。每个ICU处理SRN请求的中断仲裁,每个ICU连接到一个服务请求处理器(CPU/DMA)。

2.2 模块特点

•中断系统支持最多512/1024个服务请求

•每个ICU/服务处理器最多支持255个服务请求优先级(一个CPU最多可以映射255个服务请求)

•每个CPU和DMA模块都有专用ICU

•独立于其他ICU的ICU服务请求仲裁

•低延迟仲裁(从收到服务请求到将其发送到服务处理器只需三/四个时钟周期)

•每个服务请求都有一个专用的服务请求节点(SRN)

•每个SRN可以映射到一个已实现的ICU /服务处理器

•具有过滤模式和触发模式的外部中断(例如下降沿,上升沿,高电平或低电平)。模式可以在运行期间配置

2.3 服务请求节点(SRN)

中断路由器模块内的每个服务请求节点(SRN)都包含一个服务请求控制(SRC)寄存器和接口逻辑,这些接口逻辑将其连接到中断路由器模块外部的触发单元和中断路由器内部的中断仲裁总线。

中断路由器模块中的所有服务请求控制寄存器都具有相同的格式。一般来说,这些寄存器包含:启用/禁用信息、服务请求设置位和服务请求清除位、服务请求优先级向量(8位)、服务处理器目的地、服务请求状态位、软件发起的服务请求设置和复位位、完整性错误向安全监控单元(SMU)发出信号、中断粘着位和溢出位。

2.3.1服务请求控制寄存器(SRC)

默认情况下,所有服务请求节点都是禁用的。要使用服务请求节点,必须通过设置SRC来配置和启用它。通过软件写入“1”操作。服务请求节点可以根据中断服务处理目标(SRC.TOS)和服务请求优先级(SRC.SRPN)进行配置。

请求设置和清除位(SETR, CLRR)——SETR和CLRR位允许软件设置或清除业务请求位SRR。(将1写入SETR会使位SRR被置为1、CLRR上写1会将位SRR清零、SETR和CLRR同时写1,不改变SRR、写入SETR或CLRR的值不被存储、对这些位写0没有影响、这些位在读取时总是返回0)。

使能位(SRE)——如果SRE=1,则将挂起的服务请求传递给指定的服务提供者进行中断仲裁。当中断服务提供程序确认服务请求时,硬件会自动将SRR位设置为0。如果SRE = 0,则挂起的服务请求不会传递给服务请求处理器。软件可以轮询SRR位来检查服务请求是否处于挂起状态。为了确认服务请求,SRR位必须由软件通过向CLRR写入1来重置。

服务请求标志(SRR)——设置SRR标志时,表示服务请求处于挂起状态。它可以通过硬件直接设置或复位,也可以通过使用SETR和CLRR位的软件间接设置或复位。通过软件直接写入这个位没有效果。

服务类型控制(TOS)——TOS位字段用于选择服务请求必须转发到哪个可用的中断服务处理器,例如CPU和DMA模块。

服务请求优先级号(SRPN)——8位的服务请求优先级号(SRPN)表示服务请求相对于从同一服务处理器请求服务的其他来源的优先级,以及服务处理器本身的优先级。

服务处理器是一个CPU:ISR通过位于每个CPU中的中断向量表与服务请求优先级编号相关联。这意味着CPU中断向量表是按优先级编号排序的。这与传统的中断CPU架构不同,在传统的中断CPU架构中,它们的中断向量表是由中断源排序的。CPU中断向量表允许单个外设为不同目的具有多个优先级。对于CPU来说,0000H的SRPN值属于特殊值,不能用于映射到该CPU上的业务请求。

服务处理器是DMA:完整SRPN号用于仲裁DMA模块的业务请求。在模块中,DMA通道与服务请求相关联。

ECC错误纠正码(ECC)在以下情况下,SRN将更新ECC位字段:

•写或读-修改-写到SRC[31:0]

•写到SRC[15:0](16位写)

•写到SRC[15:8]或写到SRC[7:0](字节写)

2.4中断控制单元(ICU)

每个ICU与一个中断服务处理器相关。SRN可以通过SRNS RCx映射到其中一个ICU。

ICU主要实现以下功能:

1.管理来自SRN映射到ICU的竞争性服务请求之间的仲裁

2.向CPU/DMA提供仲裁回合获胜的服务请求

3.从中断服务处理器处接收服务请求被接受的信息

4.检查已接受的服务请求信息(ECC校验)

5.向安全监控单元(SMU)发送信号完整性错误

6.管理相关SRN中已确认的服务请求的清除

2.4.1 ICU控制寄存器(ICU Control Registers)

每个ICU包括两个控制寄存器:

•最新获胜服务请求寄存器(LWSR):提供关于最后一轮服务请求仲裁的获胜者的信息。

•最后确认的服务请求寄存器(LASR):提供关于中断服务处理器接受的最后一个服务请求的信息。

2.4.2 错误捕获寄存器(ECR)

当ICU检测到ECC错误时,错误捕获寄存器会捕获最后确认的服务请求(LASR)寄存器的内容。ECR总是显示检测到ECC错误的最后一个ECR内容。软件可以通过写入ECR来清除ECR的内容。错误状态(STAT)和错误溢出(EOV)位可用作错误处理机制,并指示错误信息丢失。

 2.5 中断仲裁机制

中断模块中的每个ICU都有自己的中断总线。每个服务请求节点(SRN)可以通过SRC映射到一个中断服务处理器。TOS位字段设置到相关的ICU。

中断路由器负责管理中断请求,确保它们按优先级顺序被处理。当一个中断服务请求发生时,中断总线会启动一个仲裁过程来决定哪个请求最重要。这个过程会一直重复,直到没有挂起的服务请求为止。在TC27x微控制器中,仲裁过程很快,只需要三个系统外设总线时钟周期就能确定哪个服务请求具有最高的优先级。服务请求节点(SRN)的优先级通过一个特殊的字段(SRPN)来标识。

在仲裁过程中,中断总线会比较所有挂起请求的优先级,然后选出优先级最高的请求。赢得仲裁的服务请求会被中断控制单元(ICU)识别出来,并且它的信息(包括SRPN、错误校正码ECC和服务请求节点的索引)会提供给CPU或DMA等服务处理器。

一旦服务c处理器处理完请求并发送确认,ICU会进行错误校正码(ECC)检查,确保传输的信息是正确的。这个过程保证了中断请求能够高效、准确地被处理。在目前的实现中,ECC码仅用于错误检测。检测到的错误将报告给SMU,但不进行纠正。

2.5.1 每个仲裁过程中的时钟周期数

中断路由器的实现可以根据以下数量进行配置:

•支持的服务请求(服务请求节点,SRN,最多1024)

•支持的服务提供商(中断控制单元,ICUs)

•每个业务请求仲裁的时钟周期(3 SPB时钟周期)

上图显示了具有3个周期仲裁的中断路由器实现的中断时间。

周期1:ICU没有待处理的服务请求(因此没有仲裁轮)。

周期2:一个模块通过向相关模块发送脉冲来触发服务请求中断路由器模块中的SRN。

周期3-5:对所有待处理的ICU服务请求进行仲裁。

周期6:ICU向服务提供者(SRPN、ECC、SRN)提供获胜的服务请求。

周期7:当来自另一个SRN的新服务请求处于挂起状态时,ICU重新仲裁,如果有具有更高SRPN号(更高优先级)的新挂起服务请求,则向ICU提供新的获胜服务请求。

周期n-1:中断服务提供者获取最新获胜的SRN的信息。

周期n:业务处理器确认服务请求(提供SRPN、ECC、SRN)已确认服务请求的索引信息。ICU将信号改为ICU同一时钟周期内“没有有效的服务请求可用”。

周期n+1:ICU对确认信息(SRPN、ECC、SRN)进行ECC校验,SRE='1',ICU的TOS号。如果不匹配->完整性错误信号到SMU/SRPN、ECC和Index在ECR中被捕获。

周期n+2: ICU选择确认的SRN(由SRN索引选择)。选中的SRN检查已确认的SRPN和ECC与自己的SRC SRPN/ECC值(如果没有)。

2.6 外部中断

四个srn (Int_SCUSRC[3:0])被保留来处理外部中断。能够产生中断请求的外部GPIO端口输入信号(边缘/电平触发,门控等)的设置在外部请求单元(ERU)中进行控制。

2.7 中断向量表

当一个中断被TriCore接受时,中断向量表的入口地址由中断向量表的基本指针TriCore寄存器BIV和该中断的优先级数(PIPN)计算。中断向量表是一块特殊的内存区域,其中包含了指向中断服务程序(ISR)的指针。当一个中断事件发生时,微控制器的程序计数器会被设置为对应中断向量表中相应中断向量的地址,从而跳转到相应的ISR执行中断处理。

中断向量表通常位于非易失性内存(NVM)中的某个固定位置,以便在系统启动时加载。中断向量表的结构和大小可能会根据不同的TC2xx系列微控制器型号有所不同,但它们通常包括以下类型的中断向量:

•复位向量:当系统复位时,微控制器首先执行的代码地址。

•通用中断向量:包括各种外设中断,如定时器、通信接口(如CAN、LIN)、模数转换器(ADC)等。

•安全中断向量:在一些TC2xx系列微控制器中,可能还会有专门用于安全关键功能的中断向量。

3.代码实现

STM定时中断代码实现,使用系统定时器0触发中断任务完成对LED小灯电平的翻转。

#include "STM_Interrupt.h"
#include "Bsp.h"
#include "IfxPort.h"
#include "IfxStm.h"

#define ISR_PRIORITY_STM 128 /* 中断服务请求优先级 */
#define TIMER_INT_TIME 1000 /* 中断间隔时间--ms */

#define LED &MODULE_P22,0 /* 中断服务程序(ISR)中LED电平翻转 */
#define STM &MODULE_STM0  /* 使用STM0*/

IfxStm_CompareConfig g_STMConf; /* STM配置结构体 */
Ifx_TickTime g_ticksFor_ms;

/* IFX_INTERRUPT(isr, vectabNum, priority)
* - isr: ISR函数名称
* - vectabNum: 中断向量表号
* - priority: 中断优先级
*/
IFX_INTERRUPT(isrSTM, 0, ISR_PRIORITY_STM);

/*****************************************************************************************************
* @projectName: void isrSTM(void)
* @introduction: STM中断服务程序
* @parameter: void
* @return: void
* @author: Unicorn
* @date: 2024/6/20
* @version: 1.0
*****************************************************************************************************/
void isrSTM(void)
{
/*更新比较寄存器值,将触发下一个中断和翻转LED*/
IfxStm_increaseCompare(STM, g_STMConf.comparator, (uint32)g_ticksFor_ms);

IfxPort_setPinState(LED, IfxPort_State_toggled);
}

/* Function to initialize the LED */
/*****************************************************************************************************
* @projectName: void initLED(void)
* @introduction: 初始化LED引脚
* @parameter: void
* @return: void
* @author: Unicorn
* @date: 2024/6/20
* @version: 1.0
*****************************************************************************************************/
void initLED(void)
{
IfxPort_setPinMode(LED, IfxPort_Mode_outputPushPullGeneral);
IfxPort_setPinState(LED, IfxPort_State_high);
}

/*****************************************************************************************************
* @projectName: void initSTM(void)
* @introduction: 初始化STM模块
* @parameter: void
* @return: void
* @author: Unicorn
* @date: 2024/6/20
* @version: 1.0
*****************************************************************************************************/
void initSTM(void)
{
IfxStm_initCompareConfig(&g_STMConf); /* 使用默认值初始化配置结构 */

g_STMConf.triggerPriority = ISR_PRIORITY_STM; /* 设置中断的优先级 */
g_STMConf.typeOfService = IfxSrc_Tos_cpu0; /* 设置中断服务提供者 */
g_STMConf.ticks = (uint32)g_ticksFor_ms; /* 设置计时器触发值 */

IfxStm_initCompare(STM, &g_STMConf); /* 使用用户配置初始化STM */
}

/*****************************************************************************************************
* @projectName: void initPeripherals(void)
* @introduction: 函数初始化所使用的所有外设和变量
* @parameter: void
* @return: void
* @author: Unicorn
* @date: 2024/6/20
* @version: 1.0
*****************************************************************************************************/
void initPeripherals(void)
{
/* 初始化时间常数 */
g_ticksFor_ms = IfxStm_getTicksFromMilliseconds(BSP_DEFAULT_TIMER, TIMER_INT_TIME);

initLED();
initSTM();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值