英飞凌TC3xx_IR

目录

1.功能概述

2.具体功能描述

2.1 SRN_SRC

2.2 ICU(Interrupt Control Unit)

2.3 GPSR

2.4 仲裁机制

2.5 CPU对于中断请求操作

2.6 中断向量表

3.代码解析


1.功能概述

        IR(Interrupt Router)将外部、内部和软件触发的中断分配给CPU或者DMA;在英飞凌中,中断触发方叫做Service requests,CPU和DMA叫做Service Provide;

        每一个中断都和一个特定的服务请求节点(Serivice Request Node\SRN)关联,这与ARM、瑞萨自研的核有一些不同。

        中断请求与SRN关联,每个SRN可以通过ICU将路由给CPU或者DMA;

        根据芯片手册,TC3xx支持1024个中断请求,优先级0-255,数字越大优先级越高;详细细节具体如下:

英飞凌TC3xx_IR_第1张图片         除了SRN之外,每个CPU有8个通用服务请求(Genearl Purpose Service Requests)(GPSR),可以用作软件中断(不分配给外围设备或外部中断),使用SRB(Service Request Broadcast registers)可以将软中断同时路由给多个Service Providers。

        SRN包含一个SRC(Service Request Control Register),用于配置中断请求:优先级,分发给某个CPU或者DMA;每个SRN都和所有ICU关联,ICU会处理中断优先级仲裁。

2.具体功能描述

2.1 SRN_SRC

        本节,我们主要讨论SRN最关键的寄存器SRC。每个SRC的格式都相同,如下:

英飞凌TC3xx_IR_第2张图片

SRPN -- Service Request Priority Number,相同service provider中该请求的优先级,0--FF

SRE -- Service Request Enable

TOS -- Type of service,将该服务请求路由给目标provider,000 -- 111分别对应 CPU0\DMA\CPU1\2\3\4\5

        从芯片手册可以看到,SRC共有1024个,对应1024个中断源配置, 意味着我们在配置中断时,首先需要找到的就是对应SRC,例如现想配置CAN0的一个发送中断,那么对应的SRC如下:

英飞凌TC3xx_IR_第3张图片

 

         那么就要对该寄存器进行配置,代码如下:

SRC_CAN_CAN0_INT0.SRPN = 10; //该请求的优先级
SRC_CAN_CAN0_INT0.TOS = 0;//路由给CPU0处理

2.2 ICU(Interrupt Control Unit)

        每个service provider都对应一个ICU模块。ICU主要作用为

  •  对路由到相同provider的中断请求进行仲裁,并将竞争胜利的中断请求发给provider
  • 接收provider的中断请求接收信号
  • 检查中断请求的ECC
  • 路由完整性错误给SMU
  • 管理已知中断请求的清理

每个ICU比较核心寄存器如下:

只读:LWSR(Lastest Winning Service Request)和LASR(Last Acknowledged service request)

读写:ECR

LWSR:上次仲裁胜者请求的信息,提供给provider 

英飞凌TC3xx_IR_第4张图片

LASR:被provider确认的最近一个中断请求

英飞凌TC3xx_IR_第5张图片

 ECR:Error Capture Register

英飞凌TC3xx_IR_第6张图片

2.3 GPSR

        GPSR仅用于软件中断,因为他们没有和任何硬件中断触发事件挂钩,其内部结构如下:

英飞凌TC3xx_IR_第7张图片

        其用法是通过给SPB(Service Request Boradcast)写入1到对应位,可以同时将中断请求分发给SRC_GPSR,然后配置GPSR.TOS就可以实现将软中断路由给不同provider。

2.4 仲裁机制

        英飞凌TC3xx_IR_第8张图片

         ICU通过SPRN来决定并发的中断请求优先级,然后将胜者作为PIPN(Pending Interrupt Priority Number)和触发源一同发给CPU或者DMA,CPU拿到后通过和CCPN(Current CPU Priority Number)比较,最终决定接收优先级高的中断请求,CPU把接收的中断信息返回给ICU,ICU清除请求中断源

2.5 CPU对于中断请求操作

         CPU通过ICU interrupt Control Register(ICR)来控制中断请求,其结构如下:

英飞凌TC3xx_IR_第9张图片

英飞凌TC3xx_IR_第10张图片

        当CPU接收中断请求后,需要如下动作:

  • 保存当前task的上文;
  • 将当前PC保存到A[11](return address)
  • 如果当前处理器之前没有使用中断栈(PSW.IS = 0),A[10](SP)指向ISP(Interrupt stack pointer),然后设置PSW.IS = 1
  • 此时I.O模式切换到supervisor模式
  • 清除当前调用深度:
  • 关闭全局中断 ICR.IE = 0
  • 将ICR.CCPN保存至PCXI.PCPN,将ICR.PIPN保存至ICR.CCPN
  • 访问ISR的中断向量表

        当完成中断处理时,硬件自动恢复上下文,PCXI.PCPN写入ICR.CCPN,PCXI.PIR写入ICR.IE

2.6 中断向量表

         中断向量表是由多个ISR入口点组成的一个数组,存放在内存中;

        当CPU接收中断后,会根据ICP.PIPN计算当前中断的地址,该地址会加载至PC;CPU从该地址开始执行指令,根据中断函数的代码量,确定是跳转到内存其他位置还是就在表中进行处理。

        BIV(Base of interrupt vector table)存储这中断向量表的基地址,中断向量按照优先级顺序排布,在使能中断时,使用MTCR指令可以修改BIV;因此可以通过修改BIV来管理多个中断向量表;

        中断函数地址计算如下: 

英飞凌TC3xx_IR_第11张图片

英飞凌TC3xx_IR_第12张图片

3.代码解析

         中断entry地址存放在一个数组中,其软件写法有如下几种模式:

  1. void (*isr_pointer_arr[256])(void)
  2. void (**isr)(void) = isr_pointer_arr
  3. void irqInstall(long int SRNprio, long int addr){*isr_pointer_arr[SRNprio] = addr}
  4. isr [__mfcr(ICR&0xFF)]{} 
  5. IFX_INTERRUPT(GPT12_T4_Int0_Handler, 0, ISR_PRIORITY_GPT12_T4_INT)

你可能感兴趣的:(TC3xx分析,汽车,mcu)