我想手动触发中断,中断事件为20,EVTSET0的地址为0x01800020,我使用如下代码 *(volatile Uint32 *)(0x01800020) |= 0x00100000;但是我发现程序跑完这条语句后地址0x01800020的值并没有变化,但是自己去查看EVTFLAG0 的值是发现时00100000,可是为什么没有触发中断呢,方法不对吗?
Andy Yin1:
如C66x corepac user guide section9, EVTSET是write only register,对EVTFLAG的操作时通过EVTSET及EVTCLR寄存器,所以写EVTSET reg即对EVTFLG寄存器相应bit置位。
至于为何不产生中断,还需要确认Corepac的INTC中断控制器配置是否正确,需要配置INTMUX、IER使能中断、TSR使能全局中断。
STK中很多例程都有INTC的配置,如参考Robust例程中的Robust_intc.c 中的函数Robust_Interrupts_Init。
STK:http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/t/47664.aspx
Jerry Lee3:
回复 Andy Yin1:
我也碰到了类似的问题,相关的文档描述的都很含糊。
我用Timer( Event 4)产生中断,并把Event 4 映射到INT12。然后按相关技术文档描述的方法配置中断和Timer,每10秒一次触发。程序运行完全正常,每间隔10秒都会触发中断。
但无论我在什么地方给EVTSET0赋值为0x00000010(Event 4对应的bit),都不能触发中断,通过调试器看了EVTFLAG0和MEVTFLAG0的值确实都变为了0x00000010。
这里可以肯定2点:
1. 每10秒一次的触发中断,说明timer和中断的配置都没问题。
2. 在向EVTSET0写入0x00000010后,EVTFLAG0和MEVTFLAG0的值都变成了0x00000010,说明写入操作也被执行了。
请帮忙解答,非常感谢。
Andy Yin1:
回复 Jerry Lee3:
1 你用的是哪一款dsp?对于6670/6678 DSP,Timer interrupt event并非corepac的event4,如6678,Time0~7产生的事件一次对应core0~7的64及65,,具体参考6678 data manual interrup section table7-38;所以如果是6678的话,需要些EVTSET1对应的比特,并可以观测IFR中相应bit是否置位。
2 要产生中断,对于INTC需要配置system event与corepac内部INT4~15的映射关系,即配置寄存器INTMUx;同时还需配置corepac内部的IER使能相应的INT4~15中断,并置位CSR.GIE使能全局中断。
Jerry Lee3:
回复 Andy Yin1:
感谢您的回复。
1. 我用的芯片是6748。 timer12对应的event id 是4, 我把它映射到了INT12.
2. IER, INTMUX, CSR.GIE我都配了。否则不可能出现有规律的每10秒一次的INT12的中断。
我的问题是:
在cpu timer的event及其对应中断(INT12)能正常产生的情况下,为何按文档上描述的方法,手工设置EVTSET的值,却不能触发INT12, 实际情况是IFR的第12bit没有变化。
非常期待您的解答。