各位大哥遇到个问题,真是想不通啊!
使用VDSP,用仿真器仿真。
很简单的程序就是一个MDMA传输,可是程序仿真到Init_Interrupts中断初始化好后
就ivg13就一直运行中断报务程序N次(停不下来)。
本以为会是Ivg13中的定时看门狗在做怪,可以在VDSP的寄存器查看器没有发现,定时看门狗中断状态,定时看门狗是关闭的
让人郁闷的是发现中断来源是MDMA_S0和MDMA_D0。问题是我在中断初始化之前都没有配置过MDMA,更离谱的是我在Init_Interrupts中断初始化程序还对*pMDMA_S0_CONFIG,MDMA_D0_CONFIG,做了清0;
Init_Interrupts中断初始化程序中每一句的CONFIG如下,
运行语句 MDMA_S0_CONFIG MDMA_D0_CONFIG
进入Init_Interrupts前 0X81 0x83
*pMDMA_S0_CONFIG=0; 0X00 0X83
*pMDMA_D0_CONFIG=0; 0X00 0X00
*pMDMA_S0_IRQ_STATUS = 0x1; 0X00 0X00
*pMDMA_D0_IRQ_STATUS = 0x1; 0X00 0X00
register_handler(ik_ivg13, MDMA_PPI_ISR); 0X81 0x83
*pSIC_IMASK|=(1<<21); 0X81 0x83
运行完后,CPU进入中断程序,一直不停运行中断程序 ,看了下的MDMA_S0_IRQ_STATUS和
MDMA_D0_IRQ_STATUS的状态,其中的DMA传输完全完成中断位为1。
本人在中断服务程序,2个中断源的清0工作。
我基本想了一下,会不会是我的仿真器问题的啊,仿真时,在使用DMA资源,
想想也不太可能,这样的仿真器也是太垃圾了吧。本人使用的仿真器为英培特的BLACKFIN dsp 仿真器,
想想人家英培特好逮也是国内有名的ARM开发案的供应商,不可能这么垃圾吧。
不过其他也不太可能,我在仿真过程自己的程序没有动过MDMA任何东西。可它偏偏会自己置会。想不懂啊
程序如下:
main(VOID)
{
Init_PLL();
Init_EBIU();
Init_SDRAM();
Init_Interrupts();
Init_DMA_To_DMA2();
WHILE(1);
}
void Init_Interrupts(void)
{
*pMDMA_S0_CONFIG=0;
*pMDMA_D0_CONFIG=0;
*pMDMA_S0_IRQ_STATUS = 0x1;
*pMDMA_D0_IRQ_STATUS = 0x1;
register_handler(ik_ivg13, MDMA_PPI_ISR);
*pSIC_IMASK|=(1<<21);
}
EX_INTERRUPT_HANDLER(MDMA_PPI_ISR) // <--|declaration in exception.h -->
{ // |declaration
with _pragma(interrupt) the ISR Startaddress
*pMDMA_S0_IRQ_STATUS = 0x1;
*pMDMA_D0_IRQ_STATUS = 0x1;
printf( "\nThe MDMA PPI Interrupt has been entered!\n" );
}//end DMA0_PPI_ISR
void Init_DMA_To_DMA2(void)
{ *pMDMA_D0_START_ADDR = 0x140000;
*pMDMA_D0_X_COUNT = 720/2;
*pMDMA_D0_X_MODIFY = 4;
*pMDMA_D0_Y_COUNT = 288;
*pMDMA_D0_Y_MODIFY = 720*2+4;
*pMDMA_S0_START_ADDR = 0x00000;
*pMDMA_S0_X_COUNT = 720/2;
*pMDMA_S0_X_MODIFY = 4;
*pMDMA_S0_Y_COUNT = 288;
*pMDMA_S0_Y_MODIFY = 4;
*pMDMA_S0_CONFIG = DMAEN | WDSIZE_32| DMA2D | RESTART;// | DI_EN;
*pMDMA_D0_CONFIG = DMAEN | DI_EN | WNR | WDSIZE_32 | DMA2D | RESTART | DI_EN;
}//end Init_DMA