各位专家好!
我将C6678自带的EDMA程序修改成事件触发以后,在线仿真的时候程序运行到下面这个循环处以后就一直在这个循环里循环,请问是什么原因呢?这个循环语句是参考程序自带的不是我添加的,我用手动触发的时候,人为的给定了一个数组作为源数据时,程序可以实现数据搬移,但改为事件触发以后,由于需要由外部事件自动触发,且从外设读数据,所以在线仿真的时候是没有源数据的,而且EDMA也没有启动,但这个时候就出现了上面提到的问题。另外,参考程序里给的这个循环语句有什么作用呢?非常感谢!
/* Poll on IPR bit 0*/
do {
CSL_edma3GetHwStatus(hModule,CSL_EDMA3_QUERY_INTRPEND,®ionIntr);
} while (!(regionIntr.intr & 0x1));
此外,程序里还有下面这个语句,这个两个循环放在一起有什么作用?谢谢!
/* Poll on IPR bit 2 */
do {
CSL_edma3GetHwStatus(hModule,CSL_EDMA3_QUERY_INTRPEND,®ionIntr);
} while (!(regionIntr.intr & 0x2));
Hong Lan:
1. 看起来循环是反复查询有没有中断,如果有中断,则再去查是不是EDMA事件引起的。
2. 看你的描述,很可能是你的外部事件没有发生,所以没有EDMA触发,因此也没有EDMA结束,因此也不产生结束中断事件。所以就一直查询不到中断。
andy lee1:
回复 Hong Lan:
Hong Lan
你好!我有下面两个问题想请教:
1. 第一个循环里面为什么是查询intr的第0位?这一位对应的是什么中断?这个第0位表示的是中断挂起寄存器IPR的第0位吗?另外regionIntr结构体中的intr和intrh表示的是什么中断?
2. 第二个循环查询的intr的第2位对应的又是什么中断?是传输完成中断吗?
Andy Yin1:
回复 andy lee1:
您好,
每个bit位对应一个EDMA Channel,完成数据搬运后,相应的bit位会置位。至于为何先查询bit0然后bit2,取决于程序中EDMA channel的设计使用。请对照EDMA手册相关寄存器的说明以及代码进行理解,谢谢