S12X有两内核CPUXGATE。这两个核的中断由一个统一的中断控制器来配置。配置的内容包括中断交给哪个核(CPU or XGATE)处理,以及中断的优先级。

 

每个中断源都要有一个中断配置寄存器。然而这样需要很大的寄存器空间。如S12XEP100117个中断源,就需要117个中断配置寄存器的空间。为节省空间,将这些寄存器进行分组,每8个一组。对中断配置寄存器进行寻址时,首先选择相应的组号,然后选择该组中对应的寄存器。INT_CFADDR的高4位就是组号,低4位常为0;在一组中的8个寄存器用数组INT_CFDATA_ARR[8]来表示。

那么,对于特定中断源的中断配置寄存器,它到底在哪一组中的哪一个呢?规则是:中断向量的高4位就是组号,中断向量的位3到位1(注意不包括位0)就是在那组中的元素位置。


以例子来说明。
step1: SCI0
的中断向量为0xD6,所以将其高4位写到INT_CFADDR的高4位:
INT_CFADDR= (vec_adr) & 0xF0;
step2: SCI0
中断向量的位3到位13=(0xD6&0x0F)>>1,所以选择数组INT_CFDATA_ARR[8]中的第3个元素:
INT_CFDATA_ARR[((vec_adr)&0x0F)>>1]=??;


这样就解决了中断配置寄存器的寻址问题。那么又该写什么内容呢?规则是:
1)
中断配置寄存器的位7表示中断提交给那个核(CPU or XGATE),缺省为0表示所有的中断缺省交给CPU,写1就将该中断指派给XGATE
2)
中断配置寄存器的位2到位0表示中断的优先级(70)。缺省为优先级1。如果写0表示将该中断禁止。


在例子中,是希望将SCI0的中断交给XGATE处理,其优先级为1。所以,接上面的step2: 这里的??就等于0x01


CodeWarrior
中巧妙地定义了一个宏,方便用户对中断的配置。
具体到本例:ROUTE_INTERRUPT(SCI0_VEC, 0x01); 实质上就是:
step1
INT_CFADDR=0xD0;
step2: INT_CFDATA_ARR[3]=0x01;