各位专家好:
我想用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;
其它地方比如中断向量表,中断服务函数,中断使能我都写了,且能保证这部分都是正确的,但是实际运行无法产生中断,不知道我上面的理解以及操作是否正确,请各位专家多多指导。谢谢
图片贴不上来,具体请看附件吧