各位专家好:
我想用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这个例子就会明白。