Board logo

标题: [原创]XGATE中INT_CFADDR和INT_CFDATA寄存器的用法?? [打印本页]

作者: yjbmtc    时间: 2008-2-29 09:51     标题: [原创]XGATE中INT_CFADDR和INT_CFDATA寄存器的用法??

版主,我在学习坛子上的XGATE程序时遇到以下的代码,是讲INT_CFADDR和INT_CFDATA寄存器的用法的,我看了手册了,可是不能理解这两个寄存器的用法,请大家给点拨一下吧,谢谢!!
#define SCI0_VEC 0xD6 /* vector address= $xxD6 */

#define ROUTE_INTERRUPT(vec_adr, cfdata) \
INT_CFADDR= (vec_adr) & 0xF0; \
INT_CFDATA_ARR[((vec_adr) & 0x0F) >> 1]= (cfdata);

ROUTE_INTERRUPT(SCI0_VEC, 0x81); /* RQST=1 and PRIO=1 */


作者: TristoneGao    时间: 2008-2-29 13:45

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

级。您的例子是将SCI0的中断交给XGATE处理, 其优先级为1。

于是每个中断源都要有一个中断配置寄存器。然而这样需要很大的寄存器空间。如S12XEP100有117个中断源,就需要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到位1是3=(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表示中断的优先级(7~0)。缺省为优先级1。如果写0表示将该中断禁止。

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

CodeWarrior中巧妙地定义了一个宏,方便用户对中断的配置。

具体到本例:ROUTE_INTERRUPT(SCI0_VEC, 0x81); 实质上就是:
step1:INT_CFADDR=0xD0;
step2: INT_CFDATA_ARR[3]=0x81;

希望您已经理解了其用法。确实需要很仔细读手册才能明白。
作者: strongchen    时间: 2008-2-29 15:12

You're really a XGATE expert!
作者: yjbmtc    时间: 2008-3-3 08:48

感谢TristoneGao的详细解答,高手!!




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0