TI中文支持网
TI专业的中文技术问题搜集分享网站

关于6678CIC中断的疑惑

各位专家好:

我想用6678片上自带的串口对core3产生串口中断,但是看芯片手册,串口中断事件属于CIC0和CIC1的Event Input(如下图1所示),这样就不能直接通过INTC来映射。看了CIC和INTC的芯片资料后,我是这么理解的:

串口中断属于外设产生的中断,外设产生的中断需要通过CIC模块映射到channel map,而channel map与host interrupt map一一对应,而host interrupt可以映射到INTC模块128个system event的某些事件上,比如事件21~31(如图2所示),62~63(如图3所示),92~95(如图4所示),102~109(如图5所示),比如UTXEVT事件号是150,我要把它映射到core3的int6,那么我只能选择图3所示的事件63,CIC0_OUT(3+8*n)=CIC0_OUT(27),其中n为3,对应core3,也就是说host interrupt的号为27,剩下的问题就是要在CIC中把事件150与host interrupt 27联系起来,下面是我写的代码:

//首先是CIC0相关寄存器的宏定义

#define DEVICE_CIC0_BASE      0x02600000

#define CIC0_REG_GBLENHINT 0x010

#define CIC0_REG_STATSETINDEX         0x020

#define CIC0_REG_SYSINTENINDEXSET              0x028

#define CIC0_REG_SYSINTENA(n)           (0x280+n*0x4)

#define CIC0_REG_CHMAP(n)                  (0x400+n*0x4)

#define CIC0_REG_HINTENINDEXSET    0x034

#define CIC0_REG_HINTENA(n)        (0x1500+n*0x4)

//然后是INTC的INTMUX0寄存器的宏定义

#define INTMUX1        0x01800140

//然后做CIC0的初始化工作

*(VUINT32 *)( DEVICE_CIC0_BASE+ CIC0_REG_GBLENHINT)=0x1;

*(VUINT32 *)( DEVICE_CIC0_BASE+ CIC0_REG_STATSETINDEX)=150;

*(VUINT32 *)( DEVICE_CIC0_BASE+ CIC0_REG_SYSINTENINDEXSET)=150;

*(VUINT32 *)( DEVICE_CIC0_BASE+ CIC0_REG_SYSINTENA(4))=0x1<<22;

*(VUINT32 *)( DEVICE_CIC0_BASE+ CIC0_REG_CHMAP(6))=|=0x96000000;

*(VUINT32 *)( DEVICE_CIC0_BASE+ CIC0_REG_HINTENINDEXSET)=0x1B;

*(VUINT32 *)( DEVICE_CIC0_BASE+ CIC0_REG_HINTENA(0))|=0x1<<27;

 

//然后将CIC0_OUT27(对应事件为63)映射到core3中断向量表的int6

*(VUINT32 *)(INTMUX)=0x003F0000;

 

其它地方比如中断向量表,中断服务函数,中断使能我都写了,且能保证这部分都是正确的,但是实际运行无法产生中断,不知道我上面的理解以及操作是否正确,请各位专家多多指导。谢谢

 图片贴不上来,具体请看附件吧

 

 

Allen35065:

你的INTMUX1地址不对,应该是0x01800104,请核对其它的寄存器地址和配置值

wentao hu:

回复 Allen35065:

Allen Yin,你好:

地址是我在往上写的时候抄错了,程序里面是对的,应该不是地址的问题

Allen35065:

回复 wentao hu:

如果确认地址无误,建议你检查各个节点的EVENT是否被置位,附件是INTC的一个例子,供参考。

wentao hu:

回复 Allen35065:

Allen Yin  你好:

cpintc_test.c文件我参考过,里面的步骤应该是:

CSL_CPINTC_mapSystemIntrToChannel (hnd, n, m);      //将系统中断n映射到通道m,对于我这个例子来说n就代表事件号为150的UTXEVT,m是对应的通道号,可以是从0~255的数

CSL_CPINTC_enableSysInterrupt (hnd, n);

CSL_CPINTC_enableHostInterrupt (hnd, m);

CSL_CPINTC_enableAllHostInterrupt(hnd);

我把这几个函数的具体实现都看过了,我的程序也是这么做的,可是仍然没有反应。

有一点不太明白,

    /* We now map Channel 0 to Host Interrupt 10 */    CSL_CPINTC_mapChannelToHostInterrupt (hnd, 0, 10);

对于上面的一行代码没法理解,CIC手册上说了channel与hostinterrupt是一一对应的,通道号n就对应第n个hostinterrupt,那为啥上面的代码还能设置呢?

wentao hu:

回复 Allen35065:

Allen Yin 你好:

我的问题已经解决了,流程没错,大意导致。按照你的说法又检查了一遍改了就没问题了,谢谢你了。

Armstrong:

回复 Allen35065:

Allen Yin

你可以先使用手动分步触发CPU interrupt,sysinterrupt,这样可以看出你哪一个部分设置有问题

Allen35065:

回复 Armstrong:

结合手册看看C:\ti\pdk_C6678_1_1_2_6\packages\ti\csl\example\cpintc这个例子就会明白。

赞(0)
未经允许不得转载:TI中文支持网 » 关于6678CIC中断的疑惑
分享到: 更多 (0)