打印
[通用 MCU]

英飞凌TC3xx_IR

[复制链接]
124|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2024-5-17 08:32 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
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,数字越大优先级越高;详细细节具体如下:



         除了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的格式都相同,如下:



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如下:





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

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



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



ECR:Error Capture Register



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



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

2.4 仲裁机制

      

         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)来控制中断请求,其结构如下:





        当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来管理多个中断向量表;

        中断函数地址计算如下:





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

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



————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/djkeyzx/article/details/129924835

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1433

主题

14211

帖子

8

粉丝