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使能全局中断。

  • 感谢您的回复。

    1. 我用的芯片是6748。 timer12对应的event id 是4, 我把它映射到了INT12.

     2. IER, INTMUX, CSR.GIE我都配了。否则不可能出现有规律的每10秒一次的INT12的中断。

    我的问题是:

         在cpu timer的event及其对应中断(INT12)能正常产生的情况下,为何按文档上描述的方法,手工设置EVTSET的值,却不能触发INT12, 实际情况是IFR的第12bit没有变化。

    非常期待您的解答。