我想手动触发中断,中断事件为20,EVTSET0的地址为0x01800020,我使用如下代码 *(volatile Uint32 *)(0x01800020) |= 0x00100000;但是我发现程序跑完这条语句后地址0x01800020的值并没有变化,但是自己去查看EVTFLAG0 的值是发现时00100000,可是为什么没有触发中断呢,方法不对吗?
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.
我想手动触发中断,中断事件为20,EVTSET0的地址为0x01800020,我使用如下代码 *(volatile Uint32 *)(0x01800020) |= 0x00100000;但是我发现程序跑完这条语句后地址0x01800020的值并没有变化,但是自己去查看EVTFLAG0 的值是发现时00100000,可是为什么没有触发中断呢,方法不对吗?
如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
我也碰到了类似的问题,相关的文档描述的都很含糊。
我用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,说明写入操作也被执行了。
请帮忙解答,非常感谢。
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使能全局中断。