This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于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;

 

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

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

 

 

问题.doc