标题:
[原创]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