首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[原创]XGATE中INT_CFADDR和INT_CFDATA寄存器的用法??

[原创]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 */

飞思卡尔带我走进神奇的单片机世界
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;

希望您已经理解了其用法。确实需要很仔细读手册才能明白。
You're really a XGATE expert!
海纳百川  有容乃大
感谢TristoneGao的详细解答,高手!!
飞思卡尔带我走进神奇的单片机世界
返回列表