TI中文支持网
TI专业的中文技术问题搜集分享网站

关于手动触发中断的方法

我想手动触发中断,中断事件为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没有变化。

非常期待您的解答。

赞(0)
未经允许不得转载:TI中文支持网 » 关于手动触发中断的方法
分享到: 更多 (0)